如何将 JAXB 导入 Java 11 IntelliJ (Gradle) 项目?

How can I import JAXB into a Java 11 IntelliJ (Gradle) project?

我一直在使用 JDK 8 的 Java 项目中使用 JAXB。 迁移到 JDK 11 后,不再识别 JAXB 包名称。 我也没有找到将 JAXB 添加为 gradle 中的依赖项的方法。 如何将 JAXB 导入到我的项目中?

您需要包含 JAXB API 并从 JAXB 实现中选择一个,因为默认情况下 JAXB 不再包含在 JDK 11 中。您需要向 build.gradle.

首先:

compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'

如果您决定使用例如 MOXy,则类似:

compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', 
    version: '2.7.3'

另见 this great explanation

这个使用 MOXy 的示例还需要 jaxb.properties 包含有关 JAXBContextFactory 信息的文件(参见 here chapter 2.1):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

这样做的好处好像是:

Because you do not need to change any application code, you can easily switch between different JAXB implementations.

我的 android flutter 项目有一个构建问题,我花了好几个小时来解决这个问题。我知道 Java 11 不支持开箱即用的某些 JAR 文件,因此我们必须包含一些依赖项。但这并不简单。我将此归结为 JAXB 库中的某个版本问题。最后,这是我对 android/build.gradle 文件的工作解决方案。 我添加了一些存储库(如 google、mavenCentral),并且 2.3.0 的 jaxb-api 版本也是有效的。我记得当时 2.3.1 不工作......但当我现在尝试时它工作。真奇怪。显然,我不是这方面的专家。我很庆幸它终于成功了......我正在展示 android/build.gradle 的价值。希望这对某人有所帮助。

buildscript {
    ext.kotlin_version = '1.3.50'
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://repo1.maven.org/maven2/")
        }
        jcenter()
    }

    dependencies {
        classpath "javax.xml.bind:jaxb-api:2.3.0"
        classpath 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
        classpath 'org.glassfish.jaxb:jaxb-runtime:2.3.2'
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://repo1.maven.org/maven2/")
        }
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}