Intellij IDEA整合jetty、JRebel实现热加载

  看了《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 多模块热部署方案

猜你喜欢

转载自blog.csdn.net/innovate1989/article/details/79304428