Java Maven jetty插件-使用多模块项目自动重新加载
我正在使用一个多模块maven项目开发一个JavaWeb应用程序。项目设置如下所示: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项目,包括以下模块:pom.xml
实体类和DAO持久性:
服务定义和实现业务:
apachewicket web应用程序webapp:
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
(有关详细信息,请参阅)