胶子移动插件无法处理多个释放罐

时间:2018-04-29 16:06:53

标签: gluon gluon-mobile

通过gluon-mobile Eclipse插件将我的一个示例JavaFX应用程序部署到Android设备失败,并在retrolambda插件中出现IllegalArgumentException。这是由我的项目对jaxb-api-2.3.0.jar的间接依赖引起的,这是一个多版本的jar。 Retrolambda显然无法处理此文件中的Java 9部分而不是忽略它们会抛出异常。如何解决或避免这种情况?

更新版本的retrolambda(2.5.3而不是2.5.1)可以处理module-info.class但不能处理META-INF / versions / 9 /中的部分... 这个问题可以通过删除META-INF来解决,但是当我手动执行此操作时,它总是由胶子插件重新创建。

更新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)

通过在jaxb-api-2.3.0.jar的提取类上运行命令行版本的retrlambda,也可以轻松验证这一点

更新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 :(得分:0)

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'

然后构建插件并使用本地快照。

好消息是使用针对Java 9+的jfxmobile插件版本2.0.20和Gluon VM,上面已经included

如果您可以切换到Java 9/10,修改您的项目以使用此插件,使用Gluon IDE插件创建一个新项目(“使用Gluon VM的单一视图项目”),或者按照sample进行操作,但使用最新版本(目前为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'
}