Android 与Kotlin的数据绑定:ProcessDataBinding无法获取公共无参数构造函数

Android 与Kotlin的数据绑定:ProcessDataBinding无法获取公共无参数构造函数,android,gradle,kotlin,android-databinding,Android,Gradle,Kotlin,Android Databinding,我在命令行中键入/gradlew test时出现此错误: e: java.util.ServiceConfigurationError: javax.annotation.processing.Processor: android.databinding.annotationprocessor.ProcessDataBinding Unable to get public no-arg constructor at java.base/java.util.ServiceLoade

我在命令行中键入
/gradlew test
时出现此错误:

e: java.util.ServiceConfigurationError: javax.annotation.processing.Processor: android.databinding.annotationprocessor.ProcessDataBinding Unable to get public no-arg constructor
        at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:581)
        at ...
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
        ... 59 more


> Task :app:kaptDebugKotlin FAILED

FAILURE: Build failed with an exception.

当我在build.gradle中有
kapt“androidx.databinding:databinding编译器:$gradlePluginVersion”
(3.2.0和3.3.0-alpha13版本)时,也会发生这种情况。我没有其他的卡普依赖。我启用了数据绑定,它可以工作,并且我可以通过Android Studio运行测试(gradle task testDebugUnitTest works)。我使用嵌入式JDK。

我通过使用Java8而不是Java11解决了这个问题。Java9和Java10也可能出现同样的问题。我通过
导出JAVA\u HOME=/path/to/JAVA/8
设置我的
JAVA\u HOME
,然后运行
/gradlew build
。瞧,没有错

我遇到异常
e:java.util.ServiceConfigurationError:javax.annotation.processing.Processor:android.databinding.annotationprocessor.ProcessDataBinding无法获取公共无参数构造函数
java.lang.NoClassDefFoundError:javax/xml/bind/jaxBeException

当我使用gradle从命令行运行构建时。但是当我从Android Studio运行构建时,这些并没有出现。我怀疑这是因为Android Studio不知何故使用了自己的Java版本。

如果需要在Java 9+上使用数据绑定,则需要添加JAX-B依赖项。将此添加到
build.gradle
依赖项{}
块:

// Add missing dependencies for JDK 9+
if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
    // Add both if you're using both Kotlin and Java

    // If you're using Kotlin
    kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
    kapt "javax.xml.bind:jaxb-api:2.3.1"
    kapt "com.sun.xml.bind:jaxb-impl:2.3.2"

    // If you're using Java
    annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
    annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
}

这是因为Java版本>8

将您的JAVA_指向JAVA 8版本,它将顺利运行

Java8下载

详细的解决方案是

我之所以出现此错误,是因为我的“build.gradle”、“kotlin_版本”和“gradle wrapper”不是最新版本

ext.kotlin_version = '1.3.10' >> '1.3.20'  
build:gradle:3.5.2  >>  build:gradle:4.2.1  
distributions/gradle-5.4.1-all.zip >> distributions/gradle-6.7.1-all.zip

可能重复我使用的嵌入式JDK@WojtekOkoński这一点运气如何?不,我只是不使用此任务。本博客中给出了使用Java 8的明确解释,这是一个有效的解决方法-应用程序构建。但是,是否有可能以某种方式使用JDK11运行构建?
ext.kotlin_version = '1.3.10' >> '1.3.20'  
build:gradle:3.5.2  >>  build:gradle:4.2.1  
distributions/gradle-5.4.1-all.zip >> distributions/gradle-6.7.1-all.zip