我有项目B从项目A继承。在项目A中,我必须将从Maven下载的jar文件复制到lib文件夹中。项目A的pom文件:
<groupId>com.penguin.com.projecta</groupId>
<artifactId>penguin-common--pom</artifactId>
<packaging>pom</packaging>
<version>${com.penguin.common.projecta}</version>
<name>Penguin COMMON POM</name>
<modules>
<module>projectb</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-jars</id>
<phase>process-sources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<overWriteIfNewer>true</overWriteIfNewer>
<artifactItems>
<artifactItem>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>1.1</version>
<type>jar</type>
<destFileName>ant-contrib.jar</destFileName>
<outputDirectory>lib</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
当我构建时,maven将jar文件复制到lib文件夹,但它也在Project B中创建了lib文件夹,并将Project A的pom文件中定义的jar文件复制到其中。现在我想在项目B中排除它。我尝试使用下面的这个脚本,但它不起作用。
<dependencies>
<dependency>
<groupId>com.penguin.com.projecta</groupId>
<artifactId>penguin-common--pom</artifactId>
<version>${com.penguin.common.projecta}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
我引用此链接:Is there anyway to exclude artifacts inherited from a parent POM?。但它也没有帮助我。
答案 0 :(得分:3)
虽然我怀疑你的项目结构是否正确(我想不出父pom应该复制依赖项的好例子......),但你可能正在寻找inherited - 标签
答案 1 :(得分:0)
您的排除列在错误的地方。您希望从maven-dependency-plugin的配置中排除工件,而不是从项目依赖项中排除。这里的神奇成分是属性combine.self="override"
来自Maven Pom Reference: “您可以通过向配置元素的子元素添加属性来控制子POM如何从父POM继承配置。属性是combine.children和combine.self。在子POM中使用这些属性来控制Maven如何结合插件配置父级在子级中具有显式配置。“
您需要将孩子pom中的设置更改为以下内容:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-jars</id>
<phase>process-sources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<overWriteIfNewer>true</overWriteIfNewer>
<artifactItems combine.self="override">
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
我不确定是否可以排除一个特定的工件,而不是覆盖整个artifactItems声明,这就是我偶然发现你的问题时所寻找的。为了解决这个问题,我的设置可能涉及多pom继承,因为我们在插件配置中列出了近100个工件,我只想在我的孩子pom中为一些工件排除和交换不同的实现。