首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过SBT程序集解决创建JAR的依赖关系

通过SBT程序集解决创建JAR的依赖关系
EN

Stack Overflow用户
提问于 2013-10-26 11:39:48
回答 2查看 4.6K关注 0票数 4

我想要创建一个大的Jar文件。其中我试图使用SBT程序集。我从GitHub和这个回答安装了sbt程序集。当我运行sbt assembly时,我得到了以下错误:

代码语言:javascript
复制
java.lang.RuntimeException: deduplicate: different file contents found in the following:
/home/UserName/.ivy2/cache/org.eclipse.jetty.orbit/javax.servlet/orbits/javax.servlet-2.5.0.v201103041518.jar:javax/servlet/SingleThreadModel.class
/home/UserName/.ivy2/cache/org.mortbay.jetty/servlet-api/jars/servlet-api-2.5-20081211.jar:javax/servlet/SingleThreadModel.class

为了解决这个问题,我跟踪了用户的自述页面,这是他建议的代码。

代码语言:javascript
复制
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
  {
    case PathList("org", "apache", xs @ _*) => MergeStrategy.last
    case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
    case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
    case PathList("project.clj") => MergeStrategy.last
    case PathList("overview.html") => MergeStrategy.last
    case x => old(x)
  }
}

即使在添加了这段代码之后,我也会得到前面提到的相同错误。请让我知道我错过了什么。如对此错误有任何帮助,将不胜感激。谢谢!

更新2 :

按照给定的链接添加了退出规则,

代码语言:javascript
复制
libraryDependencies ++= Seq("org.apache.spark" %% "spark-core" % "0.8.0-incubating","com.codahale" % "jerkson_2.9.1" % "0.5.0","org.skife.com.typesafe.config" % "typesafe-config" % "0.3.0").map(_.exclude("javax", "servlet"))

更新3:

我可以找到导致这个问题的库。

代码语言:javascript
复制
| +-org.apache.avro:avro-ipc:1.7.4
| | +-io.netty:netty:3.4.0.Final (evicted by: 3.5.4.Final)
| | +-io.netty:netty:3.5.4.Final
...
...
| | +-org.mortbay.jetty:jetty-util:6.1.26
| | +-org.mortbay.jetty:jetty:6.1.26
| | | +-org.mortbay.jetty:jetty-util:6.1.26
| | | +-org.mortbay.jetty:servlet-api:2.5-20081211
| | | 
| | +-org.mortbay.jetty:servlet-api:2.5-20081211
| | +-org.slf4j:slf4j-api:1.7.2
...
... 
| +-org.eclipse.jetty:jetty-server:7.6.8.v20121106
| | +-org.eclipse.jetty.orbit:javax.servlet:2.5.0.v201103041518

更新4:修复

,所以添加MergeStrategy确实解决了这个问题。,即使我有相当多的依赖关系,超过10个,添加MergeStrategy为每个单独的解决了这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-26 13:56:50

我认为您正在尝试治疗这些症状,但您的问题实际上不是组装:您的项目在类路径(javax.servlet)上有两个不同版本的库。

如果这些版本是二进制兼容的(我不知道),您可以排除构建文件就像这样中的两次出现之一。如果它们不兼容,则需要展开依赖关系图(这样做的一个好方法可能是依赖关系图插件),并尝试找到匹配的版本。

在任何情况下,(至少是暂时的)将库保存在项目文件夹中可能是有用的。如果将retrieveManaged in ThisBuild := true添加到sbt构建文件中,则所有库都将在<project-root>/lib_managed中找到。这可以让你看到实际存在的罐子。

编辑:显示依赖关系图:

添加到project/plugins.sbt

代码语言:javascript
复制
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4")

添加到build.sbt

代码语言:javascript
复制
net.virtualvoid.sbt.graph.Plugin.graphSettings

然后运行sbt dependency-graph

票数 4
EN

Stack Overflow用户

发布于 2014-04-21 10:54:21

您还可以参考这个科技博客

使用sbt-程序集为Spark项目创建一个JAR

这篇文章是关于如何使用sbt插件为星火流项目创建一个胖罐子。sbt -程序集是一个sbt插件,用于创建一个包含所有依赖项的sbt项目。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19606243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档