【问题标题】:`NoClassDefFoundError` in Artifact built with IntelliJ使用 IntelliJ 构建的工件中的“NoClassDefFoundError”
【发布时间】: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


【解决方案1】:

正如@Andrey 所指出的,当 SBT 依赖项发生变化时,工件设置不会自动更新。为了确保一切都是最新的,解决方法是在更新 SBT 依赖项后重新创建工件。

所以这个问题与具体的依赖无关(在这种情况下是扇贝)。

【讨论】:

    【解决方案2】:

    jar 的类文件之间发生冲突,因此在上面的示例中,当从 File 中删除库时 | 项目结构 | 工件 | 输出布局。一切运行良好。

    在我的情况下,我也依赖于其他 jar,所以当我执行删除所有其他库的活动时。 ClassNotFoundException 消失了,但 NoClassFoundEx 即将用于我删除的依赖库。

    为了得到确切的解决方案,我不得不一一评估所有 jar 文件并删除不需要的库以获得确切的解决方案。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2020-10-01
      • 2019-12-18
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多