gradle - 如何解决 Java 12 上的 JAXB 类路径问题

标签 gradle jaxb java-11 java-12

将使用 JAXB 的应用程序移植到 JDK 11/12,但在尝试修复这些 JAXB 类路径问题时完全丢失了。我已经用谷歌搜索并阅读了基本上与此相关的所有内容,所以我知道在 Java11 中所做的更改,即从 JDK 中删除 JAXB ......但是在这种情况下,我会假设一个简单的修复,包括在类路径上添加 api 和 impl JAR。但这不起作用,尽管我在类路径上有那些 JAR,但尽管使用 2.3.2 JAXB,但我仍然收到已知异常:

javax.xml.bind.JAXBException - with linked exception: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]



即使我看到该类在不同的包中并且我指示通过系统变量使用正确的包它也不起作用:

gradle -Djavax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory 构建

javax.xml.bind.JAXBException - with linked exception: [java.lang.ClassNotFoundException: com.sun.xml.bind.v2.ContextFactory]



有没有人知道如何解决这个问题?我不想使用 list 文件等。应该可以将正确的 JAR 放在类路径上,是这样吗?

总结在这里但无法让它工作:
http://www.descher.at/descher-vu/2019/01/java-11-jaxb-and-osgi/

更新,Gradle 中使用的依赖项:
- jaxb-xjc 有 jaxb-runtime (impl.) 作为传递依赖。我看到它是由 Gradle 选择的,但仍然是同样的错误。
classpath "com.sun.activation:javax.activation:1.2.0"
classpath "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
classpath "org.glassfish.jaxb:jaxb-xjc:2.3.2"
classpath"org.glassfish.jaxb:jaxb-core:2.3.0.1"

[org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve jaxb-runtime.jar (org.glassfish.jaxb:jaxb-runtime:2.3.2)' completed

[org.gradle.internal.component.model.ComponentAttributeMatcher] Selected match org.glassfish.jaxb:jaxb-runtime:2.3.2 configuration runtime from candidates [org.glassfish.jaxb:jaxb-runtime:2.3.2 configuration runtime] for {org.gradle.dependency.bundling=external, org.gradle.jvm.version=12, org.gradle.usage=java-runtime}



这是“gradle 依赖项”的输出,所有 JAXB jar 都在那里,仍然抛出类路径错误。 Glassfish 的 JAR 文件 jaxb-runtime 肯定有这个 ContextFactory 类。
runtimeClasspath - Runtime classpath of source set 'main'.
+--- org.springframework.boot:spring-boot-starter-log4j2 -> 2.1.0.RELEASE
|    +--- org.apache.logging.log4j:log4j-slf4j-impl:2.11.1
|    |    +--- org.slf4j:slf4j-api:1.7.25
|    |    +--- org.apache.logging.log4j:log4j-api:2.11.1
|    |    \--- org.apache.logging.log4j:log4j-core:2.11.1
|    |         \--- org.apache.logging.log4j:log4j-api:2.11.1
|    +--- org.apache.logging.log4j:log4j-core:2.11.1 (*)
|    +--- org.apache.logging.log4j:log4j-jul:2.11.1
|    |    \--- org.apache.logging.log4j:log4j-api:2.11.1
|    \--- org.slf4j:jul-to-slf4j:1.7.25
|         \--- org.slf4j:slf4j-api:1.7.25
+--- org.projectlombok:lombok -> 1.18.2
+--- org.apache.commons:commons-lang3 -> 3.8.1
+--- org.apache.commons:commons-collections4 -> 4.4
+--- com.google.guava:guava -> 23.0
|    +--- com.google.code.findbugs:jsr305:1.3.9
|    +--- com.google.errorprone:error_prone_annotations:2.0.18
|    +--- com.google.j2objc:j2objc-annotations:1.1
|    \--- org.codehaus.mojo:animal-sniffer-annotations:1.14
+--- org.apache.ws.xmlschema:xmlschema-core -> 2.0.1
+--- org.glassfish.jaxb:jaxb-runtime:2.3.2
|    +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2
|    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
|    +--- org.glassfish.jaxb:txw2:2.3.2
|    +--- com.sun.istack:istack-commons-runtime:3.0.8
|    |    \--- jakarta.activation:jakarta.activation-api:1.2.1
|    +--- org.jvnet.staxex:stax-ex:1.8.1
|    |    +--- jakarta.activation:jakarta.activation-api:1.2.1
|    |    \--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 (*)
|    +--- com.sun.xml.fastinfoset:FastInfoset:1.2.16
|    \--- jakarta.activation:jakarta.activation-api:1.2.1
\--- org.glassfish.jaxb:jaxb-core:2.3.0.1
     +--- javax.xml.bind:jaxb-api:2.3.0 -> 2.3.1
     |    \--- javax.activation:javax.activation-api:1.2.0
     +--- org.glassfish.jaxb:txw2:2.3.0.1 -> 2.3.2
     \--- com.sun.istack:istack-commons-runtime:3.0.5 -> 3.0.8 (*)

最佳答案

出于某种原因,我对 Glassfish JAR 没有运气,但那些原始的 Sun/Oracle 依赖项有效。

关于gradle - 如何解决 Java 12 上的 JAXB 类路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57948738/

相关文章:

grails - 如何使用 JAXB 类型作为 Grails 域类?

Spring 数据JPA : Efficient Way to Invoke Repository Methods with Optional Parameters

java - 在 jdk 11 的 intellij idea 中获取 noclassfoundexception : java. sql.SQLException

java - 将 libgdx 项目从 java 转换为 kotlin 后无法找到或加载主类

java - Gradle命令行错误,任务 ':..:jar'的执行失败

android - 错误:无法解决:com.esri.arcgis.android:arcgis-android:10.2.6-2

java-11 - Jibx - 无法与 JDK11 一起运行

gradle - 无法从插件 'cobertura' 注册扩展 org.sonar.plugins.cobertura.CoberturaSensor

java - Jaxb 中 int 变量的用法

java - 字符串到 joda LocalDate,格式为 "dd-MMM-yy"