简体   繁体   English

NoClassDefFoundError: tornadofx/View

[英]NoClassDefFoundError: tornadofx/View

ive have made a JavaFX/TornadoFX application,built a jar with gradle and its working fine.我已经制作了一个 JavaFX/TornadoFX 应用程序,用 gradle 构建了一个 jar 并且它工作正常。 Now i used the launch4j gui to wrap my working jar into an exe and the wrapping process succeeds.现在我使用 launch4j gui 将我的工作 jar 包装到一个 exe 中,并且包装过程成功。 The Problem is that when i running the Exe with the Test Button within the Launch4j gui i got the following stacktrace:问题是,当我在 Launch4j gui 中使用测试按钮运行 Exe 时,我得到以下堆栈跟踪:

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我的launch4j文件看起来像这样

<?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:我的 mainClass 看起来像这样:

  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?我错过了一些明显的东西吗?

You have references to JFoenix ( JFXDecorator ) in your classes, but you haven't included it in your launch4j configuration.您在您的类中引用了 JFoenix ( JFXDecorator ),但您尚未将其包含在您的 launch4j 配置中。 TornadoFX also requires an implementation of javafx.json on the classpath, not just the API. TornadoFX 还需要在类路径上实现javafx.json ,而不仅仅是 API。 We use org.glassfish.javax.json so you should use the same.我们使用org.glassfish.javax.json所以你应该使用相同的。

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.最后,您可以将 FXLauncher 视为 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 :)这也将使您能够无缝部署应用程序的新版本,并在用户重新启动应用程序时自动更新:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM