1

我在 Windows Server Enterprise 2007 机器上运行了 Jenkins 安装(版本 1.474),通过 Jenkins 运行 maven 测试目标时遇到问题。我的测试需要读取配置路径中的 txt 文件,并且在运行它时出现“FileNotFound”异常:

path: file:////X:/TESTIN/file.txt
java.io.FileNotFoundException: X:\TESTIN\file.txt (The system cannot find the path specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:120)
    at java.io.FileInputStream.<init>(FileInputStream.java:79)
    at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
    at br.com.telecomassociates.taalarms.EncoderTest.open(EncoderTest.java:69)
    at br.com.telecomassociates.taalarms.EncoderTest.readFile(EncoderTest.java:48)
    at br.com.telecomassociates.taalarms.EncoderTest.testDecrypt(EncoderTest.java:22)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    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.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68)

有问题的一点是,这个文件是通过虚拟 Windows 驱动器引用的:

该文件物理上位于 D:/TESTOUT/TESTIN/file.txt 但我们使用了上述命令:

subst X: D:/TESTOUT

我们在测试代码中通过 URI file:///X:/TESTIN/file.txt 引用它。

当 Jenkins/maven 运行它时,我得到一个 FileNotFound 异常,但是,当我在 Windows 命令行上使用“mvn test”运行相同的命令时,文件被正确读取:

在 mvn 测试上运行良好

你们对可能导致问题的原因有任何想法吗?

4

1 回答 1

2

@lee-meador 和 @jtahlborn 都为我指明了正确的方向。我的 Jenkins 在作为服务运行的 Tomcat 中作为 Web 应用程序运行。原来詹金斯看不到X:驱动器。

为了解决这个问题,我遵循了https://code.google.com/p/psubst/上的建议。我生成了一个包含以下内容的“.reg”文件:

REGEDIT4 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices] 
"Z:"="\\??\\D:\\TESTOUT" 

然后我执行它并重新启动机器。

驱动器 X: 现在对所有用户可见,Jenkins 可以完美地看到它。

于 2013-05-28T17:40:08.370 回答