2011-08-19 65 views
2

當前我正在開發一個spring應用程序。到現在爲止,我使用Ant和Junit來運行代碼。現在我想測試代碼也從螞蟻與Java任務,失敗是由於以下異常移動到一個Java類,並運行它:在junit中運行代碼時的不同行爲

[java] javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194) 
[java]  at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) 
[java]  at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) 
[java]  at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[java]  at java.lang.reflect.Method.invoke(Method.java:597) 
[java]  at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java]  at org.apache.tools.ant.Task.perform(Task.java:348) 
[java]  at org.apache.tools.ant.Target.execute(Target.java:357) 
[java]  at org.apache.tools.ant.Target.performTasks(Target.java:385) 
[java]  at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
[java]  at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
[java]  at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java]  at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
[java]  at org.apache.tools.ant.Main.runBuild(Main.java:758) 
[java]  at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java]  at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
[java]  at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 
[java] Caused by: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 
[java]  at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:129) 
[java]  at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:849) 
[java]  at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773) 
[java]  at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483) 
[java]  at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) 
[java]  at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73) 
[java]  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) 
[java]  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
[java]  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
[java]  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:645) 
[java]  at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:160) 
[java]  at org.springframework.context.support.AbstractRefreshableApplicationContext.<init>(AbstractRefreshableApplicationContext.java:89) 
[java]  at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.<init>(AbstractRefreshableConfigApplicationContext.java:59) 
[java]  at org.springframework.context.support.AbstractXmlApplicationContext.<init>(AbstractXmlApplicationContext.java:61) 
[java]  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:136) 
[java]  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
[java]  at org.postslurper.Main.init(Unknown Source) 
[java]  at org.postslurper.Main.<init>(Unknown Source) 
[java]  at org.postslurper.Main.main(Unknown Source) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[java]  at java.lang.reflect.Method.invoke(Method.java:597) 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:217) 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:152) 
[java]  ... 21 more 
[java] --- Nested Exception --- 
[java] javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found 
[java]  at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:129) 
[java]  at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:849) 
[java]  at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773) 
[java]  at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483) 
[java]  at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) 
[java]  at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73) 
[java]  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242) 
[java]  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 
[java]  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 
[java]  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:645) 
[java]  at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:160) 
[java]  at org.springframework.context.support.AbstractRefreshableApplicationContext.<init>(AbstractRefreshableApplicationContext.java:89) 
[java]  at org.springframework.context.support.AbstractRefreshableConfigApplicationContext.<init>(AbstractRefreshableConfigApplicationContext.java:59) 
[java]  at org.springframework.context.support.AbstractXmlApplicationContext.<init>(AbstractXmlApplicationContext.java:61) 
[java]  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:136) 
[java]  at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
[java]  at org.postslurper.Main.init(Unknown Source) 
[java]  at org.postslurper.Main.<init>(Unknown Source) 
[java]  at org.postslurper.Main.main(Unknown Source) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[java]  at java.lang.reflect.Method.invoke(Method.java:597) 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:217) 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:152) 
[java]  at org.apache.tools.ant.taskdefs.Java.run(Java.java:764) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:218) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:132) 
[java]  at org.apache.tools.ant.taskdefs.Java.execute(Java.java:105) 
[java]  at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
[java]  at java.lang.reflect.Method.invoke(Method.java:597) 
[java]  at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java]  at org.apache.tools.ant.Task.perform(Task.java:348) 
[java]  at org.apache.tools.ant.Target.execute(Target.java:357) 
[java]  at org.apache.tools.ant.Target.performTasks(Target.java:385) 
[java]  at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) 
[java]  at org.apache.tools.ant.Project.executeTarget(Project.java:1306) 
[java]  at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java]  at org.apache.tools.ant.Project.executeTargets(Project.java:1189) 
[java]  at org.apache.tools.ant.Main.runBuild(Main.java:758) 
[java]  at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java]  at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) 
[java]  at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104) 
[java] Java Result: -1 

執行以下命令行,這是當拋出此異常主要的邏輯,包括測試代碼和java類。

context = new ClassPathXmlApplicationContext("services.xml"); 

下面的代碼片斷顯示了兩個進程是如何從ant啓動的。兩個目標都使用相同的類路徑。

<target name="collect"> 
    <java classname="my.project.Main" classpathref="master-classpath"> 
    </java> 
</target> 

<target name="test"> 
    <property name="result.ext" value=".log"></property> 
    <junit> 
     <classpath refid="master-classpath"></classpath> 
     <test name="my.project.test.TestMain" todir="out" outfile="dump"> 
      <formatter type="plain" extension="${result.ext}"/> 
     </test> 
    </junit> 
    <fail if="test.trace">${test.trace}</fail> 
</target> 

我還傾倒JVM的屬性(System.getproperties()):

java.runtime.name: Java(TM) SE Runtime Environment 
sun.boot.library.path: /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/amd64 
java.vm.version: 16.3-b01 
ant.library.dir: /usr/share/ant/lib 
java.vm.vendor: Sun Microsystems Inc. 
java.vendor.url: http://java.sun.com/ 
path.separator: : 
java.vm.name: Java HotSpot(TM) 64-Bit Server VM 
file.encoding.pkg: sun.io 
user.country: DE 
sun.java.launcher: SUN_STANDARD 
sun.os.patch.level: unknown 
java.vm.specification.name: Java Virtual Machine Specification 
user.dir: /home/some-desktop/hm-repo/ssb-dev/trunk 
java.runtime.version: 1.6.0_20-b02 
java.awt.graphicsenv: sun.awt.X11GraphicsEnvironment 
java.endorsed.dirs: /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/endorsed 
os.arch: amd64 
java.io.tmpdir: /tmp 
line.separator: 

java.vm.specification.vendor: Sun Microsystems Inc. 
os.name: Linux 
ant.home: /usr/share/ant 
sun.jnu.encoding: UTF-8 
java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/../lib/amd64:/home/some-desktop/Dev/web2test/web2test-1.3/bin/:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 
java.specification.name: Java Platform API Specification 
java.class.version: 50.0 
sun.management.compiler: HotSpot 64-Bit Server Compiler 
os.version: 2.6.32-24-generic 
user.home: /home/some-desktop 
user.timezone: 
java.awt.printerjob: sun.print.PSPrinterJob 
file.encoding: UTF-8 
java.specification.version: 1.6 
java.class.path: /usr/share/ant/lib/ant-launcher.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/xercesImpl.jar:/home/some-desktop/.ant/lib/ivy.jar:/home/some-desktop/.ant/lib/jsch.jar:/usr/share/ant/lib/ant-apache-resolver.jar:/usr/share/ant/lib/ant-apache-bcel.jar:/usr/share/ant/lib/ant-nodeps.jar:/usr/share/ant/lib/ant-swing.jar:/usr/share/ant/lib/ant-apache-oro.jar:/usr/share/ant/lib/ant-launcher.jar:/usr/share/ant/lib/ant-commons-logging.jar:/usr/share/ant/lib/ant-jsch.jar:/usr/share/ant/lib/ant-jdepend.jar:/usr/share/ant/lib/ant.jar:/usr/share/ant/lib/ant-javamail.jar:/usr/share/ant/lib/ant-antlr.jar:/usr/share/ant/lib/ant-commons-net.jar:/usr/share/ant/lib/ant-apache-log4j.jar:/usr/share/ant/lib/ant-apache-bsf.jar:/usr/share/ant/lib/ant-junit.jar:/usr/share/ant/lib/ant-trax.jar:/usr/share/ant/lib/junit.jar:/usr/share/ant/lib/ant-apache-regexp.jar:/usr/share/ant/lib/ant-jmf.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/lib/tools.jar 
user.name: some-desktop 
java.vm.specification.version: 1.0 
java.home: /usr/lib/jvm/java-6-sun-1.6.0.20/jre 
sun.arch.data.model: 64 
user.language: de 
java.specification.vendor: Sun Microsystems Inc. 
java.vm.info: mixed mode 
java.version: 1.6.0_20 
java.ext.dirs: /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/ext:/usr/java/packages/lib/ext 
sun.boot.class.path: /usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/resources.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/rt.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/jsse.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/jce.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/charsets.jar:/usr/lib/jvm/java-6-sun-1.6.0.20/jre/classes 
java.vendor: Sun Microsystems Inc. 
file.separator:/
java.vendor.url.bug: http://java.sun.com/cgi-bin/bugreport.cgi 
sun.io.unicode.encoding: UnicodeLittle 
sun.cpu.endian: little 
sun.cpu.isalist: 

我還計算出的Java屬性的一個diff,這是在不同的Junit唯一線是

user.timezone: Europe/Berlin 

有沒有人有想法,有什麼不對?

乾杯,

GLA

+0

除非在任務上設置了fork =「true」',否則兩個任務('java'和'junit')都運行在與ant相同的JVM和相同環境中。嘗試用fork設置爲true來運行它們,以減少對螞蟻環境的依賴。 –

+0

謝謝@JB,它現在可以工作!不過,我不明白,爲什麼這個XML解析器的問題引起與Java。有人在那裏,誰可以提供一些背景信息? – GLA

回答

2

這是很難說究竟爲什麼你有這個問題,但它會爲JB Nizet說是與正從螞蟻繼承的類路徑。你會注意到你的錯誤來自spring的log4j/slf4j。

當您使用fork =「false」從ant啓動junit時,它使用ant定義的類路徑,該路徑可能包括各種依賴項,包括取決於不同版本的xerces的不同版本的log4j。

當你分叉時,你有一個更清潔的環境,所以它的工作原理。

爲了避免這種問題,一般是到餐桌JUnit測試,以避免所有這些依賴拖動到你的項目是個好主意。不分叉可能會導致其他問題。

有關更多選項,請參閱Ant Junit Task

+0

好吧,沒有必要深入研究,我只是使用叉子選項。謝謝您的回答。 – GLA

相關問題