如何跳过maven antrun copy / shade:动态阴影目标?

时间:2014-07-26 09:27:45

标签: java maven maven-shade-plugin maven-antrun-plugin maven-lifecycle

我正在使用maven来配置由多个小型服务组成的应用程序。在java中开发的大多数服务共享相同的maven配置,就像在相同的构建生命周期中一样,共享资源(如spring AMQP)。

所以我在SuperPom中组织了共享资源。

虽然阴影插件似乎并没有打扰安装过程,但是当然,由于没有通过阴影插件创建任何jar文件,因此antrun插件当然不会找到它应该复制的任何文件。 / p>

由于我想在SuperPom中抽象出阴影/ antrun插件的配置,我需要跳过阴影/复制目标。

我尝试过mvn clean install -Dmaven.shade.skip=truemvn clean install -Dmaven.copy.skip=truemvn clean install -Dmaven.shade.shade.skip=true

以下是一个供您玩的小样本:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Test</groupId>
    <artifactId>SuperTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <properties>
        <log4j.version>1.2.17</log4j.version>
        <destination>pleasedeleteme</destination>
        <mainpackage>com.uk.cc.it.info.gov.test.xxx</mainpackage>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>${mainpackage}.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>${groupId}</groupId>
                                    <artifactId>${artifactId}</artifactId>
                                    <version>${version}</version>
                                    <type>jar</type>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>${destination}</outputDirectory>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>

</project>

4 个答案:

答案 0 :(得分:5)

您是否尝试在超级pom中将maven-shade-plugin的阶段设置为none,然后在客户端poms中覆盖它?

所以在父母pom:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <id>shade</id>
            <phase>none</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <!-- ... -->
            </configuration>
        </execution>
    </executions>
</plugin>

在需要它的儿童poms中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <!-- no need to specify version -->
    <executions>
        <execution>
            <id>shade</id>
            <phase>package</phase>
            <!-- no need to specify configuration -->
        </execution>
    </executions>
</plugin>

答案 1 :(得分:3)

maven-shade-plugin没有parameter可以跳过。通常,shade-plugin并不仅仅是为了好玩,所以你可能想知道你是否真的想跳过它。如果您认为它仍然有效,则必须创建一个激活的配置文件,如下所示:

<activation>
  <property>
    <name>skipShade</name>
    <value>!true</value>
  </property>
</activation>

这种方式默认情况下处于激活状态,除非您添加-DskipShade-DskipShade=true

答案 2 :(得分:0)

Maven 3.6.1为您提供了一种新方法。

在superPom中,您可以为阴影配置定义配置文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Test</groupId>
<artifactId>SuperTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
    <log4j.version>1.2.17</log4j.version>
    <destination>pleasedeleteme</destination>
    <mainpackage>com.uk.cc.it.info.gov.test.xxx</mainpackage>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>${groupId}</groupId>
                                <artifactId>${artifactId}</artifactId>
                                <version>${version}</version>
                                <type>jar</type>
                                <overWrite>true</overWrite>
                                <outputDirectory>${destination}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>
</dependencies>

<profiles>
    <profile>
        <id>shade</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.2</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>${mainpackage}.Main</mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

在用户的.m2下的settings.xml中,您可以添加具有相同ID的配置文件以启用superPom的阴影配置文件配置。这使您可以选择像Intellij IDEA(仅在Intellij中进行测试)之类的IDE内部简单地切换阴影。

<settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">

    ...

    <!-- toggle shading from inside Intellij IDEA -->
    <profiles>
        <profile>
            <id>shade</id>
        </profile>
    </profiles>

    <!-- Shade Profile has to be activeProfile to be 
    able to explicitly disable shading -->
    <activeProfiles>
        <activeProfile>shade</activeProfile>
    </activeProfiles>
</settings>

在子项目中,可以将.mvn / maven.config文件添加到子项目模板中,以默认情况下为项目预定义底纹。 (需要用于预定义公司标准的CVS模板。)

如果您的某些团队成员的settings.xml文件中没有配置文件,并且您必须注意大部分时间都会进行着色,那么使用maven.config的方法将非常有用。

.mvn / maven.config:

-Pshading

默认情况下,还可以通过传递-Pshade使用Jenkins的jenkinsfile来激活配置文件。它将覆盖maven.config设置。禁用-P!shade

请注意,如果您正在Intellij(2020.2.2)中使用maven.config文件:.mvn / maven.config文件必须存在于 root aggregator pom 文件夹的子目录中。目前,从IDE构建子项目时,在子项目级别上不遵守.mvn / maven.config文件。从子项目文件夹中的命令行运行mvn命令将同时尊重子项目.mvn / maven.config和父项目.mvn / maven.config。

答案 3 :(得分:0)

禁用 maven shade 插件对我有用。在我禁用 Maven shade 插件之前,该构建尝试生成依赖减少的 pom 文件。