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

时间:2014-09-08 13:35:14

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

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

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

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

我还使用Jetty Maven Plugin在主目录mvn -pl webapp jetty:run的目录中使用pom.xml在本地运行Web应用程序。在开发应用程序时,在进行代码更改时,我希望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>

我按照this answer的说明操作。 <scanTarget>代码工作正常,因为当我修改businesspersistence内的文件时,jetty会重新启动。但是,<extraClasspath>不起作用,因为修改后的文件未被jetty加载。链接的答案使用<webAppConfig>标记。但是,我正在使用documentation of the plugin中指定的<webApp>标记(我还尝试了旧的<webAppConfig>标记,这会导致相同的结果)。

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

3 个答案:

答案 0 :(得分:4)

使用反复试验,我找到了解决方案。问题是使用

从父pom执行jetty
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,并且当它已经启动时,jetty访问extraClasspath属性。

答案 1 :(得分:4)

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

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 :(得分: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>