看了《Intellij IDEA中实现热部署》这篇博客后感触很深,在Java开发的过程选择一个适合自己的IDE是很重要的,每次修改代码都需要重新的编译、重启,如何解决这个问题?。看了一下网上的教程,其中Intellij IDEA是Java开发中公认的最好的IDE,拥有很好的代码提示功能,jetty相比于tomcat来说更加轻量级,对于静态资源具有很好的热加载的性能,JRebel能够监控class文件。因此我参考网上教程将这三个工具结合起来,完成静态资源修改、java代码修改后的热加载。
1.工具的安装
关于Intellij IDEA的安装网上有很多的教程,没有安装的小伙伴可以参考博客《IntelliJ IDEA(2017)安装和破解》。JRebel的安装和激活可以参考博客《IntelliJ IDEA 热部署插件 JRebel 安装激活及使用》。Jetty的安装使用Maven插件的形式在pom文件中进行配置,在后面的整合过程中详述。
2.工具的整合
不同的安装环境,pom文件的配置是不一样的。我的jdk版本为jdk1.7.0_72,IntelliJ IDEA版本为2017.3.1,jetty-maven-plugin的版本为9.1.4.v20140401。我试了一下,jdk版本要和jetty-maven-plugin的版本要匹配否则启动的项目的时候会报错。
2.1 基本配置
我测试成功的pom文件的配置如下:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.1.4.v20140401</version>
<configuration>
<!-- 扫描静态资源文件和java文件 -->
<scanTargetPatterns>
<scanTargetPattern>
<directory>src</directory>
<includes>
<include>**/*.java</include>
<include>**/*.properties</include>
<include>**/*.sql</include>
<include>**/*.txt</include>
<include>**/*.html</include>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</scanTargetPattern>
</scanTargetPatterns>
<!--此处填写0,表示热部署扫描由JRebel完成;填写其他正数表示热部署扫描由Jetty插件完成-->
<scanIntervalSeconds>5</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<!--<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>8080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>-->
<webAppConfig>
<contextPath>/jfsnpm</contextPath>
<defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor>
</webAppConfig>
<httpConnector>
<port>8080</port>
</httpConnector>
<!-- 本地装载contextXml,来解决未配置事务或数据库造成启动时等待时间过长 -->
<contextXml>src/main/resources/jetty-deploy.xml</contextXml>
</configuration>
</plugin>
<!-- jerebel maven 插件,用于生成jrebel.xml -->
<plugin>
<groupId>org.zeroturnaround</groupId>
<artifactId>jrebel-maven-plugin</artifactId>
<version>1.1.5</version>
<executions>
<execution>
<id>generate-rebel-xml</id>
<phase>process-resources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<rebelXmlDirectory>D:\dangjianmstrs\dangjianmstrs\target\classes</rebelXmlDirectory>
<!-- 指定生成的jrebel.xml放在哪里, 要求放在web应用的 classpath下 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- war包生成插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>D:\dangjianmstrs\dangjianmstrs\src\main\webapp</warSourceDirectory>
</configuration>
</plugin>
2.2其他配置
在上面的pom文件中配置中有一个webdefault.xml和jetty-deploy.xml两个配置文件,这两个配置文件的位置可以放在src/main/resources路径下面。webdefault.xml主要修改了默认文件中的一些属性,使得服务器启动时可以修改静态资源文件。具体的配置可以参考博客《maven-jetty插件配置时,webdefault.xml的取得和修改》或者《maven3 使用jetty插件热部署web项目不能修改静态资源的原因》,为了能够在服务器启动时修改静态文件,需要把useFileMappedBuffer改成false。为了能够让项目自身的web.xml里的< welcome-file-list>标签能够不被覆盖掉而产生效果,需要把< welcome-file-list>整个标签注释掉。webdefault.xml的位置可以去maven的本地仓库找到\org\eclipse\jetty\jetty-webapp\版本号\里面的jar文件,解压后找到webdefault.xml进行修改。
jetty-deploy.xml主要是为了解决maven jetty插件启动慢的问题,具体的内容可以参考博客《关于使用maven jetty插件启动慢的解决方法》。
3.项目启动
通过上面的配置就可以完成IDEA、jetty、JRebel的整合,当项目中修改静态资源比如html、css修改以后,jetty会自动的重启加载。但是当java文件修改的时候,需要自己手动的编译一下,Ctrl+Shift+F9/Ctrl+F9将java编译成class文件后JRebel就能够识别出class文件发生变化了,就会自动加载class文件了。
参考资料
Intellij IDEA中实现热部署
IntelliJ IDEA(2017)安装和破解
IntelliJ IDEA 热部署插件 JRebel 安装激活及使用
jetty 热部署
maven3 使用jetty插件热部署web项目不能修改静态资源的原因
关于使用maven jetty插件启动慢的解决方法
maven-jetty插件配置时,webdefault.xml的取得和修改
IntelliJ IDEA + Maven + Jetty +JRebel 热部署 配置
IntelliJ + Maven + 内Jetty 实现热部署项目
Maven Jrebel 多模块热部署方案