【问题标题】:How can I import JAXB into a Java 11 IntelliJ (Gradle) project?如何将 JAXB 导入 Java 11 IntelliJ (Gradle) 项目?
【发布时间】:2019-01-05 19:45:20
【问题描述】:

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

【问题讨论】:

    标签: intellij-idea jaxb java-11


    【解决方案1】:

    您需要包含 JAXB API 并从其中一种 JAXB 实现中进行选择,因为默认情况下 JDK 11 中不再包含 JAXB。您需要向 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 的示例还需要包含有关 JAXBContextFactory 信息的 jaxb.properties 文件(请参阅 here chapter 2.1):

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

    这样做的好处似乎是:

    因为您不需要更改任何应用程序代码,您可以轻松地在不同的 JAXB 实现之间切换。

    【讨论】:

    • @MerajHussain 你是对的。它不会像我原来的答案那样工作。我已更新我的答案以包含更多信息。
    • 如何在build.gradle中添加jaxb属性?
    • @MerajHussain 您不要将其添加到 gradle 中。它是一个文件,需要与您的模型包未/编组位于同一包中。如果您希望使用 Sun 的实现,您可以看到所需的依赖项(基于 Maven,但猜测是一样的)here
    • @MerajHussain above 您的模型包 表示您的模型类所在的更具体的包,因此每个 pkg 似乎都需要自己的
    【解决方案2】:

    我在我的 android Flutter 项目中遇到了构建问题,我花了好几个小时来寻找这个问题。我知道 Java 11 不支持开箱即用的某些 JAR 文件,因此我们必须包含一些依赖项。但这并不简单。我将此归结为 JAXB 库中的某个版本问题。最后,这是我的 android/build.gradle 文件的工作解决方案。 我添加了一些存储库(如 google、mavenCentral),并且 jaxb-api of 2.3.0 的版本也是有效的。我记得当时 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多