排除从父POM继承的工件?

时间:2013-08-18 09:43:49

标签: maven maven-3 maven-plugin

我有项目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?。但它也没有帮助我。

2 个答案:

答案 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中为一些工件排除和交换不同的实现。