Sbt-assembly,Ivy,classpath

时间:2017-01-04 15:21:27

标签: java scala sbt ivy sbt-assembly

我很长时间都在努力,所以任何帮助都会受到赞赏 我有一个公共库myCommonLib,它有一个依赖关系,我需要用sbt-assembly进行着色 当我将它发布到我当地的Ivy repo时,我得到2个版本,一个“普通”版本(像往常一样)和一个阴影版本(所有依赖项都捆绑在一起),当然还附加了“-assembly”。

问题是当我使用“正常”依赖时,我得到NoClassDefFoundError引用阴影版本!!!

我试图从类路径中完全删除它:

dependencyClasspath in Runtime := {
  val allFiles: Seq[Attributed[File]] = (dependencyClasspath in Runtime).value
  allFiles.filterNot(_.data.getName.toLowerCase.contains("-assembly"))
}

但它不起作用,仍然是同样的错误。

但是,当我从Ivy XML中删除它(注释掉)时,它确实有效:

<artifact name="myCommonLib_2.11" type="jar" ext="jar" conf="compile,runtime,test,provided,optional,sources,docs,pom" e:classifier="assembly"/>

我错过了什么?

2 个答案:

答案 0 :(得分:0)

您可以通过执行此操作

将其排除在构建版本中
libraryDependencies ++= Seq(
  "some" % "myCommonLib" % "1.0" excludeAll(
      ExclusionRule(organization = "yourOrganisation", name = "dependency name"),
      ...
)

这里是必要的文档:http://www.scala-sbt.org/0.12.2/api/sbt/ExclusionRule.html

答案 1 :(得分:0)

我现在设法让它发挥作用...... 当我指定确切的工件时,它似乎有效,如下所示:

val myCommonLibArtifact = Artifact(
  name="myCommonLib", `type`="jar", extension="jar", classifier=None,
  configurations=Seq(Compile), url=None, extraAttributes=Map())

libraryDependencies ++= Seq(
  "ba.sake" %% "myCommonLib" % "0.0.1" artifacts (myCommonLibArtifact)      
)