62 jar 可以执行 使用 exe4j 打出来的 exe 缺少 javax/script/Bindings

 

前言

最近有将 可执行的jar 打包成 exe 的需求, 因此使用了 比较常见的 exe4j 

java -jar HelloWorld.jar

确定可以执行, 然后使用 exe4j, 配置执行的 jar, Main-Class, jre 的相对路径等等, 最后生成 HelloWorld.exe 

但是执行 HelloWorld.exe 的时候 报错 "Caused by: java.lang.NoClassDefFoundError: javax/script/Bindings"

完整的错误信息如下  

java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.NoClassDefFoundError: javax/script/Bindings
	at com.hx.tool.HelloWorld.start(HelloWorld.java:21)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	... 1 more
Caused by: java.lang.ClassNotFoundException: javax.script.Bindings
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 10 more

 

环境信息如下, jdk12 + javafx8 + exe4j 下载的目前官网最新安装包 

jre 来自于 jdk12 手动 build : "bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre"

 

 

尝试

因为 使用 jdk 本身的 java 命令来执行 jar 是可以正常执行的 

然后 打包 exe 使用的是 jdk12 build 出来的 jre 

因此 我使用 jre 下面的 java(lanucher) 来尝试执行了一下 HelloWorld.jar 

发现 错误信息 和上面一致 

java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.NoClassDefFoundError: javax/script/Bindings
	at com.hx.tool.HelloWorld.start(HelloWorld.java:21)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
	... 1 more
Caused by: java.lang.ClassNotFoundException: javax.script.Bindings
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 10 more

 

因此 可能是 build 出来的 jre 相比于 jdk 本身缺少一些东西, 例如这里的 script-api, 或者是 这两种不同的环境导致了 执行上面的一些差异 

解决方式 : 吧 jdk 下面的 bin, lib 目录拷贝到 jre 目录下面覆盖已有的文件夹  

替换 jre 之后, 双击 exe 执行, 正常执行 

 

 

见识到了 jre 和 jdk 执行同一个 jar 某些情况下会产生不同的行为 

比如这里的场景 

 

 

 

 

你可能感兴趣的:(05,问题,java,exe)