Unable to run JOOQ GenerationTool with Java 11 (NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema)
Unable to run JOOQ GenerationTool with Java 11 (NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema)
我尝试 运行 使用此命令行生成代码,如文档 here 中所述:
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...
的世界还很陌生
问题与 JAXB api 的删除有关,因为它被认为是 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 驱动程序 jar 更改为您的 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.1.18-bin.jar;jaxb-api-2.3.1.jar" org.jooq.codegen.GenerationTool library.xml
JAXB API 是 jOOQ 的一个不幸的外部依赖项,我们一直在尝试在最近的版本中逐步删除它。我们已经删除了 JAXB 实现依赖,但是 API,我们仍然依赖于 jOOQ 的各个部分。
应该可以使用 jOOQ 和 jOOQ 的代码生成器,而无需在 JDK 11+ 中显式地将 JAXB API 放在 class 路径上。我创建了一个问题来解决这个特定问题:https://github.com/jOOQ/jOOQ/issues/9723
MiniJAXB
class 已经是一种解决方法,可以根据 JAXB 实现来避免。 jOOQ 将来也应该避免依赖于 JAXB API。
目前,如果您不想使用 Maven 或 Gradle 为您解决传递依赖关系, 是唯一可行的方法。
我尝试 运行 使用此命令行生成代码,如文档 here 中所述:
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...
的世界还很陌生问题与 JAXB api 的删除有关,因为它被认为是 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 驱动程序 jar 更改为您的 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.1.18-bin.jar;jaxb-api-2.3.1.jar" org.jooq.codegen.GenerationTool library.xml
JAXB API 是 jOOQ 的一个不幸的外部依赖项,我们一直在尝试在最近的版本中逐步删除它。我们已经删除了 JAXB 实现依赖,但是 API,我们仍然依赖于 jOOQ 的各个部分。
应该可以使用 jOOQ 和 jOOQ 的代码生成器,而无需在 JDK 11+ 中显式地将 JAXB API 放在 class 路径上。我创建了一个问题来解决这个特定问题:https://github.com/jOOQ/jOOQ/issues/9723
MiniJAXB
class 已经是一种解决方法,可以根据 JAXB 实现来避免。 jOOQ 将来也应该避免依赖于 JAXB API。
目前,如果您不想使用 Maven 或 Gradle 为您解决传递依赖关系,