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

时间:2018-01-01 02:05:03

标签: scala sbt manifest sbt-assembly 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,看起来他们就是这样做的(filterDistinctLinesconcatfirstlast),他们所有导致构建失败的java.util.zip.ZipException: duplicate entry: META-INF/MANIFEST.MF。唯一编译的是discard,但由于Dropwizard依赖于mf文件,导致程序在运行时崩溃。

任何想法在这做什么?有没有办法合并清单,如https://github.com/dropwizard/dropwizard/issues/455的评论中所述?

1 个答案:

答案 0 :(得分:0)

所以我最终这样做了:

  • 分开Scala& Java项目
  • 按原样构建sbt项目 - 将其复制到java项目/ lib目录
  • 为lib / scala项目添加了一个系统dep,并在构建fatjar时使用add-jar插件将此jar添加到类路径中:

    sed '/^<Element TheSearchedElement>$/,\@^</Element>@{/second/s/content/repl/; }' input
    
  • 构建java项目fatjar并进行部署 - 它现在可以访问类路径上的scala jar。

脚本(服务器是我制作的java项目的名称):

       <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>