【问题标题】:Hiding manifest entries with maven使用 Maven 隐藏清单条目
【发布时间】:2014-09-25 17:22:54
【问题描述】:

使用 maven 构建 jar 文件时,它会在 META-INF/MANIFEST.MF 中创建一个清单文件。目前其内容为:

Manifest-Version: 1.0                                                                    
Archiver-Version: Plexus Archiver
Built-By: <my username>
Created-By: Apache Maven 3.1.0
Build-Jdk: 1.8.0_5

如何隐藏清单条目?特别是我想隐藏“Built-By:”条目,因为我看不出 jar 应该包含我的用户名的任何理由。

【问题讨论】:

  • 我有同样的问题,即使它不限于特别是内置的,我还没有找到任何解决方案。我在这个问题上悬赏,因为我也准确地找到了你在 cmets 中找到的这个问题的唯一答案。

标签: java maven pom.xml manifest.mf


【解决方案1】:

添加

<addDefaultImplementationEntries>false</addDefaultImplementationEntries>

到 pom.xml 中的 maven-jar-plugin 的配置部分以完全删除默认属性:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
        </manifest>
      </archive>
    </configuration>
  </plugin>

自定义它(仅删除用户名):

    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Built-By></Built-By>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

【讨论】:

  • 第二种解决方案有效(条目仍在清单中,但是条目)。第一个解决方案没有,默认条目仍然在我的清单中。根据the documentation,addDefaultImplementationEntries 仅用于 Implementation-* 条目。
  • 啊!我的错!使用它来完全删除生成的属性:falsestackoverflow.com/questions/13218313/…
  • 据我所知,这仅影响默认情况下包含在 jar 中的 pom.xml,但不影响 MANIFEST.MF。
  • 那么这是双重错误)只需创建自己的空文件并将其用作: src/custom-manifest.txt
  • 这与在&lt;manifestEntries&gt; 中指定条目的作用相同,自定义清单与默认清单合并,但条目不会消失。
【解决方案2】:

maven-achiver plugin documentation 似乎很清楚,您无法删除属性,只能按照Alex Chernyshev's answer 中的说明将它们设置为空白。为了更好地控制 MANIFEST.MF,您不应使用 maven-archiver 插件。

另一种方法是使用maven antrun pluginAnt Jar Task 来构建Jar。

在 pom.xml 中:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <phase>package</phase>
            <configuration>
              <target>
                <jar destfile="test.jar" basedir=".">
                  <include name="build"/>
                  <manifest>
                    <attribute name="Manifest-Version:" value="1.0"/>
                  </manifest>
                </jar>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

另一种方法是直接使用 Maven exec plugin 调用 Jar 工具。

我不喜欢推荐 antrun,因为我认为这是一个肮脏的 hack,但似乎 maven-archiver 不符合您的要求。可能值得为 maven-archiver 提出功能请求。

编辑:2014-10-06 提出 Jira MSHARED-362

编辑:2018-06-18:更新了 Jira 和 Maven Exec 插件的链接

编辑:2019-01-14:针对 maven-archiver-3.4.0 的修复

【讨论】:

  • maven shade plugin的使用怎么样?
  • 我不知道如何使用 maven shade 插件来完成问题的要求。如果您知道该怎么做,请提交详细信息作为答案,我有兴趣看到它。
  • The maven-achiver plugin documentation seems pretty clear that you cannot remove properties。我不同意,在您链接到它的文档页面中,没有提到删除属性。它确实描述了默认值,但这并不一定意味着您不能删除它们。但是,这并不意味着您的答案不正确,而且看起来确实如此。
  • @RichardNeish 我已将补丁添加到您在回答中提到的 MSHARED-362 Jira 票证中。希望它会被接受。
  • 我正在处理所有这些,很快你就可以删除除Manifest-Version之外的所有这些。
【解决方案3】:

user.name 变量设置为空字符串。

mvn -Duser.name="" package

或者,如果您使用 Eclipse,请将 -Duser.name="" 添加到 Maven 运行配置的 VM 参数中(运行 -> 运行方式 -> Maven 构建... -> JRE 选项卡 -> 在 VM 参数字段中输入 -Duser.name="")。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多