Maven 3:叠加不是项目的依赖

时间:2014-02-25 12:47:14

标签: java maven maven-3 war

我正在尝试测试maven-war-plugin的叠加功能。基本上我需要合并两个战争项目。

所以我将战争定义为依赖:

<dependency> 
  <groupId>my.group.id</groupId> 
  <artifactId>my-legacy-war-project</artifactId> 
  <version>${project.version}</version> 
  <type>war</type> 
</dependency>

然后配置叠加层:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <configuration>
    <overlays>
      <overlay>
        <groupId>my.group.id</groupId>
        <artifactId>my-legacy-war-project</artifactId>
        <targetPath>legacy</targetPath>
      </overlay>
    </overlays>
  </configuration>
</plugin>

但是Maven没有建立这个项目,抱怨这种依赖:

  

[错误]无法执行目标   org.apache.maven.plugins:maven-war-plugin:2.3:爆炸(默认)开启   project my-project:overlay [id my.group.id:my-legacy-war-project]是   不是项目的依赖。 - &GT; [帮助1]

叠加层应该适用于Maven 3.0.5吗?为什么构建抱怨声明的依赖?

4 个答案:

答案 0 :(得分:10)

不确定原因,但在叠加层中使用id代替groupIdartifactId

  <configuration>
    <overlays>
      <overlay>
        <id>my-legacy-war-project</id>
        <targetPath>legacy</targetPath>
      </overlay>
    </overlays>
  </configuration>

答案 1 :(得分:1)

我有同样的错误,但可能出于不同的原因,因为你引入了战争依赖。在我的例子中,我有一个战争依赖作为一个叠加,一个jar依赖作为另一个。构建抱怨了jar依赖:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war) on project overlay: overlay [ id com.mycompany:launcher] is not a dependency of the project.

我通过向jar覆盖添加<type>jar</type>元素来修复错误。根据{{​​3}},type的默认值为war,因此构建正确地抱怨我没有名为launcher的战争工件。

这是我的叠加项目的工作pom:

<project>

<artifactId>overlay</artifactId>
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>app</artifactId>
        <type>war</type>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.mycompany</groupId>
        <artifactId>launcher</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <overlays>
                        <overlay>
                            <groupId>com.mycompany</groupId>
                            <artifactId>app</artifactId>
                        </overlay>
                        <overlay>
                            <groupId>com.mycompany</groupId>
                            <artifactId>launcher</artifactId>
                            <type>jar</type>  <!-- THIS IS THE FIX -->
                        </overlay>
                    </overlays>
                </configuration>
        </plugin>
    </plugins>
</build>

答案 2 :(得分:0)

我遇到了与maven-war-plugin 2.2版相同的问题以及滥用重复的插件声明。在统一它们并使用Sergio Michels建议之后,现在使用maven-war-plugin的2.3版本可以正常工作。

更改前:

<plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <dependentWarExcludes>'**/jdbc.properties,**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**'</dependentWarExcludes>
            </configuration>
</plugin>          
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warName>my-snapshot</warName>
                <overlay>
                    <overlay>
                    <id>my-webapp-common</id>
                    <groupId>xyz.mycompany</groupId>
                    <artifactId>my-webapp-common</artifactId>
                    </overlay>
                </overlays>
            </configuration>
</plugin>

应用更改后:

           <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <warName>my-snapshot</warName>
                <overlays>
                <overlay>
                    <overlay>
                        <id>my-webapp-common</id>
                        <targetPath>legacy</targetPath>
                    </overlay>
                </overlays>
                <dependentWarExcludes>'**/jdbc.properties,**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**'</dependentWarExcludes>
          </configuration>
        </plugin>

答案 3 :(得分:0)

扩展其他答案。问题是让overlay使用与id相同的dependency

使用$ mvn dependency:list可以为您显示所需的ID。例如:

[INFO] +- com.foo.bar.v2:api:jar:1.0:system 
[INFO] \- com.foo.bar.v2:main-server:war:1.0:system 
[INFO] \- com.foo.bar.v2:second-server:war:classes:1.0:system

显示一罐一战。注意::jar:war的对比完全取决于您是否在<type>war</type>中使用了dependency。同样,:classes(或为空)完全由您是否在<classifier>classes</classifier>中使用dependency来控制。

您需要使其与<overlay>保持一致。对于上面列出的com.foo.bar.v2:main-server:war:1.0:system,这将是覆盖项:

<overlay>
    <id>com.foo.bar.v2:main-server:war:1.0</id>
    <groupId>com.foo.bar.v2</groupId>
    <artifactId>main-server</artifactId>
</overlay>

对于com.foo.bar.v2:second-server:war:classes:1.0:system,这将是正确的条目:

<overlay>
    <id>com.foo.bar.v2:main-server:war:1.0</id>
    <groupId>com.foo.bar.v2</groupId>
    <artifactId>main-server</artifactId>
    <classifier>classes</classifier>
</overlay>