Where to put JAXB dependency for compiling Android Databinding on Java 11?

对着背影说爱祢 提交于 2020-03-01 04:54:44

问题


I am using Android Data Binding, and while things were simple it was working very well. However, once I added a BindingAdapter annotation, my project stopped building in Android Studio with an error Execution failed for task ':app:compileSaferesourceDebugJavaWithJavac', but it didn't give me any more detail. Running gradlew build on the command line showed that the actual error was java.lang.ClassNotFoundException: javax.xml.bind.JAXBException. This makes sense, because this development machine has only Java 11 installed, not Java 8.

I found this answer, which says to add the following dependencies to gradle:

implementation "javax.xml.bind:jaxb-api:2.2.11"
implementation "com.sun.xml.bind:jaxb-core:2.2.11"
implementation "com.sun.xml.bind:jaxb-impl:2.2.11"
implementation "javax.activation:activation:1.1.1"

The problem I have is that I don't know where to add them. Adding them as implementation dependencies to the app/build.gradle doesn't work, because JAXB is a dependency of the build tools, not of my application itself.

I tried adding them as buildscript.dependencies too, but that didn't work either:

buildscript {
    repositories {
        google()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }

    dependencies {
        classpath "javax.xml.bind:jaxb-api:2.3.1"
        classpath "com.sun.xml.bind:jaxb-core:2.3.0"
        classpath "com.sun.xml.bind:jaxb-impl:2.3.1"
        classpath "javax.activation:activation:1.1.1"
    }
}

I also tried adding them as buildscript.dependencies in the project root build.gradle file, but that also did not help:

buildscript {
    repositories {
        google()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }

    dependencies {
        classpath "javax.xml.bind:jaxb-api:2.3.1"
        classpath "com.sun.xml.bind:jaxb-core:2.3.0"
        classpath "com.sun.xml.bind:jaxb-impl:2.3.1"
        classpath "javax.activation:activation:1.1.1"
    }
}

I know that I can use Java 8 to build this code, but I really don't want to have to deal with multiple Java versions and I have other projects that require Java 11.

Is there a place in the gradle configuration that I can put these build dependencies to get them to work?


Configurations I tested:

  • Operating Systems: Tested on Windows 10 and Windows Server 2016
  • Build Environments: Tested in Android Studio 3.4.1, Android Studio 3.5.0-beta04, and using Gradle Wrapper on the command line
  • Android Gradle Plugin: tested with 3.4.1 and 3.5.0-beta04
  • Android Build Tools: tested with 28.0.3 and 29.0.0

Note: comment asks for Databinding version, which is no longer relevant since Databinding is now built-in and does not have a separate version number.

Fail with error show above:

  • Java 11.0.1 x64

Working properly:

  • Java 1.8.0_212 x64

After extensive testing, it is clear that the Java version is the only thing that makes any difference here.


回答1:


UPDATE As of 2020-01-07, the Android bug tracker now states:

JDK 11 support is coming in Studio 4.1.


According to a member of the Android Project on the Android Bug Tracker as of 2019-03-07:

Java 11 is not supported by Android studio and its tools.



来源:https://stackoverflow.com/questions/56635255/where-to-put-jaxb-dependency-for-compiling-android-databinding-on-java-11

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!