Only X
Only X

Reputation: 37

NoClassDefFoundError: tornadofx/View

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

Answers (1)

Edvin Syse
Edvin Syse

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

Related Questions