UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】パッケージjavax.xml.bindは存在しません

ソースコードは変更していないにもかかわらず、JAXBを使用してXMLデータをパースしているコードでJAXBクラスが見つからないことを示すエラーが発生した

try {
  JAXBContext context = JAXBContext.newInstance("com.acme.foo");
  Unmarshaller unmarshaller = context.createUnmarshaller();
  unmarshaller.setSchema(schema);
  FooObject fooObj = (FooObject) unmarshaller.unmarshal(new File("foo.xml"));
} catch (UnmarshalException ex) {
  ex.printStackTrace();
} catch (JAXBException ex) {
  ex.printStackTrace();
}

調べたところ、JAXBAPIはJavaEE APIと見なされるためJava SE 9からデフォルトのクラスパスには含まれなくなり、Java11ではJDKから完全に削除されている模様

確かに、Java 8にしていたものをJava 11でビルドしていたのでこれが原因だった

stackoverflow.com

解決策としては別途モジュールをmaven依存関係に追加するとのこと

<!-- API, java.xml.bind module -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>

<!-- Runtime, com.sun.xml.bind module -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>