Плагин Gluon-Mobile не может работать с несколькими выпусками - PullRequest
0 голосов
/ 29 апреля 2018

Развертывание одного из моих примеров приложений JavaFX на устройстве Android с помощью плагина Eclipse для gluon-mobile завершается неудачно с IllegalArgumentException в плагине retrolambda. Это вызвано косвенной зависимостью моего проекта от jaxb-api-2.3.0.jar, который является мульти-релизом jar. Очевидно, что Retrolambda не может обрабатывать части Java 9 в этом файле, и вместо того, чтобы просто игнорировать их, выдается исключение. Как это можно исправить или избежать?

Более новая версия retrolambda (2.5.3 вместо 2.5.1) уже может обрабатывать файл module-info.class, но не часть в META-INF / version / 9 / ... Эту проблему можно решить, просто удалив содержимое META-INF, но когда я делаю это вручную, он всегда воссоздается с помощью плагина gluon.

Обновление 1:

Добавление

    packagingOptions {
        exclude '/META-INF/versions/9/javax/xml/bind/ModuleUtil.class'
    }            

к разделу android в файле сборки не имеет никакого значения. Сообщение об ошибке остается прежним:

java.lang.IllegalArgumentException
at net.orfjackal.retrolambda.asm.ClassReader.<init>(ClassReader.java:185)
at net.orfjackal.retrolambda.asm.ClassReader.<init>(ClassReader.java:168)
at net.orfjackal.retrolambda.ClassAnalyzer.analyze(ClassAnalyzer.java:25)
at net.orfjackal.retrolambda.Retrolambda$1.visitClass(Retrolambda.java:71)
at net.orfjackal.retrolambda.files.ClasspathVisitor.visitFile(ClasspathVisitor.java:29)
at net.orfjackal.retrolambda.files.ClasspathVisitor.visitFile(ClasspathVisitor.java:11)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at net.orfjackal.retrolambda.Retrolambda.visitFiles(Retrolambda.java:107)
at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:68)
at net.orfjackal.retrolambda.Main.main(Main.java:28)

Это также можно легко проверить, просто запустив версию retrlambda для командной строки над извлеченными классами jaxb-api-2.3.0.jar

Обновление 2:

С Java 9 и Gluon-VM происходит сбой:

Execution failed for task ':SingleViewProject - Gluon VMApp:apkDebug'.
> Duplicate files at the same path inside the APK: META-INF/LICENSE.txt
  File 1: /Users/mpaus/.m2/repository/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
  File 2: /Users/mpaus/.m2/repository/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

1 Ответ

0 голосов
/ 30 апреля 2018

jaxb-api-2.3.0.jar - это мульти-релиз jar, и текущий плагин jfxmobile 1.3.10 не может с этим справиться.

Плагин, предназначенный для Java 7/8, использует retrolambda для переноса обратно в Java 6/7 с заданной зависимостью.

Даже если вы попытаетесь удалить module-info.class or the 9 version META-INF.versions.9.javax.xml.bind`, эти классы обрабатываются плагином retrolambda, и это приведет к исключению, опубликованному в вопросе. Использование последней версии retrolambda также не помогает.

android {
    retrolambdaVersion = "2.5.3"
    manifest = 'src/android/AndroidManifest.xml'
    packagingOptions {
        exclude '/module-info.class'
        exclude '/META-INF.versions.9.javax.xml.bind/ModuleUtil.class'
    }
}

Единственный способ заставить его работать в Java 8 / jfxmobile 1.3.10 - это изменить плагин, добавив следующее исключение к JFXMobilePlugin:

copyClassesForRetrolambda.include '**/*.class'
copyClassesForRetrolambda.includeEmptyDirs = false
// exception for multi-release jars    
copyClassesForRetrolambda.exclude 'META-INF/versions/**/*.class'
copyClassesForRetrolambda.exclude 'module-info.class'

, а затем создайте плагин и используйте локальный снимок.

Хорошей новостью является то, что при использовании плагина jfxmobile версии 2.0.20 и Gluon VM, предназначенной для Java 9+, вышеприведенное уже включено .

Если вы можете переключиться на Java 9/10, измените свой проект, чтобы использовать этот плагин, создайте новый проект с плагином Gluon IDE («проект с одним представлением с Gluon VM») или следуйте этому примеру , но с использованием последней версии (пока 2.0.20).

buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
        }
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:2.0.20'
    }
}

apply plugin: 'org.javafxports.jfxmobile'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = '...'

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile 'com.gluonhq:charm:5.0.0-jdk9'
    androidRuntime 'com.gluonhq:charm:5.0.0'
    compile 'javax.xml.bind:jaxb-api:2.3.0'
}
...