我发布这个问题是因为我目前正在使用 Maven 来构建胖罐子。我们所有的项目都是插件,所以我们的目标是从 MANIFEST.MF 文件中获取所有依赖项,以便构建胖 jar。
第一个问题是我们的一些依赖项在系统范围内(例如 com.google.guava),当我们构建中间 jars 时,进一步的项目需要它们,它们在提供的范围内。所以我决定避免使用 shade-plugin,因为它似乎无法配置范围。
我选择使用 maven-assembly,因为它似乎是处理我们构建的最有表现力的方式,使用以下自定义程序集文件来收集来自所有范围的依赖项:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>provided</scope>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>system</scope>
</dependencySet>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
我不得不将 unpack 设置为 true 因为我们需要可执行 jar,而且在使用 maven-assembly 时似乎也无法轻松处理“jar-in-jar”加载(如果你有任何解决方案,我也很感兴趣)。
我遇到的问题是,对于一个特定的项目,我们需要在我们的一个 MANIFEST.MF 文件中使用 bundle org.apache.commons.lang;bundle-version="2.6.0" ,它会以某种方式导致异常:
执行目标 org.apache.maven.plugins:maven-assembly-plugin:3.3.0:single 的组装失败:org/apache/commons/lang/math/JVMRandom.class 的 SHA1 签名文件摘要无效
当我调查时,我在依赖项中发现了一个签名的清单文件 + ECLIPSE_.RSA & ECLIPSE_.SF,所以我在解压时尝试至少排除这些文件:
...
<unpackOptions>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</unpackOptions>
...
对于每个标签,但我仍然遇到相同的错误。
最后,我有点不知道我应该做什么。忽略依赖(在运行最终的 jar 时会导致错误)?找到忽略此类错误的方法?
感谢您的阅读。