使用 Java 10 时忽略 Jaxb 包信息
Jaxb package-info ignored when using Java 10
我正在为此苦苦挣扎,如有任何信息,我们将不胜感激。我有一个项目已经使用 JAXB 一段时间来从 XML 模式构建 Java 模型并使用该模型。这在 Java 8 中一直有效。
但是,我已经升级到 Open JDK 10,当我尝试将 XML 文件解组到 Java 对象时出现此错误....
java.lang.IllegalArgumentException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units",
local:"units"). Expected elements are <{}units>
at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:31)
at minestar.units.javagenerator.JavaGeneratorPlugin.execute(JavaGeneratorPlugin.java:41)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
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.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units", local:"units"). Expected
elements are <{}units>
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:741)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:257)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:124)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1149)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:574)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:556)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:168)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScanner
Impl.java:613)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScan
nerImpl.java:3058)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:821)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:5
32)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:258)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:229)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:170)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:209)
at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:29)
... 23 more
我正在使用 maven-jaxb2-plugin 生成源代码,它们看起来不错。我已经升级到这个插件的最新版本(在撰写本文时,0.14.0)。 classes 生成得很好,并且有一个包-info.java class 生成并编译到生成的 jar 中。有问题的 class 在顶部看起来像这样
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"dimensions",
"quantityTypes"
})
@XmlRootElement(name = "units")
public class Units {
@XmlElement(name = "dimension")
protected List<Dimension> dimensions;
@XmlElement(name = "quantityType")
protected List<QuantityType> quantityTypes;
包-info.java看起来像这样
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.minestar.cat.com/namespace/units", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package minestar.units.schema;
因为这是Java10,所以我在javax.xml.bind:jaxb-api:2.3.0, com.sun.xml.bind:jaxb-core中添加了直接依赖条目: 2.3.0 和 com.sun.xml.bind:jaxb-impl:2.3.0.
我曾尝试将 JAXB 实现从 RI 更改为 Eclipse MOXy,但这没有任何区别。
作为测试,我编辑了上面生成的 Units.java class 文件,将命名空间属性添加到 @XmlRootElement 注释中...
@XmlRootElement(namespace = "http://www.minestar.cat.com/namespace/units", name = "units")
public class Units {
这个java文件在下游编译使用时,可以解析XML文件。我没有收到 UnmarshalException。但是,这个源文件是生成的,所以我不能依赖这些更改。此外,从我从比我自己更有见识的人那里读到的所有内容来看,package-info.class 文件(在 JAR 文件中)应该使注释中的名称空间值变得不必要。
如果有什么地方我没有正确设置,我将不胜感激,如果您能帮助我在 Java 10.
中完成这项工作
感谢您的帮助,
埃德
实际上我目前在 Java 9.
上遇到同样的问题
添加 com.sun.xml.bind.backupWithParentNamespace 系统 属性 使其工作,但我觉得这可以解决问题。
我查看了 Java 9 源代码(还没有查看 Java 10 源代码),它在 java.lang.Package.getPackageInfo() 方法中尝试加载包信息 class 使用:
...
String cn = packageName() + ".package-info";
Module module = module();
...
c = loader.loadClass(module, cn);
...
如果我将其替换为
...
c = loader.loadClass(cn);
...
它设法加载它,一切都很好。
对我来说,它看起来像一个 JDK 错误。
最新的 maven-jaxb2-plugin 确实有以下选项来关闭包级注释:
<packageLevelAnnotations>false</packageLevelAnnotations>
这解决了我的问题。
其他 XJC 插件似乎使用“-npa”参数来关闭包级注释
我在 JDK 9 的项目中找到了针对同一问题的以下解决方案:
JAXBContext ctx = JAXBContext.newInstance(YOUR_CLASS.class);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(false); // This line is important!
XMLReader reader = sax.newSAXParser().getXMLReader();
Source source = new SAXSource(reader, new InputSource(new StringReader(xml)));
return (YOUR_CLASS) unmarshaller.unmarshal(source);
我在命名空间方面遇到了类似的问题,在自制插件中使用 JAXB 解组。
我正在使用 Java 11.
我解决了将 maven 升级到 3.6.2
的问题(问题发生在 maven 3.5.2
)。不确定能够解释它为什么有效,但如果它对某人有帮助...
这是一个 Maven 错误,Mojos are unable to load package annotations on Java >= 9,已在 3.6.2
中修复
我正在为此苦苦挣扎,如有任何信息,我们将不胜感激。我有一个项目已经使用 JAXB 一段时间来从 XML 模式构建 Java 模型并使用该模型。这在 Java 8 中一直有效。
但是,我已经升级到 Open JDK 10,当我尝试将 XML 文件解组到 Java 对象时出现此错误....
java.lang.IllegalArgumentException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units",
local:"units"). Expected elements are <{}units>
at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:31)
at minestar.units.javagenerator.JavaGeneratorPlugin.execute(JavaGeneratorPlugin.java:41)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:290)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:194)
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.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat.com/namespace/units", local:"units"). Expected
elements are <{}units>
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:741)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:257)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:124)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1149)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:574)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:556)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:168)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScanner
Impl.java:613)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScan
nerImpl.java:3058)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:821)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:5
32)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:258)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:229)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:170)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:209)
at minestar.units.schema.parser.UnitsXmlParser.readXml(UnitsXmlParser.java:29)
... 23 more
我正在使用 maven-jaxb2-plugin 生成源代码,它们看起来不错。我已经升级到这个插件的最新版本(在撰写本文时,0.14.0)。 classes 生成得很好,并且有一个包-info.java class 生成并编译到生成的 jar 中。有问题的 class 在顶部看起来像这样
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"dimensions",
"quantityTypes"
})
@XmlRootElement(name = "units")
public class Units {
@XmlElement(name = "dimension")
protected List<Dimension> dimensions;
@XmlElement(name = "quantityType")
protected List<QuantityType> quantityTypes;
包-info.java看起来像这样
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.minestar.cat.com/namespace/units", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package minestar.units.schema;
因为这是Java10,所以我在javax.xml.bind:jaxb-api:2.3.0, com.sun.xml.bind:jaxb-core中添加了直接依赖条目: 2.3.0 和 com.sun.xml.bind:jaxb-impl:2.3.0.
我曾尝试将 JAXB 实现从 RI 更改为 Eclipse MOXy,但这没有任何区别。
作为测试,我编辑了上面生成的 Units.java class 文件,将命名空间属性添加到 @XmlRootElement 注释中...
@XmlRootElement(namespace = "http://www.minestar.cat.com/namespace/units", name = "units")
public class Units {
这个java文件在下游编译使用时,可以解析XML文件。我没有收到 UnmarshalException。但是,这个源文件是生成的,所以我不能依赖这些更改。此外,从我从比我自己更有见识的人那里读到的所有内容来看,package-info.class 文件(在 JAR 文件中)应该使注释中的名称空间值变得不必要。
如果有什么地方我没有正确设置,我将不胜感激,如果您能帮助我在 Java 10.
中完成这项工作感谢您的帮助, 埃德
实际上我目前在 Java 9.
上遇到同样的问题添加 com.sun.xml.bind.backupWithParentNamespace 系统 属性 使其工作,但我觉得这可以解决问题。
我查看了 Java 9 源代码(还没有查看 Java 10 源代码),它在 java.lang.Package.getPackageInfo() 方法中尝试加载包信息 class 使用:
...
String cn = packageName() + ".package-info";
Module module = module();
...
c = loader.loadClass(module, cn);
...
如果我将其替换为
...
c = loader.loadClass(cn);
...
它设法加载它,一切都很好。
对我来说,它看起来像一个 JDK 错误。
最新的 maven-jaxb2-plugin 确实有以下选项来关闭包级注释:
<packageLevelAnnotations>false</packageLevelAnnotations>
这解决了我的问题。
其他 XJC 插件似乎使用“-npa”参数来关闭包级注释
我在 JDK 9 的项目中找到了针对同一问题的以下解决方案:
JAXBContext ctx = JAXBContext.newInstance(YOUR_CLASS.class);
Unmarshaller unmarshaller = ctx.createUnmarshaller();
SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(false); // This line is important!
XMLReader reader = sax.newSAXParser().getXMLReader();
Source source = new SAXSource(reader, new InputSource(new StringReader(xml)));
return (YOUR_CLASS) unmarshaller.unmarshal(source);
我在命名空间方面遇到了类似的问题,在自制插件中使用 JAXB 解组。
我正在使用 Java 11.
我解决了将 maven 升级到 3.6.2
的问题(问题发生在 maven 3.5.2
)。不确定能够解释它为什么有效,但如果它对某人有帮助...
这是一个 Maven 错误,Mojos are unable to load package annotations on Java >= 9,已在 3.6.2
中修复