同时使用maven-flatten-plugin和maven-shade-plugin
Use maven-flatten-plugin and maven-shade-plugin at the same time
如何同时使用maven-flatten-plugin和maven-shade-plugin?
我使用 revision
、sha1
、changelist
来管理多模块项目的版本。
为了部署可消耗的工件,我使用 maven-flatten-plugin 生成一个扁平化的 pom,它使 ${revision} 具有实际价值。
但是 maven-shade-plugin 生成了一个缩减的 pom,${revision} 没有改变。
如何指定maven-shade-plugin使用扁平化pom来缩减pom。
我遇到了与 ${revision} 属性 相同的问题,但使用了选项
<createDependencyReducedPom>false</createDependencyReducedPom>
解决了我的问题。如果您需要减少依赖性的 pom,则此解决方案不起作用。
https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html
我今天遇到了同样的问题,但我在网上找不到真正的解决方案。虽然 PaulT 的建议可能对某些人有用,但我发现这是不可接受的,因为尽管将 <promoteTransitiveDependencies>
设置为 true
.
,但传递依赖项仍未包含在生成的 pom 中
我可以通过简单地更改 flatten
和 shade
之间的执行顺序来解决这个问题。您只需要确保 flatten
运行 AFTER shade
。如果您在父 pom 中定义了 flatten 插件,只需在具有相同执行 ID 的聚合器项目中添加相同的插件定义。
之前(原始顺序):
之后(修改顺序):
示例:
父项目 (POM)
<?xml version="1.0" encoding="UTF-8"?>
<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>com.ibasco.test</groupId>
<artifactId>ucgd-parent</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<properties>
<revision>2.0.0-alpha</revision>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>module-one</module>
<module>module-two</module>
<module>module-three</module>
<module>assembly</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- Flatten -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<executions>
<execution>
<id>flatten</id>
<phase>package</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
聚合器项目 (POM)
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>ucgd-parent</artifactId>
<groupId>com.ibasco.test</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ucg-display</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.ibasco.test</groupId>
<artifactId>module-two</artifactId>
</dependency>
<dependency>
<groupId>com.ibasco.test</groupId>
<artifactId>module-one</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- A little workaround to disable the jar warning -->
<classesDirectory>src</classesDirectory>
<excludes>
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>aggregate-javadocs</id>
<phase>package</phase>
<goals>
<goal>aggregate-jar</goal>
</goals>
<configuration>
<includeDependencySources>true</includeDependencySources>
<dependencySourceIncludes>
<dependencySourceInclude>com.ibasco.test:*</dependencySourceInclude>
</dependencySourceIncludes>
<dependencySourceExcludes>
<dependencySourceExclude>com.ibasco.test:module-three</dependencySourceExclude>
</dependencySourceExcludes>
</configuration>
</execution>
</executions>
</plugin>
<!-- Shade plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createSourcesJar>true</createSourcesJar>
<shadedArtifactAttached>false</shadedArtifactAttached>
<createDependencyReducedPom>true</createDependencyReducedPom>
<!-- Make sure the transitive dependencies are written to the generated pom under <dependencies> -->
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
<artifactSet>
<includes>
<include>com.ibasco.test:module-one</include>
<include>com.ibasco.test:module-two</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
<!-- Flatten -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<executions>
<execution>
<id>flatten</id>
<phase>package</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ibasco.test</groupId>
<artifactId>ucgd-parent</artifactId>
<version>2.0.0-alpha</version>
</parent>
<groupId>com.ibasco.test</groupId>
<artifactId>ucg-display</artifactId>
<version>2.0.0-alpha</version>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<scope>compile</scope>
<optional>false</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classesDirectory>src</classesDirectory>
<excludes>
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>aggregate-javadocs</id>
<phase>package</phase>
<goals>
<goal>aggregate-jar</goal>
</goals>
<configuration>
<includeDependencySources>true</includeDependencySources>
<dependencySourceIncludes>
<dependencySourceInclude>com.ibasco.test:*</dependencySourceInclude>
</dependencySourceIncludes>
<dependencySourceExcludes>
<dependencySourceExclude>com.ibasco.test:module-three</dependencySourceExclude>
</dependencySourceExcludes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createSourcesJar>true</createSourcesJar>
<shadedArtifactAttached>false</shadedArtifactAttached>
<createDependencyReducedPom>true</createDependencyReducedPom>
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
<artifactSet>
<includes>
<include>com.ibasco.test:module-one</include>
<include>com.ibasco.test:module-two</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<executions>
<execution>
<id>flatten</id>
<phase>package</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我的问题是默认参数 createDependencyReducedPom=true 以错误的方式修改了父工件的 relativePath,无法用 CI_friendly_version 属性(又名 ${revision}(参见下面的快照)
很好玩
这看起来工作正常,并展平了带阴影的 pom 文件而不是根目录
尽管指定了阶段,但顺序非常重要 -
安装和发布的pom和jar是shaded jar, flattened pom
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.2.5</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenedPomFilename>flatter.pom</flattenedPomFilename>
</configuration>
<executions>
<execution>
<id>flatten22</id>
<phase>verify</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean22</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.coderplus.maven.plugins</groupId>
<artifactId>copy-rename-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>copy-file</id>
<phase>verify</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<sourceFile>flatter.pom</sourceFile>
<destinationFile>dependency-reduced-pom.xml</destinationFile>
</configuration>
</execution>
</executions>
</plugin>
如何同时使用maven-flatten-plugin和maven-shade-plugin?
我使用 revision
、sha1
、changelist
来管理多模块项目的版本。
为了部署可消耗的工件,我使用 maven-flatten-plugin 生成一个扁平化的 pom,它使 ${revision} 具有实际价值。
但是 maven-shade-plugin 生成了一个缩减的 pom,${revision} 没有改变。
如何指定maven-shade-plugin使用扁平化pom来缩减pom。
我遇到了与 ${revision} 属性 相同的问题,但使用了选项
<createDependencyReducedPom>false</createDependencyReducedPom>
解决了我的问题。如果您需要减少依赖性的 pom,则此解决方案不起作用。
https://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html
我今天遇到了同样的问题,但我在网上找不到真正的解决方案。虽然 PaulT 的建议可能对某些人有用,但我发现这是不可接受的,因为尽管将 <promoteTransitiveDependencies>
设置为 true
.
我可以通过简单地更改 flatten
和 shade
之间的执行顺序来解决这个问题。您只需要确保 flatten
运行 AFTER shade
。如果您在父 pom 中定义了 flatten 插件,只需在具有相同执行 ID 的聚合器项目中添加相同的插件定义。
之前(原始顺序):
之后(修改顺序):
示例:
父项目 (POM)
<?xml version="1.0" encoding="UTF-8"?> <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>com.ibasco.test</groupId> <artifactId>ucgd-parent</artifactId> <packaging>pom</packaging> <version>${revision}</version> <properties> <revision>2.0.0-alpha</revision> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <modules> <module>module-one</module> <module>module-two</module> <module>module-three</module> <module>assembly</module> </modules> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.1.0</version> <configuration> <updatePomFile>true</updatePomFile> <flattenMode>resolveCiFriendliesOnly</flattenMode> </configuration> </plugin> </plugins> </pluginManagement> <plugins> <!-- Flatten --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <executions> <execution> <id>flatten</id> <phase>package</phase> <goals> <goal>flatten</goal> </goals> </execution> <execution> <id>flatten.clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
聚合器项目 (POM)
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>ucgd-parent</artifactId> <groupId>com.ibasco.test</groupId> <version>${revision}</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ucg-display</artifactId> <packaging>jar</packaging> <dependencies> <dependency> <groupId>com.ibasco.test</groupId> <artifactId>module-two</artifactId> </dependency> <dependency> <groupId>com.ibasco.test</groupId> <artifactId>module-one</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <!-- A little workaround to disable the jar warning --> <classesDirectory>src</classesDirectory> <excludes> <exclude>**</exclude> </excludes> </configuration> </plugin> <!-- Javadoc --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>aggregate-javadocs</id> <phase>package</phase> <goals> <goal>aggregate-jar</goal> </goals> <configuration> <includeDependencySources>true</includeDependencySources> <dependencySourceIncludes> <dependencySourceInclude>com.ibasco.test:*</dependencySourceInclude> </dependencySourceIncludes> <dependencySourceExcludes> <dependencySourceExclude>com.ibasco.test:module-three</dependencySourceExclude> </dependencySourceExcludes> </configuration> </execution> </executions> </plugin> <!-- Shade plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createSourcesJar>true</createSourcesJar> <shadedArtifactAttached>false</shadedArtifactAttached> <createDependencyReducedPom>true</createDependencyReducedPom> <!-- Make sure the transitive dependencies are written to the generated pom under <dependencies> --> <promoteTransitiveDependencies>true</promoteTransitiveDependencies> <artifactSet> <includes> <include>com.ibasco.test:module-one</include> <include>com.ibasco.test:module-two</include> </includes> </artifactSet> </configuration> </execution> </executions> </plugin> <!-- Flatten --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <executions> <execution> <id>flatten</id> <phase>package</phase> <goals> <goal>flatten</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
输出:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ibasco.test</groupId>
<artifactId>ucgd-parent</artifactId>
<version>2.0.0-alpha</version>
</parent>
<groupId>com.ibasco.test</groupId>
<artifactId>ucg-display</artifactId>
<version>2.0.0-alpha</version>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
<scope>compile</scope>
<optional>false</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classesDirectory>src</classesDirectory>
<excludes>
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>aggregate-javadocs</id>
<phase>package</phase>
<goals>
<goal>aggregate-jar</goal>
</goals>
<configuration>
<includeDependencySources>true</includeDependencySources>
<dependencySourceIncludes>
<dependencySourceInclude>com.ibasco.test:*</dependencySourceInclude>
</dependencySourceIncludes>
<dependencySourceExcludes>
<dependencySourceExclude>com.ibasco.test:module-three</dependencySourceExclude>
</dependencySourceExcludes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createSourcesJar>true</createSourcesJar>
<shadedArtifactAttached>false</shadedArtifactAttached>
<createDependencyReducedPom>true</createDependencyReducedPom>
<promoteTransitiveDependencies>true</promoteTransitiveDependencies>
<artifactSet>
<includes>
<include>com.ibasco.test:module-one</include>
<include>com.ibasco.test:module-two</include>
</includes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<executions>
<execution>
<id>flatten</id>
<phase>package</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我的问题是默认参数 createDependencyReducedPom=true 以错误的方式修改了父工件的 relativePath,无法用 CI_friendly_version 属性(又名 ${revision}(参见下面的快照)
很好玩
这看起来工作正常,并展平了带阴影的 pom 文件而不是根目录
尽管指定了阶段,但顺序非常重要 - 安装和发布的pom和jar是shaded jar, flattened pom
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.2.5</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenedPomFilename>flatter.pom</flattenedPomFilename>
</configuration>
<executions>
<execution>
<id>flatten22</id>
<phase>verify</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean22</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.coderplus.maven.plugins</groupId>
<artifactId>copy-rename-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>copy-file</id>
<phase>verify</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<sourceFile>flatter.pom</sourceFile>
<destinationFile>dependency-reduced-pom.xml</destinationFile>
</configuration>
</execution>
</executions>
</plugin>