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

Java Maven jetty插件-使用多模块项目自动重新加载,java,maven,jetty,maven-jetty-plugin,maven-module,Java,Maven,Jetty,Maven Jetty Plugin,Maven Module,我正在使用一个多模块maven项目开发一个JavaWeb应用程序。项目设置如下所示: pom.xml主要maven项目,包括以下模块: 持久性:实体类和DAO 业务:服务定义和实现 webapp:apachewicket web应用程序 依赖关系层次结构如下:webapp依赖于business,后者依赖于persistence 我还使用来在本地运行web应用程序,使用mvn-plwebappjetty:run在目录中运行主pom.xml。在开发应用程序时,在进行代码更改时,我希望jett

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

  • pom.xml
    主要maven项目,包括以下模块:
    • 持久性:
      实体类和DAO
    • 业务:
      服务定义和实现
    • webapp:
      apachewicket web应用程序
依赖关系层次结构如下:
webapp
依赖于
business
,后者依赖于
persistence

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

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


org.eclipse.jetty
. 
标记工作正常,因为当我在
业务
持久化
中修改文件时,jetty会重新启动。但是,
不起作用,因为jetty没有加载修改过的文件。链接答案使用
标记。但是,我正在使用中指定的
标记(我还尝试了旧的
标记,这会导致相同的结果)


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

以下配置对我有效

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

org.mortbay.jetty
jetty maven插件
7.4.2.v20110526
3.
/${project.name}
目标/类别/服务/目标/类别/util/target/classes
目标/类别
../services/target/classes
../util/target/classes

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

mvn -pl webapp jetty:run
该命令是从主pom目录调用的,因此jetty无法正确解析
类外路径
中的相对路径。在
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

但是,
属性是类实例的
属性的一部分。我假设此实例直接传递给jetty,jetty在已启动时访问该属性。

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

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>

org.eclipse.jetty
jetty maven插件
${jetty.plugin.version}
${jetty.scanInterval}
模块名称/目标/类
模块名称2/目标/类别
2-Dinamic模块名称和扫描目标(推荐) 这使用正则表达式来查找其他模块的编译目标,在下面的示例中,每当在任何模块上编译类时,我们都会重新加载应用程序

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

org.eclipse.jetty
jetty maven插件
${jetty.plugin.version}
${jetty.scanInterval}
${project.basedir}
**/目标/类别/***/.class

我尝试了完全相同的配置(即jetty插件的版本),但没有成功。但是,因为我的新配置确实适用于您,所以我尝试在
webapp
目录中调用
mvnjetty:run
(请参阅我的答案)+1感谢您帮助我找到解决方案:)您对使用此配置的PermGen空间有任何问题吗?@Skizzo我遇到了一些jetty内存不足的问题,但我通过创建一个名为
MAVEN\u OPTS
的环境变量来解决了这些问题,该变量的值为
-Xmx1024m-Xms512m-XX:MaxPermSize=1024m
(有关详细信息,请参阅)