【问题标题】:Maven jetty plugin - automatic reload using a multi-module projectMaven jetty 插件 - 使用多模块项目自动重新加载
【发布时间】:2014-11-01 17:58:43
【问题描述】:

我正在使用多模块 maven 项目开发 Java Web 应用程序。项目设置如下:

  • pom.xml 主 maven 项目,包括以下模块:
    • persistence: 实体类和 DAO
    • business:服务定义与实现
    • webapp: Apache wicket 网络应用程序

依赖层次如下:webapp 依赖于business,它依赖于persistence

我还使用Jetty Maven Plugin 在主目录pom.xml 内使用mvn -pl webapp jetty:run 在本地运行Web 应用程序。在开发应用程序时,在进行代码更改时,我希望码头服务器重新启动并自动重新加载修改后的代码文件。这在我修改 webapp 模块内的文件时可以正常工作,但是当我在另一个模块内修改文件时,不起作用,例如 persistencebusiness

Maven Jetty 插件在webapp/pom.xml 内部配置如下:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.2.2.v20140723</version>
    <configuration>
        <reload>automatic</reload>
        <scanIntervalSeconds>1</scanIntervalSeconds>
        <webApp>
            <extraClasspath>../business/target/classes/;../persistence/target/classes/</extraClasspath>
        </webApp>
        <scanTargets>
            <scanTarget>../business/target/classes</scanTarget>
            <scanTarget>../persistence/target/classes</scanTarget>
        </scanTargets>
</plugin>

我听从了this answer的指示。 &lt;scanTarget&gt; 标签工作正常,因为当我修改 businesspersistence 中的文件时,码头会重新启动。但是,&lt;extraClasspath&gt; 不起作用,因为修改后的文件不是由码头加载的。链接的答案使用&lt;webAppConfig&gt; 标签。但是,我使用的是documentation of the plugin 中指定的&lt;webApp&gt; 标记(我也尝试了旧的&lt;webAppConfig&gt; 标记,结果相同)。

我的问题是:如何为多模块项目配置 Jetty Maven 插件,以便从其他模块重新加载修改过的文件?

【问题讨论】:

    标签: java maven jetty maven-jetty-plugin maven-module


    【解决方案1】:

    要在子模块更改时强制重新加载,您可以使用以下选项

    1 - 静态模块名称和扫描目标

    您可以将每个模块的目标目录定义为扫描目标

    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.plugin.version}</version>
        <configuration>
            <scanIntervalSeconds>${jetty.scanInterval}</scanIntervalSeconds>
            <scanTargets>
                <scanTarget>module-name/target/classes</scanTarget>
                <scanTarget>module-name2/target/classes</scanTarget>
            </scanTargets>
        </configuration>
    </plugin>
    

    2 - 动态模块名称和扫描目标(推荐) 这使用 RegEx 来查找其他模块的编译目标,在以下示例中,每次在任何模块上编译类时,我们都会重新加载应用程序

    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${jetty.plugin.version}</version>
        <configuration>
            <scanIntervalSeconds>${jetty.scanInterval}</scanIntervalSeconds>
            <scanTargetPatterns>
                <scanTargetPattern>
                    <directory>${project.basedir}</directory>
                    <includes>
                        <include>**/target/classes/**/*.class</include>
                    </includes>
                </scanTargetPattern>
            </scanTargetPatterns>
        </configuration>
    </plugin>
    

    【讨论】:

      【解决方案2】:

      通过反复试验,我找到了解决方案。问题是jetty是使用父pom执行的

      mvn -pl webapp jetty:run
      

      该命令是从主pom目录调用的,因此jetty无法正确解析extraClasspath内的相对路径。在webapp 目录中执行jetty:run 目标时,所有修改的类都正确加载。


      我假设 scanTargets 即使在使用 mvn -pl webapp jetty:run 时也能正常工作,因为在插件执行期间会解析相对路径(使用正确的工作目录)。 Jetty 在启动时输出扫描目标:

      [INFO] Added extra scan target:C:\PathToProject\business\target\classes
      [INFO] Added extra scan target:C:\PathToProject\persistence\target\classes
      

      但是,&lt;extraClasspath&gt;property 是&lt;webApp&gt; 属性的一部分,它是org.eclipse.jetty.webapp.WebAppContext 类的一个实例。我假设这个实例是直接传递给 jetty 的,并且 extraClasspath 属性在 jetty 已经启动时会被访问。

      【讨论】:

      • 使用这个配置的PermGen空间有什么问题吗?
      • @Skizzo 我遇到了一些码头内存不足的问题,但我通过创建一个名为MAVEN_OPTS 的环境变量来解决这些问题,其值为-Xmx1024m -Xms512m -XX:MaxPermSize=1024m(有关详细信息,请参阅stackoverflow.com/a/18674094/2623126
      【解决方案3】:

      以下配置对我有用

          <!-- To launch embded jetty server -->
      <plugin>
          <groupId>org.mortbay.jetty</groupId>
          <artifactId>jetty-maven-plugin</artifactId>
          <version>7.4.2.v20110526</version>
      
      
          <configuration>
              <scanIntervalSeconds>3</scanIntervalSeconds>
              <webAppConfig>
                  <contextPath>/${project.name}</contextPath>
                  <extraClasspath>target/classes;../services/target/classes;../util/target/classes</extraClasspath>
              </webAppConfig>
              <scanTargets>
                  <scanTarget>target/classes</scanTarget>
                  <scanTarget>../services/target/classes</scanTarget>
                  <scanTarget>../util/target/classes</scanTarget>
              </scanTargets>
          </configuration>
      
      </plugin>
      

      【讨论】:

      • 我尝试了完全相同的配置(即码头插件的版本),但它不起作用。但是,因为我的新配置确实对您有用,所以我尝试在 webapp 目录中调用 mvn jetty:run(请参阅我的答案)。 +1 并感谢您帮助我找到解决方案 :)
      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 2011-01-31
      • 2013-05-16
      • 2018-03-25
      • 2020-05-27
      • 2019-10-20
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多