如何创建一个可以放在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;
然而,我的jar文件不可扩展,我无法导入它的成员,如果我尝试得到未解决的符号错误。使用 sbt assembly 和胖jar创建插件时,我有类似的结果。
答案 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
不是有效的域名(因此您不能拥有它。)