Java 单元测试中 Windows 上的测试资源路径



我正在使用此代码在测试代码中获取测试资源文件的Path

Path target = Path.of(
Thread.currentThread().getContextClassLoader()
.getResource("target1").getFile()
);

该文件位于src/test/resources/target1处,并在构建时复制到target/test-classes/tartget1

它在类Unix系统上工作正常,但在Windows上它抛出了一个异常:

java.nio.file.InvalidPathException: 索引 2 处的非法字符 <:>:/D:/a/project-name/repo-name/target/test-classes/target1

使用堆栈跟踪(从 CI 计算机(:

at java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182(at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153(at java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77(at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92(at java.base/

sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229(at java.base/java.nio.file.Path.of(Path.java:147(




以与平台无关的方式获得Path的正确方法是什么?我想对Unix和Windows机器使用相同的代码。(很难为我调试这个问题,因为我没有Windows机器只有CI和Windows。

以下内容适用于我的 Windows 机器,而您的示例也按预期失败:

try {
Path target = Paths.get(Thread.currentThread().getContextClassLoader()
.getResource(FILE).toURI());
System.out.println(target);
} catch (URISyntaxException e) {
e.printStackTrace();
}

我认为这是因为解析 URI 与解析字符串具有不同的实现。

最新更新