8

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

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

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

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

Maven Jetty Plugin 内部配置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>

我按照这个答案的说明进行操作。标签工作正常,因为当我在or中修改文件时,<scanTarget>码头会重新启动。但是,这不起作用,因为修改后的文件不是由码头加载的。链接的答案使用标签。但是,我使用插件文档中指定的标签(我也尝试了旧标签,导致相同的结果)。businesspersistence<extraClasspath><webAppConfig><webApp><webAppConfig>

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

4

3 回答 3

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>

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>
于 2014-09-25T15:51:56.543 回答
4

通过反复试验,我找到了解决方案。问题是码头是使用从父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>属性是该属性的一部分,该属性是org.eclipse.jetty.webapp.WebAppContext<webApp>的一个实例。我假设这个实例直接传递给码头,而extraClasspath码头已经启动时访问

于 2014-09-08T21:12:41.230 回答
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>
于 2014-09-08T15:04:10.740 回答