我正在尝试测试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吗?为什么构建抱怨声明的依赖?
答案 0 :(得分:10)
不确定原因,但在叠加层中使用id
代替groupId
和artifactId
:
<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>