如何创建一个Jar文件,该文件可以放在lib文件夹中,从而使我能够导入它的类?
我使用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的jar文件。这些其他jar文件是可扩展的,我可以导入它们的内容如下:
import org.apache.commons.daemon.Daemon;
但是,我的jar文件是不可扩展的,我不能导入它的成员,如果我试图得到未解决的符号错误。我在使用sbt程序集和fat jar一起创建插件时也有类似的结果。
发布于 2017-05-05 20:01:43
这将不会直接解决您报告的问题,但这是一个解决方法,您可能更喜欢您的原始方法。
首先,在创建jar文件的SBT项目中,您可能需要考虑将其发布到本地常春藤存储库,而不是运行sbt package
,然后手动复制结果文件。这实际上非常简单:只需输入命令sbt publishLocal
即可。这将打包jar文件,并将jar文件发布到(我猜,从jar文件的内容,并假设jar文件名为bpfm_2.12-1.0.jar
):
C:\Users\youraccount\.ivy2\local\fileprocs\bpfm_2.12\1.0\jars\bpfm_2.12.jar
注意:实际的位置可能不同,但并没有那么相关-它将在您的地方常春藤存储库某处,SBT将知道在哪里可以找到它。以上假设您在bpfm
jar文件的build.sbt
文件中定义了以下属性:
name := "bpfm"
organization := "fileutils"
version := "1.0"
如果您还在上面的Apache项目中使用SBT,而不是手动将此jar文件复制到lib
目录中,则可以将其指定为依赖项。在该项目的SBT build.sbt
文件中添加以下行:
libraryDependencies += "fileprocs" %% "bpfm" % "1.0"
当SBT试图解决此依赖时,它将在本地常春藤存储库中找到它。不需要复制任何东西!可以设置IntelliJ来使用SBT来执行您的构建,这意味着它也将自动提取jar文件作为依赖项。更重要的是,如果这个jar文件有它自己的任何依赖项,它们也将在本地常春藤存储库中捕获,因此您将不必担心在任何一个库上复制它们。
实际上,您也可以添加库作为依赖项。将以下行添加到SBT build.sbt
文件中:
libraryDependencies += "commons-daemon" % "commons-daemon" % "1.0.15"
(实际上,您应该只向lib
添加无法通过存储库获得的jars。转到 central repository,查找可以作为依赖项包含的工件。)
或者,您可以使用一个属性添加这两个依赖项:
libraryDependencies ++= Seq(
"commons-daemon" % "commons-daemon" % "1.0.15",
"fileprocs" %% "bpfm" % "1.0"
)
如果选择这样做,请从项目中删除lib
目录及其内容。(还有其他好处:将库引用为依赖关系在git
存储库中占用的空间更少,并使合并和分支变得更简单。)
注意事项:只要您不打算将您的任何作品发布到公共存储库,就可以了,因为fileprocs
不是一个有效的域名(因此您也不能拥有它)。
https://stackoverflow.com/questions/43814689
复制相似问题