2010-09-03 76 views
34

我试图将Maven WAR项目拆分为两个模块,以便我可以使用命令行工具构建单独的JAR文件。结果具有以下结构:多模块Maven项目和码头:运行

  • pom.xml(包装pom,具有两个模块)
  • project-jar/
    • pom.xml(包装jar
  • project-war/
    • pom.xml(包装war,取决于project-jar

如果我运行从根mvn命令,一切工作正常。我想继续使用mvn jetty:run,但为此我需要在WAR子项目中执行该命令。如果我这样做,找不到project-jar子项目,所以它不会运行。即使mvn jetty:run-wartarget目录中具有完全组装的WAR文件也会失败,因为它首先尝试“构建”该项目。我只设法通过将project-jar安装到本地Maven存储库来实现它,这不是很好。

有没有在多模块Maven配置中使用Jetty插件的方法?

回答

11

没有什么不可思议的解决方案,我知道的唯一的解决方法有点难以捉摸,它依赖于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

嗯,这实际上并没有帮助我,因为它会因BUILD错误“无法解析工件”而失败。 (兄弟JAR项目)在Jetty插件甚至被执行之前。所以看起来我首先需要Maven的一个通用解决方案。 :( – 2010-09-04 16:47:17

+1

@LukášMaven使用本地资源库来解决依赖关系,所以他们必须被安装(也就是说,您需要先安装所有模块,方法是在父级上至少运行一次反应堆构建)。工作,即使安装的JAR是“过时的” – 2010-09-04 17:00:33

+0

啊,我希望避免这种情况,我发现的另一种方法是在父级上设置码头插件并将其指向正确的war文件(然后使用jetty:run -war),但我可能需要运行安装以使NetBeans高兴。 – 2010-09-04 17:08:59

1

在码头配置使用extraClasspath作品...但由于某些原因,如果依赖jar(其他模块)是过时的一些事情将无法正常工作。

30

在战争模块内部创建一个配置文件(project-war)。在此配置文件中,将jetty配置为附加到生命周期阶段并明确执行目标。现在,当maven从启用了该配置文件的顶级项目运行时,它将调用jetty:run并具有姐妹模块依赖关系解析(当执行来自顶级项目的maven命令时正常)。

示例配置放置在Web模块(project-war)的pom.xml中时,会安排码头:运行以在test阶段执行。 (您可以选择另一个阶段,但要确保它在compile之后。)

从顶层运行:mvn test -Pjetty-runmvn 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

将jetty插件添加到根pom并配置指向所需战争的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

0

我知道你要问的插件配置,但你可以只定义在Maven命令的项目:

$ mvn jetty:run --projects project-war