代码之家  ›  专栏  ›  技术社区  ›  Gaste

Maven jetty插件-使用多模块项目自动重新加载

  •  9
  • Gaste  · 技术社区  · 10 年前

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

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

    依赖关系层次结构如下: webapp 取决于 business ,这取决于 persistence .

    我也在使用 Jetty Maven Plugin 要在本地运行web应用程序,请使用 mvn -pl webapp jetty:run 在目录中 pom.xml文件 。在开发应用程序时,在进行代码更改时,我希望jetty服务器自动重新启动并重新加载修改后的代码文件。当我在 网络应用程序 模块,但 不起作用 当我在另一个模块中修改文件时,例如 坚持不懈 商业 .

    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 这个 <scanTarget> 标签工作正常,因为当我在里面修改文件时,jetty会重新启动 商业 坚持不懈 。然而 <extraClasspath> 不工作,因为jetty未加载修改的文件。链接的答案使用 <webAppConfig> 标签然而,我正在使用 <webApp> 中指定的标记 documentation of the plugin (我也尝试了 <webAppConfig> 标签,这导致相同的结果)。

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

    3 回复  |  直到 10 年前
        1
  •  5
  •   Valdo Raya    10 年前

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

    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-Dinamic模块名称和扫描目标(推荐) 这使用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
  •  4
  •   Gaste    10 年前

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

    mvn -pl webapp jetty:run
    

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


    我想 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
    

    然而 <extraClasspath> 属性是 <webApp> 属性,它是 org.eclipse.jetty.webapp.WebAppContext 班我假设这个实例直接传递给jetty extraClasspath 当jetty已经启动时,它可以访问该属性。

        3
  •  3
  •   Skizzo    10 年前

    以下配置适用于我

        <!-- 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>