复制子模块时不要复制父pom

Don't copy parent pom when copying child modules

我想在执行 package:copy 目标时排除父 pom(以下代码所在的位置)被复制,但我找不到示例或自己弄清楚:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <type>${project.packaging}</type>
                        <classifier>shaded</classifier>
                        <destFileName>${project.name}.${project.packaging}</destFileName>
                        <excludes>*.pom</excludes> <!-- not working -->
                    </artifactItem>
                </artifactItems>
                <outputDirectory>${rootdir}/target/modules</outputDirectory>
                <silent>true</silent>
                <overWriteReleases>true</overWriteReleases>
                <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
        </execution>
    </executions>
</plugin>

无论 <excludes> 中的 artifactItem 设置如何,它仍然包含我的父项目 NiftyParent.pom。我想排除文件复制到 ${rootdir}/target/modules 目录。

万一有人问,${rootdir} 属性 只是指向父项目目录,没有硬编码 relative/absolute 路径(为了争论它的 ~/Workspace/Nifty.

您可以将 pluginskip 配置元素与父级及其模块中定义的 Maven property 一起使用,以跳过执行。

在你的父 pom 中你可以配置如下:

<properties>
    <skip-dependency-copy>true</skip-dependency-copy>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${project.groupId}</groupId>
                                <artifactId>${project.artifactId}</artifactId>
                                <version>${project.version}</version>
                                <type>${project.packaging}</type>
                                <classifier>shaded</classifier>
                                <destFileName>${project.name}.${project.packaging}</destFileName>
                            </artifactItem>
                        </artifactItems>
                        <outputDirectory>${rootdir}/target/modules</outputDirectory>
                        <silent>false</silent>
                        <overWriteReleases>true</overWriteReleases>
                        <overWriteSnapshots>true</overWriteSnapshots>
                        <skip>${skip-dependency-copy}</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意额外的 属性 和 skip 元素配置。

然后,在每个模块中,您可以简单地配置以下内容:

<properties>
    <skip-dependency-copy>false</skip-dependency-copy>
</properties>

因此,我们实际上是根据 parent/module 位置切换它 on/off。这种方法的另一个优点是,您还可以为某些模块跳过它(如果需要),并能够从命令行(覆盖定义的属性值)为所有模块(在您的情况下关闭)切换它 on/off例如:

mvn package -Dskip-dependency-copy=true

这种方法不使用插件配置,但在许多其他插件和案例中需要跳过时经常使用它。