【问题标题】:Unresolved dependency in published assembly package in SBTSBT 中已发布程序集包中未解决的依赖关系
【发布时间】:2019-01-12 23:20:03
【问题描述】:

在我的项目中,根目录下有 3 个子项目。 build.sbt 如下。 proj_C 取决于 proj_A 和 proj_B。 如果我使用以下命令创建了程序集 proj_C 包。成功了,组装包可以导入到其他项目中了。

sbt "project proj_C" 程序集

如果我使用“sbt publish”发布,就像我在 proj_C 设置中定义的 addArtifact 一样,还会生成一个程序集 jar 包然后发布。但是当我尝试编译另一个导入这个程序集 jar 的项目时,它会出现错误

[错误] 未解决的依赖项:proj_A;1.0.0: 未找到

build.sbt 的一部分如下。谁能指出我做错了什么? 非常感谢!

artifact in (Compile, assembly) := {
  val art = (artifact in (Compile, assembly)).value
  art.withClassifier(Some("assembly"))
}

lazy val assemblySettings = Seq(
  assemblyMergeStrategy in assembly := {
    {
      case PathList("META-INF", xs @ _*) => MergeStrategy.discard
      case _ => MergeStrategy.first
    }
  }
)

lazy val root = Project(base = file("."))
  .disablePlugins(sbtassembly.AssemblyPlugin)
  .aggregate(proj_A, proj_B, proj_C)
  .settings(
    commonSettings,
    skip in publish := true,
    name := "proj_root"
  )

lazy val proj_A= (project in file("proj_A"))
  .disablePlugins(sbtassembly.AssemblyPlugin)
  .settings(
    commonSettings,
    skip in publish := true,
    name := "proj_A"
  )

lazy val proj_B= (project in file("proj_B"))
  .disablePlugins(sbtassembly.AssemblyPlugin)
  .settings(
    commonSettings,
    skip in publish := true,
    name := "proj_B"
  )

lazy val proj_C= (project in file("proj_C"))
  .settings(
    commonSettings,
    assemblySettings,
    addArtifact(artifact in (Compile, assembly), assembly),
    name := "proj_C"
  ) dependsOn(proj_A, proj_B)

【问题讨论】:

  • 在这种情况下,“汇编”实际上是在谈论机器代码的汇编语言,比如mov eax, [rsi + rax*4] (x86-64)? java-bytecode-asm.net-assembly 有单独的标签,但我不知道这些标签是否适用,或者您是否正在使用 SBT 构建汇编语言项目。如有必要,请修复标签。 (见stackoverflow.com/tags/assembly/info)。
  • 应该是 sbt-assembly。很抱歉造成混乱。我正在使用 sbt 插件进行组装: addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
  • 找到了原因,但仍然没有优雅的解决方案。发布中的程序集 jar 是可以的。但是与程序集 jar 一起的 .pom 文件定义了对 proj_A 和 proj_B 的依赖关系。所以我需要想办法在生成汇编jar的时候自定义pom文件。

标签: sbt publish sbt-assembly


【解决方案1】:

首先,我希望你知道the publishing of the fat jar is not recommended。老实说,在你的情况下,我真的认为这样做没有任何好处。

如果您只是单独发布ABC,然后将依赖项添加到您的其他项目中,它将全部自动下载(以及这些项目的依赖项)。而且依赖管理会容易得多...


但是,由于您要添加 A-assembly 依赖项,因此我猜您实际上添加了错误的 jar。我的猜测是您同时发布了C.jarC-assembly.jar,并且添加了如下依赖项:

"your.organisation" %% "C" % "version"

但你应该有:

"your.organisation" %% "C" % "version" classifier "assembly"

【讨论】:

  • 同意尽量不要发布胖罐子。我们在 proj_C 中提供服务,因此我们不想将 A 和 B 暴露给客户。我现在的发现是,程序集包 C 是使用“sbt publish”正确生成的。但是发布过程中生成的 .pom 文件定义了对项目 A 的依赖。这是在发布过程中,所以我不知道我们是否有办法改变行为。我目前的解决方法是使用来自项目 A、B 和 C 的源文件创建一个新项目并发布该项目(当然这里没有组装)。这不是一种优雅的方式,但它确实有效。
  • 您是否尝试过手动修改 pom 并检查它是否可以工作?
  • 文件生成发布后无权写入:(
  • 你在本地有.m2
  • 我可以修改本地的,但无权将其上传到 repo :(
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2014-12-18
  • 2012-02-02
  • 2017-10-29
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多