我在Eclipse中有一个Java项目,它使用javax.xml.bind.JAXB类。从Eclipse内部启动应用程序非常有效。但是,当我将项目导出为(可运行)jar文件并使用java -jar myfile.jar
它运行它时,它以结尾java.lang.NoClassDefFoundError: javax/xml/bin/JAXBException
。
在Eclipse Runnable JAR File Specification中使用库处理的三个选项(提取,包,子文件夹)也不能解决问题-实际上,在任何情况下都不会导出库。
似乎JAXB的库(似乎是rt.jar)不被视为包含在jar文件中的必需库。但是,在运行jar文件时,仍然找不到该文件。我读过必须将库添加到类路径,但是这对我来说似乎很奇怪,因为rt.jar是标准库的一部分。这个图书馆有什么特别之处吗?
当前,我不使用Maven或类似的东西进行依赖和构建管理,如果可能的话,我希望将来避免使用它。我认为,也一定有没有Maven的方法。
我在SO和Google上找到了几篇文章,但无法为我找到解决方案。
非常感谢你!
如注释中所述,Eclipse可能使用与系统不同的Java版本(默认情况下)。JRE 11中不提供JAXB API和实现。
要在所有版本的Java上工作,最好的选择是:
jakarta.xml
而不是javax.xml
软件包名称),如Juliano的回答:https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-ri/3.0.0/jaxb-ri-3.0.0.zip
jakarta.activation.jar
,jakarta.xml.bind-api.jar
,jaxb-core.jar
并jaxb-impl.jar
从mod
文件夹到项目的库文件夹(比方说lib
)jakarta.xml
)在Eclipse提出的三个导出选项中:“提取所需的库”将创建一个所谓的胖子罐(所有内容都放在一个JAR文件中)。它可以工作,但是会删除JAXB jar中的许可声明(因此无法分发)。“复制所需的库”是您的最佳选择,但是随后您必须将jar文件与子文件夹一起移动。_“。“需要打包的库”将不起作用,因为JVM无法读取jar中的jar(与WAR软件包中的JAR不同)。
问题作者的编辑:上面的内容对我来说很有效,除了我在这两个库(Java 8中的javax.xml和3.0版中的jakarta.xml)如何处理@XmlAttribute
注释方面经历了小的差异。在javax.xml中,我可以在公共获取方法上放置一个没有其他参数的注释,例如
@XmlAttribute
public String getDescription() {
return "";
}
当xml文件中的属性名称为时,此方法有效description
。但是,使用jakarta.xml,我必须添加属性的名称:
@XmlAttribute(name="description")
public String getDescription() {
return "";
}
以防万一,其他人也会遇到同样的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句