Невозможно запустить JOOQ GenerationTool с Java 11 (NoClassDefFoundError: javax / xml / bind / annotation / XmlSchema) - PullRequest
3 голосов
/ 11 января 2020

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

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 ...

Ответы [ 2 ]

2 голосов
/ 13 января 2020

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

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

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

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

2 голосов
/ 12 января 2020

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

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

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

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

И замените банку с драйвером 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
...