Reputation: 37
ive have made a JavaFX/TornadoFX application,built a jar with gradle and its working fine. Now i used the launch4j gui to wrap my working jar into an exe and the wrapping process succeeds. The Problem is that when i running the Exe with the Test Button within the Launch4j gui i got the following stacktrace:
Executing: C:\Users\xx\Documents\EXEkonfig\xxx.exe
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: tornadofx/View
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at Creator.start(Creator.java:55)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
... 1 more
Caused by: java.lang.ClassNotFoundException: tornadofx.View
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 22 more
Exception running application Creator
my launch4j file looks like that
<?xml version="1.0" encoding="UTF-8"?>
<launch4jConfig>
<dontWrapJar>false</dontWrapJar>
<headerType>gui</headerType>
<jar>C:\XX\XXXX\Kotlin\build\install\CREATOR\CREATOR-1.0-SNAPSHOT.jar</jar>
<outfile>C:\Users\XXX\Documents\EXEkonfig\XXXX.exe</outfile>
<errTitle></errTitle>
<cmdLine></cmdLine>
<chdir>.</chdir>
<priority>normal</priority>
<downloadUrl>http://java.com/download</downloadUrl>
<supportUrl></supportUrl>
<stayAlive>false</stayAlive>
<restartOnCrash>false</restartOnCrash>
<manifest></manifest>
<icon>C:\Users\XXX\Documents\EXEkonfig\creatoricon.ico</icon>
<classPath>
<mainClass>Creator</mainClass>
<cp>lib/tornadofx-1.7.16.jar</cp>
<cp>lib/kotlin-stdlib-jdk8-1.2.51.jar</cp>
<cp>lib/fontawesomefx-8.9.jar</cp>
<cp>lib/kotlin-stdlib-jdk7-1.2.51.jar</cp>
<cp>lib/kotlin-reflect-1.2.41.jar</cp>
<cp>lib/kotlin-stdlib-1.2.51.jar</cp>
<cp>lib/javax.json-1.1.2.jar</cp>
<cp>lib/kotlin-stdlib-common-1.2.51.jar</cp>
<cp>lib/annotations-13.0.jar</cp>
<cp>lib/javax.json-api-1.1.2.jar</cp>
</classPath>
<jre>
<path>C:\Program Files\Java\jdk1.8.0_181</path>
<bundledJre64Bit>false</bundledJre64Bit>
<bundledJreAsFallback>false</bundledJreAsFallback>
<minVersion>1.8.0_180</minVersion>
<maxVersion>1.8.0_181</maxVersion>
<jdkPreference>preferJre</jdkPreference>
<runtimeBits>64/32</runtimeBits>
</jre>
</launch4jConfig>
my mainClass looks like that:
class CreatorMain : App() {
override val primaryView = CreatorScreen::class
var decorator: JFXDecorator by singleAssign()
val view = find(primaryView, scope)
init {
// reloadStylesheetsOnFocus()
// reloadViewsOnFocus()
CreatorUtil.setLocale(Locale.GERMAN)
importStylesheet("/styles/RootFrame.css")
}
override fun createPrimaryScene(view: UIComponent) = Scene(decorator, 1250.0, 500.0)
.apply {
FX.primaryStage.centerOnScreen()
}
override fun start(stage: Stage) {
decorator = JFXDecorator(stage, view.root)
val logo=ImageView(Image("/img/creatorlogo16.png"))
decorator.setGraphic(logo)
stage.icons += Image("/img/creatorlogo16.png")
stage.icons += Image("/img/creatorlogo32.png")
stage.icons += Image("/img/creatorlogo64.png")
super.start(stage)
}
Am I missing something obvious?
Upvotes: 0
Views: 694
Reputation: 7297
You have references to JFoenix (JFXDecorator
) in your classes, but you haven't included it in your launch4j configuration. TornadoFX also requires an implementation of javafx.json
on the classpath, not just the API. We use org.glassfish.javax.json
so you should use the same.
I would also recommend putting your app class in a package, using the default package is discouraged.
Lastly, you could look into FXLauncher as an alternative to launch4j. This will also give you the ability to seamlessly deploy new versions of your app and have it auto update whenever the user restarts the application :)
Upvotes: 1