通过 sbt 程序集构建时保留 Manifest.mf

Preserving Manifest.mf when building via sbt assembly

当我使用 sbt assembly 构建我的项目时,我得到 java.util.zip.ZipException: duplicate entry: META-INF/MANIFEST.MF。 google 推荐的解决方案是使用 MergeStrategy.discard

这有助于构建项目 - 但它在运行时崩溃,因为 Dropwizard(依赖项)依赖于 manifest.mf 中包含的信息(完整问题详细信息:https://github.com/dropwizard/dropwizard/issues/455)。

遇到该错误时的建议是合并清单。

我已经在 Manifest.MF 上尝试了所有 MergeStrategies,它们似乎可以解决问题(filterDistinctLinesconcatfirstlast), 它们都会导致构建失败 java.util.zip.ZipException: duplicate entry: META-INF/MANIFEST.MF。唯一可以编译的是 discard,但由于 Dropwizard 依赖于 mf 文件,这会导致程序在运行时崩溃。

有什么想法可以在这里做什么吗?有没有办法按照 https://github.com/dropwizard/dropwizard/issues/455 的评论中所述合并清单?

所以我最终这样做了:

  • 分离 Scala 和 Java 项目
  • 按原样构建 sbt 项目 - 将其复制到 java project/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