不是答案,而是一个附录:我得到了因为运行 groovysh (Groovy 2.4.13),如果JAVA_HOME指向Java 9安装(确切地说 java version "9.0.1" )失败了:
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
...
..
.
..
...
at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more
解决方案是:
转到github.io的JAXB Project("JAXB is licensed under a dual license - CDDL 1.1 and GPL 2.0 with Class-path Exception")
function extend_qzminynshg {
local BASE="/usr/local/java"
for LIB in jaxb-api.jar jaxb-core.jar jaxb-impl.jar jaxb-jxc.jar jaxb-xjc.jar; do
local FQLIB="$BASE/jaxb-ri/lib/$LIB"
if [[ -f $FQLIB ]]; then
export CLASSPATH=$FQLIB:$CLASSPATH
fi
done
}
extend_qzminynshg; unset extend_qzminynshg
19 回答
我知道我迟到了,但我的错误最终需要一个不同的解决方案......超级简单
我原先去了Tomcat 9并意识到我需要7 ...我忘了将我的类路径映射回build.xml中的7版本
希望这将在未来修复别人的错误,他设法忽略了这个简单的问题,就像我一样!
您可以使用
--add-modules=java.xml.bind
JVM选项将xml绑定模块添加到JVM运行时环境 .例如:
java --add-modules=java.xml.bind XmlTestClass
在最近的JDK 9.0.1中,这些解决方案都不适用于我 .
我发现这个依赖项列表足以使其正常运行,所以你 don't need 要明确指定
--add-module
(尽管它是在这些依赖项's pom'中指定的) . 您唯一需要的是指定此依赖项列表:转到Build.gradle并为Java 9或Java 10添加以下依赖项 .
clean solution for all JDKs >= 9
您需要为构建添加两个依赖项
jaxb-api
一个jaxb实现
作为一个实现,我选择使用glassfish的参考实现来摆脱旧的com.sun类/库 . 因此,我添加了我的maven构建
请注意,从版本2.3.1开始,您不再需要添加javax.activation . (见https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)
这对我有用 . 仅添加jaxb-api是不够的 .
在pom.xml中添加javax.xml.bind依赖项
这对我有用:
更新
正如@Jasper建议的那样,为了避免依赖于整个EclipseLink库,您还可以依赖于EclipseLink MOXy:
Maven
Gradle
作为我的Java 8应用程序的依赖项,它生成一个* .jar,它可以由JRE 8或JRE 9运行,没有其他参数 .
此外,这需要在使用JAXB API之前在某处执行:
到目前为止工作得很好,作为一种解决方法 . 看起来不是一个完美的解决方案......
JAXB API被认为是Java EE API,因此不再包含在Java SE 9中的默认类路径中 . 在Java 11中,它们完全从JDK中删除 .
Java 9引入了模块的概念,默认情况下,
java.se
聚合模块在类路径(或更确切地说,模块路径)上可用 . 顾名思义,java.se
聚合模块不包含传统上与Java 6/7/8捆绑在一起的Java EE API .幸运的是,JDK 6/7/8中提供的这些Java EE API仍然在JDK中,但默认情况下它们不在类路径中 . 以下模块中提供了额外的Java EE API:
Quick and dirty solution: (JDK 9/10 only)
要在运行时使JAXB API可用,请指定以下命令行选项:
--add-modules java.xml.bind
But I still need this to work with Java 8!!!
如果您尝试使用较旧的JDK指定
--add-modules
,它会爆炸,因为它是一个无法识别的选项 . 我建议两种选择之一:您可以通过检查
$JAVA_HOME/release
的JAVA_VERSION
属性来检查JDK版本,从而有条件地在启动脚本(如果有的话)中应用该参数 .您可以添加
-XX:+IgnoreUnrecognizedVMOptions
以使JVM静默忽略无法识别的选项,而不是炸毁 . 但要小心!您使用的任何其他命令行参数将不再由JVM验证 . 此选项适用于Oracle / OpenJDK以及IBM JDK(从JDK 8sr4开始)Alternate quick solution: (JDK 9/10 only)
请注意,您可以通过指定
--add-modules java.se.ee
选项在运行时使所有上述Java EE模块可用 .java.se.ee
模块是一个聚合模块,包含java.se.ee
以及上述Java EE API模块 .Proper long-term solution: (All JDK versions)
上面列出的Java EE API模块都标记为
@Deprecated(forRemoval=true)
,因为它们在Java 11中是scheduled for removal . 因此,--add-module
方法将不再适用于Java 11开箱即用 .在Java 11和转发中需要做的是在类路径或模块路径上包含您自己的Java EE API副本 . 例如,您可以将JAX-B API添加为maven依赖项,如下所示:
有关Java模块化的完整详细信息,请参阅JEP 261: Module System
这是因为java版本,如果你使用jdk 9或更高版本,只需将它添加到你的pom
在我的情况下(spring boot fat jar)我只是将以下内容添加到pom.xml中 .
好吧,我一直有同样的问题,但我使用的是java 8,并且不断收到此错误,我尝试了大多数解决方案 . 但事实证明我的maven仍然指向java 9甚至 - 虽然我将全局java设置为8,所以一旦我修复它一切正常,对于任何可能有这种问题的身体,请查看(如何修复Maven使用默认Java)https://blog.tompawlak.org/maven-default-java-version-mac-osx
我在Java 11上使用Spring Boot
2.0.5.RELEASE
遇到了同样的问题 .单独添加
javax.xml.bind:jaxb-api:2.3.0
无法解决问题 . 我还必须将Spring Boot更新到最新的Milestone2.1.0.M2
,所以我认为这将在下一个正式版本中修复 .对于Java Web Start Execution,我们可以使用AndyGuibert的建议是这样的:
请注意--add-modules中的额外"=" . 请参阅this OpenJDK Ticket或Java Platform, Standard Edition Oracle JDK 9 Migration Guide的"Understanding Runtime Access Warnings"中的最后一个音符 .
在Maven中使用Which artifacts should I use for JAXB RI in my Maven project?之后,您可以使用以下配置文件:
依赖树显示:
要在Eclipse中使用它,请说Oxygen.3a Release(4.7.3a)或更高版本,Ctrl-Alt-P,或右键单击项目Maven,然后选择配置文件 .
不是答案,而是一个附录:我得到了因为运行
groovysh
(Groovy 2.4.13),如果JAVA_HOME指向Java 9安装(确切地说java version "9.0.1"
)失败了:解决方案是:
转到github.io的JAXB Project("JAXB is licensed under a dual license - CDDL 1.1 and GPL 2.0 with Class-path Exception")
下载
jaxb-ri-2.3.0.zip
解压缩放置java基础结构文件的位置(在我的情况下,
/usr/local/java/jaxb-ri/
) . 可能存在其他解决方案(可能通过SDKMAN,我不知道)确保lib子目录中的jar位于
CLASSPATH
上 . 我通过在bash启动时启动的脚本(称为/etc/profile.d/java.sh
)来执行此操作,其中我添加了(在许多其他行中)以下循环:打包成一个功能......
它的工作原理!
为了解决这个问题,我在项目中导入了一些JAR文件:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
下载上述文件并将其复制到项目中的libs文件夹中
在Java Build Path中添加导入的JAR文件
在编译和运行时,添加开关
--add-modules java.xml.bind
有关
JDK 9
模块的详细介绍也可在以下网址找到:https://www.youtube.com/watch?v=KZfbRuvv5qc我按照这个URL,以下设置真的帮助了我 . 我在Macbook Pro中使用Java 10和STS IDE . 它就像一个魅力 .