通过sbt程序集构建时保留Manifest.mf
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过sbt程序集构建时保留Manifest.mf相关的知识,希望对你有一定的参考价值。
当我使用sbt assembly
构建我的项目时,我得到了java.util.zip.ZipException: duplicate entry: META-INF/MANIFEST.MF
。谷歌推荐的解决方案是使用MergeStrategy.discard
。
这有助于构建项目 - 但它在运行时崩溃,因为Dropwizard(依赖项)依赖于manifest.mf中包含的信息(完整的问题详细信息:https://github.com/dropwizard/dropwizard/issues/455)。
遇到该错误时的建议是合并清单。
我已经尝试了Manifest.MF上的所有MergeStrategies,它们看起来像是在做伎俩(filterDistinctLines
,concat
,first
,last
),它们都会导致构建失败并使用java.util.zip.ZipException: duplicate entry: META-INF/MANIFEST.MF
。唯一编译的是discard
,但由于Dropwizard依赖于mf文件,导致程序在运行时崩溃。
任何想法在这做什么?有没有办法合并清单,如https://github.com/dropwizard/dropwizard/issues/455的评论中所述?
所以我最终这样做了:
- 分离Scala和Java项目
- 按原样构建sbt项目 - 将其复制到java项目/ lib目录
- 为lib / scala项目添加了一个系统dep,并在构建fatjar时使用add-jar插件将这个jar添加到类路径中:
<plugin> <groupId>com.googlecode.addjars-maven-plugin</groupId> <artifactId>addjars-maven-plugin</artifactId> <version>1.0.5</version> <executions> <execution> <goals> <goal>add-jars</goal> </goals> <configuration> <resources> <resource> <directory>${real.base.dir}/lib</directory> </resource> </resources> </configuration> </execution> </executions> </plugin>
- 构建java项目fatjar并部署它 - 它现在可以访问类路径上的scala jar。
脚本(服务器是我制作的java项目的名称):
sbt clean assembly
cp target/scala*/project*.jar server/lib
cd server
mvn clean install
cd ../
cp server/target/server*.jar target
以上是关于通过sbt程序集构建时保留Manifest.mf的主要内容,如果未能解决你的问题,请参考以下文章
当我们尝试在 sbt 文件中使用 cloudera 上游版本时,sbt 程序集构建失败
BND 将相同的包放入 manifest.mf 的导出和导入部分