4

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

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

虽然 shade 插件似乎并没有真正干扰安装过程,但 antrun 插件当然不会找到它应该复制的任何文件,因为 shade 插件没有创建任何 jar 文件。

由于我希望在 SuperPom 中抽象 shade/antrun 插件的配置,我需要跳过 shade/copy 目标。

我试过了mvn clean install -Dmaven.shade.skip=true,,,mvn 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

4 回答 4

7

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

所以在父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>

在需要它的孩子中:

<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>
于 2015-06-29T17:40:08.053 回答
3

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

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

这种方式默认激活,除非您添加-DskipShade-DskipShade=true

于 2014-07-26T13:36:20.147 回答
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 的阴影配置文件配置。这使您可以选择从 IDE 内部简单地切换阴影,例如 Intellij IDEA(仅在 Intellij 中测试)。

<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 文件必须存在于根聚合器 pom文件夹的子目录中。目前,从 IDE 构建子项目不尊重子项目级别的 .mvn/maven.config 文件。从子项目文件夹中的命令行运行 mvn 命令将重复子项目 .mvn/maven.config 和父项目 .mvn/maven.config。

于 2020-09-23T12:26:53.670 回答
0

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

于 2021-02-10T23:05:14.233 回答