【问题标题】:How can I specify a custom MANIFEST.MF file while using the Maven Shade plugin?如何在使用 Maven Shade 插件时指定自定义 MANIFEST.MF 文件?
【发布时间】:2016-11-09 15:20:40
【问题描述】:

当项目使用 Maven-jar-plugin 时,很容易在 jar 中包含自定义清单文件,但我找不到使用 Maven shade 做同样事情的方法。在使用“Maven-shade-plugin”时如何使用我自己的清单文件?

其他详情:

我的自定义清单文件位于“src/main/resources/META-INF/MANIFEST.MF”中。 Maven 不包括我的文件,而是在最终 jar 中用默认的 Maven 清单文件替换它。

我需要自定义清单文件的原因是在我的清单中指定一些 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 插件(不是 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>
    
  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>
    

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 2021-01-14
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多