1

我能够使用 launch4j 创建一个可执行文件,它在我的机器上运行良好。当我将它发送给某人在他们的 Windows 机器上运行时,他们收到以下错误:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: spark/TemplateEngine
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: spark.TemplateEngine
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 7 more

有什么想法吗?

4

3 回答 3

2

如果您的 maven 依赖项没有<scope>设置为编译时(默认)并且依赖项 jar 在编译时不可用,也可能会发生此异常。例如,如果编译器<scope>provided</scope>中有 maven 依赖项,pom.xml将假定 JRE/环境将提供这些依赖项 jar,但是当编译源并且找不到这些依赖项时,将抛出此异常。

例如 - 如果在编译期间未找到 spark-mllib_2.11 依赖项,尽管添加了它们并且在编辑期间没有错误,则下面可能会导致此异常;

<dependency>
   <groupId>org.apache.spark</groupId>
   <artifactId>spark-mllib_2.11</artifactId>
   <version>2.2.0</version>
   <scope>provided</scope>
</dependency>
于 2017-10-16T07:16:16.450 回答
1

我遇到了这个问题,因为我默认的 java 版本是 9,并且 Spark 无法识别它。所以我改到版本 8 并且它工作。在 linux 中进行更改:

sudo update-java-alternatives -s java-1.8.0-openjdk-amd64

在您的情况下,您可能需要另一个版本,因此请选择您的版本(要列出您计算机中的版本,请使用 -l 选项)。

于 2017-04-13T16:50:19.037 回答
0

必须在类路径中设置相对路径,以便可执行文件可以找到 jar 文件

于 2015-12-18T11:52:36.603 回答