【问题标题】:Preserving Manifest.mf when building via sbt assembly通过 sbt 程序集构建时保留 Manifest.mf
【发布时间】:2018-06-11 07:40:43
【问题描述】:
当我使用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),它们都会导致构建失败并出现 @ 987654330@。唯一能编译的是discard,但这会导致程序在运行时崩溃,因为 Dropwizard 依赖于 mf 文件。
任何想法在这里做什么?有没有办法按照https://github.com/dropwizard/dropwizard/issues/455 的 cmets 中所述合并清单?
【问题讨论】:
标签:
scala
sbt
manifest
sbt-assembly
manifest.mf
【解决方案1】:
所以我最终这样做了:
- 分离 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。
脚本(server是我做的java项目的名字):
sbt clean assembly
cp target/scala*/project*.jar server/lib
cd server
mvn clean install
cd ../
cp server/target/server*.jar target