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é.
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.
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"
}