如何在使用Maven Shade插件时指定自定义MANIFEST.MF文件?

时间:2016-07-07 10:31:12

标签: maven javabeans maven-shade-plugin manifest.mf

当一个项目使用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

尝试解决方案的列表(这些不起作用):

1)此代码仅在使用maven jar插件(不是阴影)时有效。

  <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>

2)This link说“与这里的所有示例一样,此配置可用于所有使用Maven Archiver的插件,而不仅仅是maven-jar-plugin,如本例所示。”基于该建议,我尝试了以下代码,但这也没有用。 (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>

3)我不能使用阴影“ManifestResourceTransformer”作为described here来完成这项工作,原因如下。我需要将JavaBeans类添加到我的清单文件中,如上面“附加详细信息”中所述。但是,如果我使用阴影ManifestResourceTransformer添加清单条目,那些条目将以不可预测(随机看似)的顺序插入清单文件中。对于指定JavaBeans类,清单条目的排序(行顺序)很重要。

4)我尝试使用IncludeResourceTransformer,但下面的代码会产生以下错误:“创建着色jar时出错:重复条目: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>

提前感谢您的任何帮助!

1 个答案:

答案 0 :(得分:3)

以下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>
相关问题