使用Java 10时忽略Jaxb包信息

使用Java 10时忽略Jaxb包信息,jaxb,java-10,Jaxb,Java 10,我正在努力解决这个问题,任何信息都将不胜感激。我有一个项目已经使用JAXB从XML模式构建了一个Java模型,并使用了该模型。这在Java8中已经运行了一段时间了 但是,我已经升级到OpenJDK10,当我试图将XML文件解组到Java对象中时,会出现这个错误 java.lang.IllegalArgumentException: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.minestar.cat

我正在努力解决这个问题,任何信息都将不胜感激。我有一个项目已经使用JAXB从XML模式构建了一个Java模型,并使用了该模型。这在Java8中已经运行了一段时间了

但是,我已经升级到OpenJDK10,当我试图将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
因为这是Java10,所以我在javax.xml.bind:jaxbapi:2.3.0、com.sun.xml.bind:jaxb core:2.3.0和com.sun.xml.bind:jaxb impl:2.3.0中添加了直接依赖项

我曾尝试将JAXB实现从RI更改为EclipseMoxy,但没有任何区别

作为测试,我编辑了上面生成的Units.java类文件,将namespace属性添加到@XmlRootElement注释中

@XmlRootElement(namespace = "http://www.minestar.cat.com/namespace/units", name = "units")
public class Units {
当这个java文件被编译并在下游使用时,XML文件可以被解析。我没有收到解组异常。但是,这个源文件是生成的,所以我不能依赖这些更改。此外,从我从比我更了解情况的人那里读到的所有信息来看,package-info.class文件(位于JAR文件中)应该使注释中的名称空间值变得不必要

如果有一些我没有正确设置的东西,我将非常感谢任何帮助,以使它在Java10中工作

谢谢你的帮助,
Ed

事实上,我目前在Java9上也面临同样的问题

添加com.sun.xml.bind.backupWithParentNamespace系统属性可以使其工作,但我觉得这可以解决问题

我查看了Java 9源代码(尚未查看Java 10源代码),它位于Java.lang.Package.getPackageInfo()方法中,它尝试使用以下方法加载PackageInfo类:

...
String cn = packageName() + ".package-info";
Module module = module();
...
c = loader.loadClass(module, cn);
...
如果我用

...
c = loader.loadClass(cn);
...
它能很好地加载,一切都很好

对我来说,它看起来像一个JDK bug

最新的maven-jaxb2-plugin确实具有以下选项来关闭包级注释:

<packageLevelAnnotations>false</packageLevelAnnotations>
false
这解决了我的问题


其他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进行解组

我正在使用Java11


我解决了将maven升级到
3.6.2
(问题发生在maven
3.5.2
)的问题。不确定是否能够解释其工作原理,但如果它有助于某人…

或的可能重复?@nullpointer不完全正确。我不认为,无论如何。我确实找到了。在第一个问题中,我在所讨论的类中有XmlRootElement注释(根据接受的答案)。我的模块中还有一个package-info.class(根据第二个答案)。在第二个问题中,虽然我在XmlRootAttribute注释中没有名称空间属性,但我不应该基于包信息中定义的XmlSchema注释的存在(根据第二个问题中的第二个答案)。我同意他们是相同的例外。但是我想我正在做那些答案表明我对Java 11和jaxb 2.3.2有相同的问题-有解决方案吗?在我的插件配置中使用PackageLevel注释(在确保包含正确的依赖项之后)在Java 10中也为我解决了这个问题。谢谢感谢您找到此解决方法。。。如果您在对java 9、10或11的意外元素(uri:“…”)进行解组时遇到错误,那么您可能遇到了此错误。在尝试从java 8迁移代码时,我对该错误进行了一段时间的思考。setNamespaceAware(false);默认值为false。
<packageLevelAnnotations>false</packageLevelAnnotations>
    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);