通过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
答案 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'
}