SBT包JAR文件,用于其他项目的lib文件夹

时间:2017-05-05 22:37:02

标签: java scala intellij-idea jar sbt

如何创建一个可以放在lib文件夹中的Jar文件,从而可以导入它的类?

我使用 sbt package 命令从SBT项目创建了一个jar文件。

要查看其内容,我输出 jar -tf myJarFile.jar

META-INF/MANIFEST.MF
fileprocs/
fileprocs/util/
fileprocs/util/PathsAndNames.class
fileprocs/Directory.class
fileprocs/util/PathsAndNames$.class
fileprocs/util/CurriedWorkAction.class
fileprocs/util/CurriedWorkAction$.class
fileprocs/Directory$.class

我将jar文件复制到另一个项目的lib文件夹中,在这个文件夹中你可以看到Apache Jsvc的jar文件。这些其他jar文件是可扩展的,我可以像这样导入它们的内容:

import org.apache.commons.daemon.Daemon;

1

然而,我的jar文件不可扩展,我无法导入它的成员,如果我尝试得到未解决的符号错误。使用 sbt assembly 和胖jar创建插件时,我有类似的结果。

1 个答案:

答案 0 :(得分:2)

这不会直接解决您报告的问题,但这是您可能更喜欢原始方法的解决方法。

首先,在 SBT 项目中创建 jar 文件,而不是运行sbt package然后手动复制生成的文件,您可能需要考虑将其发布到您当地的 ivy 存储库。这实际上非常简单:只需输入命令sbt publishLocal即可。这将打包 jar 文件发布到(我猜测,来自 jar 文件的内容,并假设您的< em> jar 文件名为bpfm_2.12-1.0.jar):

C:\Users\youraccount\.ivy2\local\fileprocs\bpfm_2.12\1.0\jars\bpfm_2.12.jar

注意:实际位置可能会有所不同,但它并不相关 - 它将位于您当地的 ivy 存储库中, SBT 将知道在何处找到它。以上假设您在bpfm jar 文件的build.sbt文件中定义了以下属性:

name := "bpfm"

organization := "fileutils"

version := "1.0"

如果您还将 SBT 与上面的 Apache Commons守护程序IntelliJ 项目一起使用,而不是手动将此 jar 文件复制到{{1目录,您可以将其指定为依赖项。将以下行添加到该项目的 SBT lib文件中:

build.sbt

SBT 尝试解决此依赖关系时,它会在本地 ivy 存储库中找到它。无需复制任何东西! IntelliJ 可以设置为使用 SBT 来执行构建,这意味着它也会自动将 jar 文件作为依赖项提取。更重要的是,如果这个 jar 文件有任何自己的依赖项,它们也会被捕获到本地 ivy 存储库中,所以你永远不必担心将它们复制过来。

实际上,您也可以将 Apache Commons守护程序库添加为依赖项。将以下行添加到 SBT libraryDependencies += "fileprocs" %% "bpfm" % "1.0" 文件中:

build.sbt

(实际上,您应该只将 jars 添加到libraryDependencies += "commons-daemon" % "commons-daemon" % "1.0.15" ,这些是通过存储库无法使用的。转到Maven central repository以查找可以包含为依赖项的工件。 )

或者,您可以使用单个属性添加两个依赖项:

lib

如果您选择这样做,请从项目中删除libraryDependencies ++= Seq( "commons-daemon" % "commons-daemon" % "1.0.15", "fileprocs" %% "bpfm" % "1.0" ) 目录及其内容。 (还有其他好处:将库引用为依赖关系会占用lib存储库中较少的空间,并使合并和分支更简单。)

注意:只要您从未计划将任何工作发布到公共存储库,这样就可以了,因为git不是有效的域名(因此您不能拥有它。)