Maven 2 多模块Maven项目和码头:运行

Maven 2 多模块Maven项目和码头:运行,maven-2,maven-jetty-plugin,Maven 2,Maven Jetty Plugin,我正试图将Maven WAR项目分为两个模块,以便使用命令行工具构建一个单独的JAR文件。结果具有以下结构: pom.xml(打包pom,有两个模块) projectjar/ pom.xml(打包jar) projectwar/ pom.xml(打包war,取决于项目jar) 如果我从根目录运行mvn命令,一切正常。我想继续使用mvnjetty:run,但为此我需要在WAR子项目中执行命令。如果这样做,则无法找到projectjar子项目,因此它将无法运行。甚至mvnjetty:ru

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

  • pom.xml
    (打包
    pom
    ,有两个模块)
  • projectjar/
    • pom.xml
      (打包
      jar
  • projectwar/
    • pom.xml
      (打包
      war
      ,取决于
      项目jar
如果我从根目录运行
mvn
命令,一切正常。我想继续使用
mvnjetty:run
,但为此我需要在WAR子项目中执行命令。如果这样做,则无法找到
projectjar
子项目,因此它将无法运行。甚至
mvnjetty:runwar
target
目录中使用一个完全组装好的war文件也会失败,因为它首先尝试“构建”项目。我只是通过将
projectjar
安装到本地Maven存储库中来实现它,这不是很好


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

没有神奇的解决方案,我所知道的唯一解决方案是有点老套,依赖于
extraClasspath
元素,您可以使用它来声明额外的类目录。像这样(来自):


org.mortbay.jetty
jetty maven插件
7.0.1.v20091125
10
/我的背景
目标/类别/我的jar依赖项/目标/类
../my jar依赖项/目标/类

在jetty配置中使用extraClasspath有效。。。但是由于某些原因,如果依赖JAR(来自其他模块)过时,某些东西将无法正常工作。

在war模块内创建一个配置文件(
项目war
)。在此配置文件中,将jetty配置为附加到生命周期阶段,并显式执行
run
目标。现在,当maven在启用该概要文件的情况下从顶级项目运行时,它将调用jetty:run并具有姐妹模块依赖项解析(这在从顶级项目执行maven命令时是正常的)

示例配置放置在web模块(
projectwar
)的pom.xml中时,安排jetty:run在
测试
阶段执行。(您可以选择另一个阶段,但请确保它在
编译之后)

从顶层运行:
mvn测试-Pjetty运行
mvn测试-DskipTests=true-Pjetty运行
。这将根据需要编译依赖项并使它们可用,但会在正确的模块中调用jetty:run

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

...
码头运行
org.mortbay.jetty
jetty maven插件
7.1.6.v20100715
...
${project.build.directory}/${project.build.finalName}
...
码头运行
测试
跑
...

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

org.eclipse.jetty

我知道您要求插件配置,但您可以在maven命令中定义项目:

$ mvn jetty:run --projects project-war
报告指出

从Jetty 9.4.7开始,当在多模块构建中使用Jetty:run时,不再需要首先构建构成webapp依赖项的每个模块。因此,如果您的webapp依赖于项目中的其他模块,并且它们同时存在于reactor中,那么jetty将使用它们编译的类,而不是本地maven存储库中的jar文件


因此,将
jetty maven插件
添加到maven根项目中,然后运行
mvn jetty:run

Hm,这实际上对我没有帮助,因为在jetty插件执行之前,它会因生成错误“无法解析工件”(兄弟JAR项目)而失败。因此,似乎我首先需要一个针对Maven的通用解决方案:(@LukášMaven使用本地存储库来解析依赖项,因此必须安装依赖项(即,您需要首先在父级上运行至少一次reactor build来安装所有模块)。然后,即使已安装的JAR“过时”,上述操作也会起作用.Ah,我希望避免这种情况。我发现的一种替代方法是在父级上设置jetty插件,并将其指向正确的war文件(然后使用jetty:run war),但我可能需要运行install,以使NetBeans满意。你能写下你是如何告诉jetty模块war文件所在的吗?
$ mvn jetty:run --projects project-war