我正在使用多模块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
模块中的文件时工作正常,但当我修改另一个模块中的文件时,不起作用,例如persistence
或business
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>
代码工作正常,因为当我修改business
或persistence
内的文件时,jetty会重新启动。但是,<extraClasspath>
不起作用,因为修改后的文件未被jetty加载。链接的答案使用<webAppConfig>
标记。但是,我正在使用documentation of the plugin中指定的<webApp>
标记(我还尝试了旧的<webAppConfig>
标记,这会导致相同的结果)。
我的问题是:如何为多模块项目配置Jetty Maven插件,以便从其他模块重新加载修改后的文件?
答案 0 :(得分:4)
使用反复试验,我找到了解决方案。问题是使用
从父pom执行jettymvn -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>