Не удалось запустить JOOQ GenerationTool с Java 11 (NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema)

Я попытался запустить генерацию кода с помощью этой командной строки, как описано в документации здесь:

java -classpath "jooq-3.12.3.jar;jooq-meta-3.12.3.jar;jooq-codegen-3.12.3.jar;mysql-connector-java-5.1.18-bin.jar;." org.jooq.codegen.GenerationTool library.xml

Я получаю следующую ошибку:

Jan 10, 2020 5:10:45 PM org.jooq.tools.JooqLogger info
INFO: Initialising properties : library.xml
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
at org.jooq.util.jaxb.tools.MiniJAXB.getNamespace(MiniJAXB.java:389)
...

Я использую Java 11:

openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.5+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.5+10, mixed mode)

Что мне не хватает? PS. Я очень новичок в мире Java...


person Eli Pulsifer    schedule 10.01.2020    source источник


Ответы (2)


Проблема связана с удалением API JAXB, так как он считался частью JAVA EE API, поэтому был удален из JDK начиная с Java 9 (см. этот вопрос для получения подробной информации).

Вы можете решить свою проблему, добавив jaxb-api jar в ваш путь к классам:

java -classpath "jooq-3.12.3.jar;jooq-meta-3.12.3.jar;jooq-codegen-3.12.3.jar;reactive-streams-1.0.2.jar;mysql-connector-java-5.0.7.jar;jaxb-api-2.3.1.jar" org.jooq.codegen.GenerationTool library.xml

Обратите внимание, что мне также пришлось добавить reactive-streams-1.0.2 jar в путь к классам (как упоминается в учебнике).

И измените банку драйвера MySQL на вашу банку в команде, которую я вставил. Итак, последняя команда в вашем случае будет:

java -classpath "jooq-3.12.3.jar;jooq-meta-3.12.3.jar;jooq-codegen-3.12.3.jar;reactive-streams-1.0.2.jar;mysql-connector-java-5.1.18-bin.jar;jaxb-api-2.3.1.jar" org.jooq.codegen.GenerationTool library.xml
person Michał Krzywański    schedule 12.01.2020

JAXB API — это неудачная внешняя зависимость от jOOQ, которую мы пытались шаг за шагом удалить в последних версиях. Мы уже удалили зависимость реализации JAXB, но API, от которого мы все еще зависим в различных частях jOOQ.

Должна быть возможность использовать jOOQ и генератор кода jOOQ без явного помещения API JAXB в путь к классам также в JDK 11+. Я создал задачу для решения этой конкретной проблемы: https://github.com/jOOQ/jOOQ/issues/9723

Класс MiniJAXB уже является обходным путем, которого следует избегать в зависимости от реализации JAXB. jOOQ также следует избегать зависимости от JAXB API в будущем.

На данный момент решение michalk является единственным жизнеспособным решением, если вы не хотите использовать Maven или Gradle для решения вашего транзитивного зависимости для вас.

person Lukas Eder    schedule 13.01.2020