【问题标题】:Maven : Modifying the manifest files of dependency JARsMaven:修改依赖 JAR 的清单文件
【发布时间】:2013-07-25 07:36:46
【问题描述】:

任何帮助或指点将不胜感激。 我需要在构建时将两个字段注入到我的项目的所有依赖项 JAR 的清单文件中。

依赖 jars 已经构建并从 repo 中提取。 我需要找到一种方法来获取 JAR 的 Manifest 文件,然后使用当前 pom 文件中的变量对其进行修改。 有没有人这样做过,知道如何做到这一点。 提前感谢您的时间和回复

【问题讨论】:

  • 您为什么要这样做,因为这些工件已经构建,换句话说就是不可变的。您可以通过 maven-dependency-plugin 和 maven-assembly-plugin 的组合来更改这些工件,但它会产生一个非常大的 pom 文件。另一方面,您正在更改已经构建的工件,这将违背 Maven 的想法。
  • @Wimpie 你找到解决方案了吗?
  • maven-assembly-plugin 允许您指定清单配置,但是目前有一个bug 可以防止将现有清单与其他清单条目合并。我发现这个是因为我尝试做同样的事情但失败了。
  • 可以使用 shade 插件从您的依赖项创建一个 uber-jar:maven.apache.org/plugins/maven-shade-plugin 并按照您需要的方式修改 Manifest
  • 您能否详细说明您想要完成的工作?为什么需要修改清单?您要替换哪些变量?

标签: maven jar dependency-injection


【解决方案1】:

这并不是 Maven 允许您做的事情。从 Maven 的角度来看,每个具有特定名称的 JAR 都应该与每个具有相同名称的其他 JAR 完全相同。

例如,假设我的项目依赖于abc-1.0.jar。我指定此依赖项是因为 ALphabet 团队发布了一个 abc 库,其中包含 1.0 版本的指定 API。我应该能够从世界上的任何存储库中获取这个 jar 文件,甚至当我的 Internet 中断时从街上的邻居那里获取并手动将其安装到我的本地存储库,并且它应该是完全相同的文件。如果它不是同一个文件,那么我将无法保证 jar 中的 .class 文件将包含我需要使我的构建成功且没有错误的库代码。

如果您真的有动力完成这项工作,那么理论上是可行的。您可以编写一个脚本:

  1. 解析 properties 部分的 POM XML,并从那里解析出各个属性以及依赖项 jar 的名称
  2. 对于每个带有分类器“manifest_injected”的依赖 jar,尝试在本地存储库中找到它。如果不存在,则生成一个具有给定依赖项的空 Maven 项目(没有 manifest_injected 分类器),在其上运行 mvn validate 以确保已下载依赖项并将其放置在本地存储库中(如果已找到)
  3. 克隆所有上述 JAR 文件,打开克隆,使用之前解析的属性执行所需的清单注入,并将注入的 jar 保存到 Maven 存储库中的适当位置
  4. 调用作为参数传递给脚本的 Maven 构建。

祝你好运!

【讨论】:

    【解决方案2】:

    您可以在二进制存储库中轻松完成。例如,Artifactory 允许您写a user plugin that will be triggered on any download。在这个监听器中,您可以编写自己的代码 - 打开 jar,更改清单并提供更改后的 jar 而不是原始 jar(并将其缓存以备下次使用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多