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

Gas*_*ste 6 java jetty maven maven-jetty-plugin maven-module

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

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

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

我也使用Jetty Maven插件mvn -pl webapp jetty:run在主目录内部使用本地运行Web应用程序pom.xml.在开发应用程序时,在进行代码更改时,我希望jetty服务器重新启动并自动重新加载修改后的代码文件.当我修改里面的文件也能正常工作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>
Run Code Online (Sandbox Code Playgroud)

我按照这个答案的说明.该<scanTarget>标签做工精细,因为当我修改中的文件被码头重新启动businesspersistence.但是,<extraClasspath>由于修改后的文件未被jetty加载,因此无效.链接的答案使用<webAppConfig>标记.但是,我正在使用插件文档中<webApp>指定的标记(我也尝试了旧标记,这导致了相同的结果).<webAppConfig>

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

小智 5

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

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Gas*_*ste 4

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

mvn -pl webapp jetty:run
Run Code Online (Sandbox Code Playgroud)

该命令是从主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
Run Code Online (Sandbox Code Playgroud)

但是,该<extraClasspath>属性是属性的一部分,属性是org.eclipse.jetty.webapp.WebAppContext<webApp>类的实例。我假设这个实例直接传递给jetty,并且extraClasspath属性在jetty启动时由jetty访问。