使用Java 10时忽略Jaxb软件包信息

时间:2018-09-03 23:20:51

标签: jaxb java-10

我为此感到挣扎,任何信息将不胜感激。我有一个项目一直在使用JAXB从XML Schema构造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)。这些类生成良好,并且有一个package-info.java类生成并编译到结果jar中。有问题的班级看起来像这样

@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;

package-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;

因为这是Java 10,所以我将直接依赖项添加到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类文件,将名称空间属性添加到@XmlRootElement批注...

@XmlRootElement(namespace = "http://www.minestar.cat.com/namespace/units", name = "units")
public class Units {

当此java文件被编译并在下游使用时,可以解析XML文件。我没有收到UnmarshalException。但是,此源文件已生成,因此我不能依赖这些更改。此外,从我比其他人了解更多信息的地方,package-info.class文件(位于JAR文件中)应该使注释中的名称空间值不必要。

如果某些事情我没有正确设置,我将非常感谢您在Java 10中获得帮助。

感谢您的帮助, 埃德

3 个答案:

答案 0 :(得分:2)

我实际上在Java 9上也面临同样的问题。

添加com.sun.xml.bind.backupWithParentNamespace系统属性可以使其正常工作,但是我认为这可以解决此问题。

我查看了Java 9源代码(尚未查看Java 10源代码),它位于java.lang.Package.getPackageInfo()方法的内部,该方法尝试使用以下方法加载package-info类:

...
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”参数来关闭程序包级注释

答案 1 :(得分:0)

在我使用JDK 9的项目中,针对同一问题找到了以下解决方案:

.panel,
.flip {
  padding: 10px;
  text-align: center;
  background-color: #38ada9;
  border: solid 1px #c3c3c3;
  border-radius: 25px;
}

.panel {
  display: none;
}

答案 2 :(得分:0)

我在命名空间上也遇到类似的问题,在自制插件中使用JAXB进行编组。

我正在使用Java 11。

我解决了将Maven升级到3.6.2的问题(Maven 3.5.2出现了问题)。不确定是否能够解释它为什么起作用,但是它是否可以帮助某人...