java - Jenkins 在 Windows 虚拟驱动器上的 FileNotFound

标签 java windows maven jenkins

我有一个 Jenkins 安装(版本 1.474)在 Windows Server Enterprise 2007 机器上运行,并且 通过 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 异常,但是,当我使用“mvn test”运行相同的命令时 在 Windows 命令行上,文件被正确读取:

Runs fine on mvn test

你们知道是什么导致了这个问题吗?

最佳答案

@lee-meador 和@jtahlborn 都为我指明了正确的方向。我的 Jenkins 在作为服务运行的 Tomcat 中作为 Web 应用程序运行。结果是 Jenkins 无法看到 X: 驱动器。

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

REGEDIT4 

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

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

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

关于java - Jenkins 在 Windows 虚拟驱动器上的 FileNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795334/

相关文章:

java - 设置tomcat上下文路径

.net - 如何获取当前 Windows 用户的 *network* 身份,而不是他们的交互式登录身份?

java - Maven 依赖、Tomcat7 和部署

node.js - webpack --progress 错误 : write EINVAL

windows - 当 `kernel32.dll` 字段设置为 1 时, `OrdinalBase` 如何导出序数 0?

java - 将第 3 方 JAR 部署到本地存储库

java - 错误 500--内部服务器错误 java.lang.NoClassDefFoundError : javax/servlet/jsp/jSTL/core/Config

java - 每当执行 catch block 时如何设置默认操作?

java - 如何使用java代码将文件作为blob从互联网上传到azure存储?

java - 采访任务: Limit number of concurrent requests with tokens