TornadoFX Launch4j NoClassDefFoundError: tornadofx / View - PullRequest
0 голосов
/ 26 августа 2018

Я сделал приложение JavaFX / TornadoFX, построил банку с Gradle и все работает нормально.Теперь я использовал графический интерфейс launch4j, чтобы обернуть мою рабочую флягу в исполняемый файл, и процесс обертывания завершился успешно.Проблема в том, что когда я запускаю Exe с кнопкой тестирования в графическом интерфейсе Launch4j, я получаю следующую трассировку стека:

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

мой файл 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>

мой 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)
  }

Я что-то упускаю из виду?

1 Ответ

0 голосов
/ 26 августа 2018

У вас есть ссылки на JFoenix (JFXDecorator) в ваших классах, но вы не включили его в конфигурацию launch4j.TornadoFX также требует реализации javafx.json в пути к классам, а не только в API.Мы используем org.glassfish.javax.json, поэтому вы должны использовать то же самое.

Я бы также рекомендовал помещать класс вашего приложения в пакет, поэтому использование пакета по умолчанию не рекомендуется.

Наконец, вы можете взглянуть на FXLauncher.как альтернатива launch4j.Это также даст вам возможность беспрепятственно развертывать новые версии вашего приложения и автоматически обновлять его каждый раз, когда пользователь перезапускает приложение:)

...