【问题标题】:JAXB and Java 11 module-info.javaJAXB 和 Java 11 模块信息.java
【发布时间】:2020-06-03 10:31:10
【问题描述】:

我的环境:

java -version
openjdk version "11.0.2" 2019-01-15 LTS
OpenJDK Runtime Environment Corretto-11.0.2.9.1 (build 11.0.2+9-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.2.9.1 (build 11.0.2+9-LTS, mixed mode)

Maven 依赖:

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-core</artifactId>
  <version>2.3.0.1</version>
</dependency>
<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.1</version>
</dependency>

还有一个简单的程序:

public static void main(String[] args) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(Person.class);

    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    Person person = new Person(1L, "Thomas");
    marshaller.marshal(person, System.out);
}

此时,一切工作正常

然后我添加 module-info.java

module com.thanh {
    requires java.xml;
    requires java.xml.bind;

    opens com.thanh;

    exports com.thanh;
}

还有例外:

Exception in thread "main" javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
    at java.xml.bind/javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278)
    at java.xml.bind/javax.xml.bind.ContextFinder.find(ContextFinder.java:421)
    at java.xml.bind/javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
    at java.xml.bind/javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
    at com.thanh/com.thanh.App.main(App.java:12)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.xml.bind/javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at java.xml.bind/javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at java.xml.bind/javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276)
    ... 4 more

如何让 JAXB 与 Java 11 模块一起使用?

我的 JavaFX 项目需要模块。

谢谢!

【问题讨论】:

  • 你读过this answer吗?尝试改用jakarta.xml.bind-apijaxb-runtime
  • 谢谢@ZhekaKozlov,我已经按照你的建议替换了依赖项,现在它可以工作了。

标签: java jaxb java-11 java-module


【解决方案1】:

根据JAXB official page,你应该使用这些依赖:

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
</dependency>

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.3</version>
    <scope>runtime</scope>
</dependency>

【讨论】:

  • com.sun.xml.bind:jaxb-implhas been deprecated。新的运行时是org.glassfish.jaxb:jaxb-runtime
  • 在哪里可以找到 xml 文件?我在任何地方都找不到我正在使用的软件(nifi 注册表)
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2019-04-08
  • 2020-04-15
相关资源
最近更新 更多