启动 iOS 在初始化时失败。在本地运行

Launch iOS fails on init. Runs locally

buildscript {
    repositories {
        jcenter()

    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.1.1'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'https://mvnrepository.com/artifact/com.caucho/hessian'
    }
    maven {
        url'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
} 

mainClassName = 'com.demoapp.DemoApp'

dependencies {

     compile 'com.gluonhq:charm:4.1.0'
     compile 'com.airhacks:afterburner.mfx:1.6.2'
     compile 'com.caucho:hessian:4.0.7'
     compile 'com.google.code.gson:gson:2.3.1'
     compile 'org.apache.poi:poi:3.9'
}

jfxmobile {
     downConfig {
         version '3.0.0'
         plugins 'display', 'lifecycle', 'statusbar', 'storage'
     }

     android {
         manifest = 'src/android/AndroidManifest.xml'
     }
     ios {

         infoPList = file('src/ios/Default-Info.plist')
         forceLinkClasses = [
            'com.demoapp.**.*', 
            'com.gluonhq.**.*', 
            'io.datafx.**.*', 
            'javax.annotations.**.*', 
            'javax.inject.**.*', 
            'javax.json.**.*', 
            'org.glassfish.json.**.*', 
            'com.caucho.**.*', 
            'com.google.code.gson.**.*', 
            'org.apache.poi.**.*'

        ]
    }
}

应用程序初始化方法中出现错误异常 QuantumRenderer:关闭 java.lang.RuntimeException: 应用程序初始化方法异常 在 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:109069952) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:109069952) 在 com.sun.javafx.application.LauncherImpl$$Lambda$2.run(来源不明) 在 java.lang.Thread.run(Thread.java:109069952) 由以下原因引起:java.lang.NoSuchMethodError:com.demoapp.DemoApp$$Lambda$1.()V 在 com.demoapp.DemoApp.init(DemoApp.java:109070784) 在 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:109070784) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:109070784) 在 com.sun.javafx.application.LauncherImpl$$Lambda$2.run(来源不明) 在 java.lang.Thread.run(Thread.java:109070784)

知道在部署时在哪里搜索 init-Error 吗?谢谢

初始化:

@Override
public void init() {

    NavigationDrawer drawer = new NavigationDrawer();

    NavigationDrawer.Header header = new NavigationDrawer.Header("demo inc", "smart teamwork", new Avatar(21, new Image(DemoApp.class.getResourceAsStream("/icon.png"))));
    drawer.setHeader(header);

    drawer.getItems().addAll(primaryItem, secondaryItem, thirdItem);

    primaryItem.setSelected(true);

    addViewFactory(PRIMARY_VIEW, () -> (View) new PrimaryView().getView());
    addViewFactory(SECONDARY_VIEW, () -> (View) new SecondaryView().getView());
    addViewFactory(THIRD_VIEW, () -> (View) new ThirdView().getView());
    addLayerFactory(MENU_LAYER, () -> new SidePopupView(drawer));

}

@Override
public void postInit(Scene scene) {
    Swatch.ORANGE.assignTo(scene);

    scene.getStylesheets().add(DemoApp.class.getResource("style.css").toExternalForm());
    ((Stage) scene.getWindow()).getIcons().add(new Image(DemoApp.class.getResourceAsStream("/icon.png")));

    switchView(SECONDARY_VIEW);
}

异常表明 lambda 表达式失败。可能是您的 init 方法中的视图供应商。

出现此异常的可能原因是:

Retrolambda

jfxmobile 插件自版本 1.1.0 applies retrolambda 到所有依赖项。但是你不能申请两次。

第一步是检查哪些依赖项可能使用 retrolambda。

Charm 4+ 不使用它。 Afterburner 1.6.2 可以,所以您可以将其更改为:

dependencies {
     compileNoRetrolambda 'com.airhacks:afterburner.mfx:1.6.2'
}

或者您使用排除它的全新版本:

dependencies {
     compile 'com.airhacks:afterburner.mfx:1.6.3'
}

为了确保 none 的其他依赖项使用它,请将 hessian、gson 和 poi 中的 compile 替换为 compileNoRetrolambda

缓存

此外,当使用较低版本的 jfxmobile 插件更新项目时,您的缓存中可能有以前的构建。这可能包含您使用 retrolambda 编译的 类。

虽然代码是一样的,但是Gradle会跳过再次编译它们,但是当再次对它们应用retrolambda插件时,这会失败。

为避免此问题,一个简单的解决方案是在构建和部署项目之前使用 clean:运行 ./gradlew clean launchIOSDevice.