web-dev-qa-db-fra.com

Liaison de données avec Kotlin: ProcessDataBinding Impossible d'obtenir le constructeur public sans argument

J'obtiens cette erreur lorsque je tape ./gradlew test dans la ligne de commande:

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.

Cela se produit également lorsque j'ai kapt "androidx.databinding:databinding-compiler:$gradlePluginVersion" (pour les versions 3.2.0 et 3.3.0-alpha13) dans build.gradle. Je n'ai pas d'autres dépendances kapt. J'ai activé la liaison de données, cela fonctionne et je peux exécuter des tests via Android Studio (la tâche gradle testDebugUnitTest fonctionne). J'utilise un JDK intégré.

10
Wojtek Okoński

J'ai résolu ce problème en utilisant Java 8 au lieu de Java 11. Le même problème peut apparaître avec Java 9 et 10) . J'ai mis mon Java_HOME via export Java_HOME=/path/to/Java/8 puis a exécuté ./gradlew build. Et voila, pas d'erreur.

J'ai eu l'exception e: Java.util.ServiceConfigurationError: javax.annotation.processing.Processor: Android.databinding.annotationprocessor.ProcessDataBinding Unable to get public no-arg constructor et Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException lorsque j'ai exécuté la construction à partir de la ligne de commande en utilisant gradle. Mais ceux-ci ne sont pas apparus lorsque j'exécute la construction à partir de Android Studio. Je soupçonne que c'est parce que Android Studio utilise en quelque sorte sa propre version de Java.

8
newfivefour

Si vous devez utiliser la liaison de données sur Java 9+, vous devrez ajouter des dépendances JAX-B. Ajoutez ceci à votre build.gradle's dependencies {} bloquer:

// 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"
}
0
Hieu Rocker