【发布时间】:2018-05-25 21:40:11
【问题描述】:
我使用 Intellij Idea 2017.3(终极版)从 Scala/SBT 项目构建工件(可执行 Jar); Scala 版本是 2.12。
由于最近给Scallop添加了依赖,所以无法再执行Jar文件,因为Scallop类ScallopConf不在Jar文件中:
$ java -jar executable.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/rogach/scallop/ScallopConf
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
[...]
Caused by: java.lang.ClassNotFoundException: org.rogach.scallop.ScallopConf
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 19 more
我可以通过手动检查来确认ScallopConf 类没有打包到Jar 文件中。所有其他依赖项都在那里,无论它们是最初添加的还是后来添加的。
这就是我将依赖项添加到项目根目录中的build.sbt 文件的方式:
libraryDependencies += "org.rogach" %% "scallop" % "3.1.1"
该项目在 IDE 和 sbt compile 中都能正常编译。我也可以在 IDE 中正常运行。
我以标准方式在 IDE 中创建了工件。有什么特别需要注意的吗,可能与扇贝有关?
【问题讨论】:
-
检查artifact settings 这个库实际上被打包到了jar 中。你在那儿看到了吗?
-
@andrey 不,这里没有列出。所有其他依赖项都是自动添加的,如
Extracted 'scala-reflect.jar'等。在使用Extract into Output Root在可用元素列表中选择它后,Jar 可以运行,谢谢!问题是:为什么我需要为此手动执行此操作? -
在 SBT 项目上,工件配置不会与 build.sbt 文件自动同步(相关请求:youtrack.jetbrains.com/issue/SCL-9955),因为现在使用 Gradle 或 Maven。在您创建工件时,IDE 会自动添加所有依赖项。修改依赖配置后,需要手动调整工件设置。
标签: scala intellij-idea jar jvm sbt