【发布时间】:2019-01-05 19:45:20
【问题描述】:
我一直在使用 JDK 8 的 Java 项目中使用 JAXB。 迁移到 JDK 11 后,不再识别 JAXB 包名称。 我还没有找到将 JAXB 添加为 gradle 依赖项的方法。 如何将 JAXB 导入我的项目?
【问题讨论】:
标签: intellij-idea jaxb java-11
我一直在使用 JDK 8 的 Java 项目中使用 JAXB。 迁移到 JDK 11 后,不再识别 JAXB 包名称。 我还没有找到将 JAXB 添加为 gradle 依赖项的方法。 如何将 JAXB 导入我的项目?
【问题讨论】:
标签: intellij-idea jaxb java-11
您需要包含 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'
这个使用 MOXy 的示例还需要包含有关 JAXBContextFactory 信息的 jaxb.properties 文件(请参阅 here chapter 2.1):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
这样做的好处似乎是:
因为您不需要更改任何应用程序代码,您可以轻松地在不同的 JAXB 实现之间切换。
【讨论】:
我在我的 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
}
【讨论】: