如何在使用 Maven Shade 插件时指定自定义 MANIFEST.MF 文件?
How can I specify a custom MANIFEST.MF file while using the Maven Shade plugin?
当项目使用 Maven-jar-plugin 时,很容易在 jar 中包含自定义清单文件,但我找不到用 Maven shade 做同样事情的方法。如何在使用 "Maven-shade-plugin" 时使用我自己的清单文件?
其他详细信息:
我的自定义清单文件位于 "src/main/resources/META-INF/MANIFEST.MF"。
Maven 不包括我的文件,而是在最终的 jar 中用默认的 Maven 清单文件替换它。
我需要自定义清单文件的原因是要在我的清单中为 swing 组件库指定一些 JavaBeans 类。多个 JavaBeans 类 应按以下格式在清单文件中指定,如 described here。请注意,空行(和行分组)对于在清单中标记 JavaBeans 类 很重要。
Name: SomeBean1.class
Java-Bean: True
Name: SomeBean2.class
Java-Bean: True
Name: SomeBean3.class
Java-Bean: True
尝试过的解决方案列表(这些都不起作用):
此代码仅在使用 Maven jar 插件(而非 shade)时有效。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
This link 说 "As with all the examples here, this configuration can be used in all plugins that use Maven Archiver, not just Maven-jar-plugin as in this example." 根据该建议,我尝试了以下代码,但这也不起作用。 (Maven 仍然用默认的清单文件替换了我的清单文件。)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<archive>
<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
</archive>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>core</shadedClassifierName>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
由于以下原因,我无法将阴影 "ManifestResourceTransformer" 用作 described here 来完成这项工作。我需要将 JavaBeans 类 添加到我的清单文件中,如上文 "additional details" 所述。但是,如果我使用阴影 ManifestResourceTransformer 添加清单条目,这些条目将以不可预测(看似随机)的顺序插入到清单文件中。对于指定 JavaBeans 类,清单条目的顺序(行顺序)很重要。
我试图使用 IncludeResourceTransformer,但下面的代码产生了以下错误:"Error creating shaded jar: duplicate entry: META-INF/MANIFEST.MF".
<configuration> <shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>core</shadedClassifierName><createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/MANIFEST.MF</resource>
<file>src/main/resources/META-INF/MANIFEST.MF</file>
</transformer>
</transformers>
</configuration>
以下 pom 配置允许程序员用自定义清单文件替换 Apache Maven Shade 插件创建的清单文件。自定义清单文件应该放在maven项目的这个目录下:"src/main/resources/META-INF/MANIFEST.MF"
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
...
<transformers>
<!-- Don't do this: Avoid adding anything that makes shade create or modify a manifest file.
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mypackage.MyMainClass</mainClass>
</transformer>
-->
<!-- Add a transformer to exclude any other manifest files (possibly from dependencies). -->
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>MANIFEST.MF</resource>
</transformer>
<!-- Add a transformer to include your custom manifest file. -->
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/MANIFEST.MF</resource>
<file>src/main/resources/META-INF/MANIFEST.MF</file>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
当项目使用 Maven-jar-plugin 时,很容易在 jar 中包含自定义清单文件,但我找不到用 Maven shade 做同样事情的方法。如何在使用 "Maven-shade-plugin" 时使用我自己的清单文件?
其他详细信息:
我的自定义清单文件位于 "src/main/resources/META-INF/MANIFEST.MF"。 Maven 不包括我的文件,而是在最终的 jar 中用默认的 Maven 清单文件替换它。
我需要自定义清单文件的原因是要在我的清单中为 swing 组件库指定一些 JavaBeans 类。多个 JavaBeans 类 应按以下格式在清单文件中指定,如 described here。请注意,空行(和行分组)对于在清单中标记 JavaBeans 类 很重要。
Name: SomeBean1.class
Java-Bean: True
Name: SomeBean2.class
Java-Bean: True
Name: SomeBean3.class
Java-Bean: True
尝试过的解决方案列表(这些都不起作用):
此代码仅在使用 Maven jar 插件(而非 shade)时有效。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin>
This link 说 "As with all the examples here, this configuration can be used in all plugins that use Maven Archiver, not just Maven-jar-plugin as in this example." 根据该建议,我尝试了以下代码,但这也不起作用。 (Maven 仍然用默认的清单文件替换了我的清单文件。)
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>core</shadedClassifierName> <createDependencyReducedPom>false</createDependencyReducedPom> <minimizeJar>true</minimizeJar> </configuration> </execution> </executions> </plugin>
由于以下原因,我无法将阴影 "ManifestResourceTransformer" 用作 described here 来完成这项工作。我需要将 JavaBeans 类 添加到我的清单文件中,如上文 "additional details" 所述。但是,如果我使用阴影 ManifestResourceTransformer 添加清单条目,这些条目将以不可预测(看似随机)的顺序插入到清单文件中。对于指定 JavaBeans 类,清单条目的顺序(行顺序)很重要。
我试图使用 IncludeResourceTransformer,但下面的代码产生了以下错误:"Error creating shaded jar: duplicate entry: META-INF/MANIFEST.MF".
<configuration> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>core</shadedClassifierName><createDependencyReducedPom>false</createDependencyReducedPom> <minimizeJar>true</minimizeJar> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> <resource>META-INF/MANIFEST.MF</resource> <file>src/main/resources/META-INF/MANIFEST.MF</file> </transformer> </transformers> </configuration>
以下 pom 配置允许程序员用自定义清单文件替换 Apache Maven Shade 插件创建的清单文件。自定义清单文件应该放在maven项目的这个目录下:"src/main/resources/META-INF/MANIFEST.MF"
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
...
<transformers>
<!-- Don't do this: Avoid adding anything that makes shade create or modify a manifest file.
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mypackage.MyMainClass</mainClass>
</transformer>
-->
<!-- Add a transformer to exclude any other manifest files (possibly from dependencies). -->
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>MANIFEST.MF</resource>
</transformer>
<!-- Add a transformer to include your custom manifest file. -->
<transformer implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/MANIFEST.MF</resource>
<file>src/main/resources/META-INF/MANIFEST.MF</file>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>