我正在尝试将Maven WAR项目拆分为两个模块,以便我可以使用命令行工具构建单独的JAR文件。结果具有以下结构:
pom.xml
(打包pom
,有两个模块)project-jar/
pom.xml
(打包jar
)project-war/
pom.xml
(打包war
,取决于project-jar
)如果我从root运行mvn
命令,一切正常。我想继续使用mvn jetty:run
,但为此我需要在WAR子项目中执行该命令。如果我这样做,找不到project-jar
子项目,因此它不会运行。即使mvn jetty:run-war
在target
目录中有完整汇编的WAR文件也会失败,因为它首先尝试“构建”项目。我只是通过将project-jar
安装到本地Maven存储库来设法使其工作,这不是很好。
有没有办法在多模块Maven配置中使用Jetty插件?
答案 0 :(得分:29)
在war模块中创建一个配置文件(project-war
)。在此配置文件中,配置jetty以附加到生命周期阶段并明确执行run
目标。现在当maven从启用了该配置文件的顶层项目运行时,它将调用jetty:run并具有姐妹模块依赖性解析(从顶层项目执行maven命令时正常)。
示例配置放置在Web模块(project-war
)的pom.xml中时,会安排jetty:run在test
阶段执行。 (您可以选择另一个阶段,但要确保它在compile
之后。)
从顶级:mvn test -Pjetty-run
或mvn test -DskipTests=true -Pjetty-run
运行。这将根据需要编译依赖项并使它们可用但调用jetty:在正确的模块中运行。
<profiles>
...
<!-- With this profile, jetty will run during the "test" phase -->
<profile>
<id>jetty-run</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.1.6.v20100715</version>
<configuration>
...
<webAppSourceDirectory>
${project.build.directory}/${project.build.finalName}
</webAppSourceDirectory>
...
</configuration>
<executions>
<execution>
<id>jetty-run</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
答案 1 :(得分:11)
没有神奇的解决方案,我知道的唯一一个有点hacky并且依赖于extraClasspath
元素,你可以用来相对地声明额外的类目录。像这样(来自JETTY-662):
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.0.1.v20091125</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppConfig>
<contextPath>/my-context</contextPath>
<extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath>
</webAppConfig>
<scanTargets>
<scanTarget>../my-jar-dependency/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>
答案 2 :(得分:1)
在jetty配置中使用extraClasspath工作......但由于某种原因,如果从属jar(来自其他模块)已过时,有些东西将无法正常工作。
答案 3 :(得分:1)
将jetty插件添加到根pom并配置指向所需war的contextHandler。这适用于具有多个jar模块和两个叠加战争的项目。
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M2</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextHandlers>
<contextHandler
implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.basedir}/project-war/target/project-war-${project.version}.war</war>
<contextPath>/</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
</plugin>
http://eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#running-more-than-one-webapp
答案 4 :(得分:0)
我知道你要求插件配置,但你可以在maven命令中定义项目:
$ mvn jetty:run --projects project-war
答案 5 :(得分:0)
从Jetty 9.4.7开始,在多模块构建中使用jetty:run时,不再需要首先构建构成Webapp依赖项的每个模块。因此,如果您的Web应用程序依赖于项目中的其他模块,并且它们同时存在于反应堆中,则Jetty将使用其编译的类,而不是本地maven存储库中的jar文件。
因此,将jetty-maven-plugin
添加到Maven根项目并运行mvn jetty:run