2011-11-30 49 views
0

今天,我遇到了一個從Maven運行的Groovy代碼的奇怪問題(使用gmaven-plugin)。我只在單元測試中使用Groovy。所有的單元測試都在Eclipse中傳遞,但是,當我使用Maven運行它時,某些單元測試出現錯誤。gmaven-plugin SAX解析器錯誤

有問題的Groovy代碼涉及到XML操作。這是一種向XML有效負載添加屬性的類別方法。

class BaseTestCategoryMethods { 
    private static XmlSlurper slurper = new XmlSlurper(false, false) 
    public static String schemaVersion(String self, String version) { 
    def root = slurper.parseText(self) 
    [email protected] = version 
    return XmlUtil.serialize(root) 
    } 
} 

,我發現了以下錯誤:

<error message="org.xml.sax.SAXParseException: Premature end of file." type="net.sf.saxon.trans.XPathException">net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: Premature end of file. 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:418) 
    at net.sf.saxon.event.Sender.send(Sender.java:214) 
    at net.sf.saxon.event.Sender.send(Sender.java:50) 
    at net.sf.saxon.Controller.transform(Controller.java:1611) 
    at sun.reflect.GeneratedMethodAccessor18.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:229) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:129) 
    at com.sabre.ticketing.mapper.xmlapproach.BaseLRecTest$_closure3.doCall(BaseLRecTest.groovy:56) 
    at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1101) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1064) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:719) 
    at com.sabre.ticketing.mapper.xmlapproach.BaseLRecTest.invokeMethod(BaseLRecTest.groovy) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:719) 
    at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:44) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:143) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:151) 
    at com.sabre.ticketing.mapper.xmlapproach.LRecC4Test$_testFrequentFlyerAirlineCode_closure22_closure30.doCall(LRecC4Test.groovy:199) 
    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.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at groovy.lang.Closure.call(Closure.java:279) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.callClosureForMapEntry(DefaultGroovyMethods.java:1911) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1184) 
    at org.codehaus.groovy.runtime.dgm$88.invoke(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:270) 
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
    at com.sabre.ticketing.mapper.xmlapproach.LRecC4Test$_testFrequentFlyerAirlineCode_closure22.doCall(LRecC4Test.groovy:198) 
    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.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:143) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:151) 
    at com.sabre.ticketing.mapper.xmlapproach.LRecC4Test$_testFrequentFlyerAirlineCode_closure22.doCall(LRecC4Test.groovy) 
    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.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234) 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893) 
    at groovy.lang.Closure.call(Closure.java:279) 
    at groovy.lang.Closure.call(Closure.java:274) 
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:92) 
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.access$200(GroovyCategorySupport.java:60) 
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:202) 
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.use(DefaultGroovyMethods.java:324) 
    at org.codehaus.groovy.runtime.dgm$613.invoke(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:307) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:51) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:47) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:143) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:155) 
    at com.sabre.ticketing.mapper.xmlapproach.LRecC4Test.testFrequentFlyerAirlineCode(LRecC4Test.groovy:195) 
    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 junit.framework.TestCase.runTest(TestCase.java:168) 
    at junit.framework.TestCase.runBare(TestCase.java:134) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:243) 
    at junit.framework.TestSuite.run(TestSuite.java:238) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) 
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) 
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177) 
    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.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) 
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) 
Caused by: org.xml.sax.SAXParseException: Premature end of file. 
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(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 net.sf.saxon.event.Sender.sendSAXSource(Sender.java:404) 
    ... 109 more 

而且GMaven插件的配置是這樣的:

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <extensions>true</extensions> 
    <executions> 
     <execution> 
      <goals> 
       <goal>testCompile</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <fileset> 
         <directory>${pom.basedir}/src/test/groovy</directory> 
         <includes> 
          <include>**/*.groovy</include> 
         </includes> 
        </fileset> 
       </sources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

請幫助。我嘗試了一切。爲什麼它在Eclipse中工作?我確定問題不在於類別方法。

+0

也許這可以給你一個線索http://www.danielschneller.com/2008/01/saxparseexception-1-1-premature-end-of.html – dhblah

回答

0

我找不到什麼造成該故障的行爲,但是,我已經成功地發現,使用XmlParser,而不是XmlSlurper,並且不使用XmlUtil.serialize()準備XML結果的解決方法:

class BaseTestCategoryMethods { 
    public static String schemaVersion(String self, String version) { 
     def root = new XmlParser().parseText(self) 
     root.attributes().put("version", version) 
     StringWriter sw = new StringWriter() 
     def printer = new XmlNodePrinter(new PrintWriter(sw), "") 
     printer.setPreserveWhitespace(true) 
     printer.print(root); 
     return sw.toString().readLines().join() 
    } 
} 

這在Eclipse和Maven命令行中工作。

0

我意識到這不是一個真的答案,但我與GMaven自己奮鬥了好幾個月。然後,我轉向了gradle,突然雲層分開了。非常適合構建Java項目和使用Groovy進行測試等。今年早些時候,GMaven對我來說似乎已經死了。如果你堅持使用GMaven,那麼我認爲自從GMaven的文檔對我來說似乎已經過時了以後,我可以充分利用Spock和Maven的例子。

祝你好運!