How to resolve JAXB classpath issues on 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]
有谁知道如何解决这个问题?我不想使用清单文件等。应该可以将正确的JAR放在类路径上,是不是?
这里的总结,但无法使其工作:
http://www.descher.at/descher-vu/2019/01/java-11-jaxb-and-osgi/
更新,Gradle中使用的依赖项:
-jaxb-xjc具有jaxb运行时(传递)作为传递依赖项。我看到Gradle选择了它,但仍然是相同的错误。
1 2 3 4 | 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}
这是"等级依赖"的输出,所有JAXB jar都在那儿,仍然抛出classpath错误。 Glassfish的JAR文件jaxb-runtime确保具有此ContextFactory类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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依赖项起作用了。