2011-12-16 80 views
3

我有一个模块化项目,其中对于每个单独的模块,我使用jaxb2-maven-plugin来编译xjc文件。现在,假设模块按照A - > B的顺序编译。对于一切工作正常(即我得到的* XsdImpl.java),但对于BI得到如下:jaxb2 maven插件在第二次执行时不起作用

[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:1.2:xjc (model) on project B: DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory. -> [Help 1] 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:1.2:xjc (model) on project B: DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: org.apache.maven.plugin.MojoExecutionException: DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory. 
     at org.codehaus.mojo.jaxb2.XjcMojo.execute(XjcMojo.java:352) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     ... 19 more 
Caused by: org.apache.xerces.impl.dv.DVFactoryException: DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory. 
     at org.apache.xerces.impl.dv.DTDDVFactory.getInstance(Unknown Source) 
     at org.apache.xerces.impl.dv.DTDDVFactory.getInstance(Unknown Source) 
     at org.apache.xerces.impl.xs.opti.SchemaParsingConfig.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.opti.SchemaParsingConfig.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.traversers.XSDHandler.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.traversers.XSDHandler.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.XMLSchemaLoader.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.XMLSchemaLoader.<init>(Unknown Source) 
     at org.apache.xerces.impl.xs.XMLSchemaValidator.<init>(Unknown Source) 
     at org.apache.xerces.jaxp.validation.XMLSchemaValidatorComponentManager.<init>(Unknown Source) 
     at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.<init>(Unknown Source) 
     at org.apache.xerces.jaxp.validation.AbstractXMLSchema.newValidatorHandler(Unknown Source) 
     at com.sun.tools.xjc.SchemaCache.newValidator(SchemaCache.java:47) 
     at com.sun.tools.xjc.reader.xmlschema.bindinfo.AnnotationParserFactoryImpl$1$1.startElement(AnnotationParserFactoryImpl.java:136) 
     at com.sun.xml.xsom.impl.parser.state.NGCCRuntime.startElement(NGCCRuntime.java:214) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at com.sun.tools.xjc.reader.ExtensionBindingChecker.startElement(ExtensionBindingChecker.java:271) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at com.sun.tools.xjc.reader.xmlschema.parser.IncorrectNamespaceURIChecker.startElement(IncorrectNamespaceURIChecker.java:97) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at com.sun.tools.xjc.reader.xmlschema.parser.CustomizationContextChecker.startElement(CustomizationContextChecker.java:172) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at com.sun.tools.xjc.ModelLoader$SpeculationChecker.startElement(ModelLoader.java:427) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at com.sun.tools.xjc.reader.internalizer.VersionChecker.startElement(VersionChecker.java:78) 
     at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527) 
     at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) 
     at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
     at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
     at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
     at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
     at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
     at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
     at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
     at org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333) 
     at com.sun.xml.xsom.parser.JAXPParser.parse(JAXPParser.java:79) 
     at com.sun.tools.xjc.ModelLoader$2.parse(ModelLoader.java:451) 
     at com.sun.tools.xjc.ModelLoader$XMLSchemaParser.parse(ModelLoader.java:237) 
     at com.sun.xml.xsom.impl.parser.NGCCRuntimeEx.parseEntity(NGCCRuntimeEx.java:298) 
     at com.sun.xml.xsom.impl.parser.ParserContext.parse(ParserContext.java:87) 
     at com.sun.xml.xsom.parser.XSOMParser.parse(XSOMParser.java:147) 
     at com.sun.tools.xjc.ModelLoader.createXSOMSpeculative(ModelLoader.java:468) 
     at com.sun.tools.xjc.ModelLoader.loadXMLSchema(ModelLoader.java:338) 
     at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:145) 
     at com.sun.tools.xjc.ModelLoader.load(ModelLoader.java:91) 
     at com.sun.tools.xjc.Driver.run(Driver.java:287) 
     at org.codehaus.mojo.jaxb2.XjcMojo.execute(XjcMojo.java:301) 
     ... 21 more 
[ERROR] 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 

两个模块使用相同的配置插件:

<plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>jaxb2-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>model</id> 
         <goals> 
          <goal>xjc</goal> 
         </goals> 

         <configuration> 
          <extension>true</extension> 
          <clearOutputDir>false</clearOutputDir> 
          <bindingDirectory>${basedir}/src/main/resources/xsd</bindingDirectory> 

          <outputDirectory>${basedir}/src/main/generated</outputDirectory> 
          <schemaDirectory>${basedir}/src/main/generated/xsd</schemaDirectory> 

          <schemaFiles>base.xsd</schemaFiles> 
          <staleFile>${project.build.directory}/generated-sources/jaxb/.staleFlag-model</staleFile> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

错误总是用于第二个模块(A或B无关紧要)。 我花了很多时间试图找出幕后发生的事情,但可惜没有成功...... 例如,我想了解在第一次执行这里发生了什么:

at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    --->>> at org.xml.sax.helpers.XMLFilterImpl.parse(XMLFilterImpl.java:333) 

我会猜测另一个类被用来代替org.apache.xerces.jaxp.SAXParserImpl,但不知何故org.apache.xerces.jaxp.SAXParserImpl被选中第二次..你知道我怎么能证明这一点?还是有人遇到同样的问题了?

非常感谢任何提示/帮助! 再见

回答

7

问题是,您无意中提供了JAXP实现,但没有JAXP API,这与JRE捆绑在一起的JAXP API不兼容。

为了解决这个问题,我在我的项目添加JAXP API +实现依赖于所有JAXB2插件

  </executions> 
      <dependencies> 
       <dependency> 
        <groupId>xml-apis</groupId> 
        <artifactId>xml-apis</artifactId> 
        <version>1.3.04</version> 
       </dependency> 
       <dependency> 
        <groupId>xerces</groupId> 
        <artifactId>xercesImpl</artifactId> 
        <version>2.9.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

记住更新所有JAXB2插件,不只是失败的一个。这是因为插件依赖关系仅在第一次执行插件时解析一次。这可能是也可能不是发生故障的模块。

== ==编辑

请记住,自从Java 1.6,所有必要的JAXP,JAXB的Xerces,Xalan的,JAX-WS RI,SAAJ和相关类是在JRE库捆绑在一起。

不需要在您的项目中包含这些代码中的任何代码,除非您正在构建一个陈旧的JDK(1.5或更旧版本)。因此,如果您从POM中删除JAXB依赖关系(也可能升级到最新的jaxb2-maven-plugin),那么您的构建可能会正常工作。

+0

我花了很多的搜索和这次终于也解决了同样的错误,我的解决方案。使用` 2.11.0`的xerces。我能够省略xml-apis,他们解决了v1.4.01 – r1chjc 2015-09-08 10:08:04

0

我有类似的问题,并通过更改以下Maven编译器的版本号从1.9到3.1为我工作。在我的POM我已经下插件在2个地方做这种改变......

<artifactId>maven-compiler-plugin</artifactId> 
    <version>3.1</version>