5

我正在编写一个依赖于代码(我们称之为foo.jar)的库,它只能作为二进制 jar 使用。按照标准,我将其放在lib/目录中,因此 SBT 会将 is 视为非托管依赖项。到目前为止这很好。

但是,由于这是一个库,我希望能够发布它,以便依赖它的其他项目也可以访问非托管代码,foo.jar而无需手动定位它。我最初认为我可以使用像SBT Assembly这样的胖 jar 插件来创建一个带有依赖项的 jar,但这不会影响实际发布的内容sbt publish-local——它只会在你运行时创建一个胖 jar sbt assembly。有没有一些标准的简单方法来处理这个?对于每个使用非托管依赖项在下游其他项目使用时中断的库来说,这似乎是一个坏主意,所以我想知道我是否遗漏了一些明显的东西。

4

2 回答 2

4

我不知道这是否对 sbt-assembly 有用,因为其他库可能依赖于不同版本的foo.jaretc。

解决它的一种方法是foo.jar自己在 Maven 存储库中发布。Scala 和/或 sbt 社区中的一些人一直在谈论bintray。它仍处于测试阶段,但如果你想发布一些 jar,它看起来很有希望。

于 2013-08-20T07:42:49.543 回答
2

您可以通过操作来获得所需的结果,mappings in (Compile, packageBin)以包含您希望打包 jar 具有的文件(publish使用来自的输出packageBin)。这种技术将允许您在 jar 中包含您想要的任何文件。官方 sbt 文档在这里:http ://www.scala-sbt.org/0.12.3/docs/Howto/package.html#contents

例如,考虑在 jar 中包含 .properties 文件的常见情况。假设您需要在打包的 jar 中的路径“com/bigco/messages.properties”下包含“messages.properties”。假设该文件位于 src/main/scala/ 下...您可以将以下内容添加到 build.sbt 中:

mappings in (Compile, packageBin) <+= baseDirectory map { base =>
  (base / "src" / "main" / "scala" / "com" / "bigco" / "messages.properties") -> "com/bigco/messages.properties"
}

要尝试回答您的原始问题,您可以根据正确的包路径解压缩foo.jar并将其中的每个文件添加到打包的 jar 中。class所以类似于

mappings in (Compile, packageBin) <+= baseDirectory map { base => 
  (base / path / to / unzipped / file.class) -> "path.to.unzipped.file.class"
  ...
}

或者,您可以foo.jar像这样简单地包含在打包 jar 的根目录中:

mappings in (Compile, packageBin) <+= baseDirectory map { base => 
  (base / "lib" / "foo.jar") -> "foo.jar"
}
于 2015-05-05T20:34:44.467 回答