Travis CI 和 Gradle 的 JUnit 找不到类路径资源
Travis CI and JUnit with Gradle cannot find classpath resources
我有一个项目,您可以在 feat/config
分支的 GitHub 页 here 中找到其完整源代码。我遇到的问题是 ClassName.class.getClassLoader().getResourceAsStream()
总是 returns null
,并使用完整路径(包括源目录)创建 File
也 returns FileNotFoundException
.
此代码应从类路径资源中加载默认配置值并将其写入 File
。它在本地工作但在 Travis CI.
上失败
public static void writeDefault(String res, File out) throws IOException {
if (!out.exists()) {
out.getParentFile().mkdirs();
out.createNewFile();
}
OutputStream stream = new FileOutputStream(out);
InputStream in = FileConfig.class.getClassLoader().getResourceAsStream(res);
if (in == null) {
stream.close();
throw new FileNotFoundException(res);
}
IOUtils.copy(in, stream);
stream.close();
}
@Test
public void testFileConfig() throws IOException {
System.out.println("Creating default config file");
File testConfigFile = new File("configs/test.txt");
if (!testConfigFile.exists())
FileConfig.writeDefault("configs/test.txt", testConfigFile);
System.out.println("Loading config file");
Config testConfig = FileConfig.loadConfig(testConfigFile);
System.out.println("Loaded value: " + testConfig.getValue("value-1"));
System.out.println("Deleting config file");
testConfigFile.deleteOnExit();
}
以上测试失败,堆栈跟踪如下:
jtrial.config.TestConfig > testFileConfig STANDARD_OUT
Creating default config file
jtrial.config.TestConfig > testFileConfig FAILED
java.io.FileNotFoundException: configs/test.txt
at jtrial.config.FileConfig.writeDefault(FileConfig.java:111)
at jtrial.config.TestConfig.testFileConfig(TestConfig.java:24)
.travis.yml
配置文件:
language: java
jdk:
- oraclejdk8
notifications:
email: false
install:
- chmod +x ./gradlew
- ./gradlew --info assemble
script: ./gradlew --info check
我认为您的问题是由这个 Gradle 问题引起的:src/test/resources not added to classpath intermittently。
咳咳……做好畏缩和捂脸的准备!
我刚刚意识到...我在 .gitignore
文件中有 configs/
。这不仅忽略了根项目目录中的 configs/
目录,而且忽略了 configs/
的每个实例。我只是用 ./configs/
替换它,然后实际上将文本文件添加到新的提交中。 *捂脸到一个新的维度*
我有一个项目,您可以在 feat/config
分支的 GitHub 页 here 中找到其完整源代码。我遇到的问题是 ClassName.class.getClassLoader().getResourceAsStream()
总是 returns null
,并使用完整路径(包括源目录)创建 File
也 returns FileNotFoundException
.
此代码应从类路径资源中加载默认配置值并将其写入 File
。它在本地工作但在 Travis CI.
public static void writeDefault(String res, File out) throws IOException {
if (!out.exists()) {
out.getParentFile().mkdirs();
out.createNewFile();
}
OutputStream stream = new FileOutputStream(out);
InputStream in = FileConfig.class.getClassLoader().getResourceAsStream(res);
if (in == null) {
stream.close();
throw new FileNotFoundException(res);
}
IOUtils.copy(in, stream);
stream.close();
}
@Test
public void testFileConfig() throws IOException {
System.out.println("Creating default config file");
File testConfigFile = new File("configs/test.txt");
if (!testConfigFile.exists())
FileConfig.writeDefault("configs/test.txt", testConfigFile);
System.out.println("Loading config file");
Config testConfig = FileConfig.loadConfig(testConfigFile);
System.out.println("Loaded value: " + testConfig.getValue("value-1"));
System.out.println("Deleting config file");
testConfigFile.deleteOnExit();
}
以上测试失败,堆栈跟踪如下:
jtrial.config.TestConfig > testFileConfig STANDARD_OUT
Creating default config file
jtrial.config.TestConfig > testFileConfig FAILED
java.io.FileNotFoundException: configs/test.txt
at jtrial.config.FileConfig.writeDefault(FileConfig.java:111)
at jtrial.config.TestConfig.testFileConfig(TestConfig.java:24)
.travis.yml
配置文件:
language: java
jdk:
- oraclejdk8
notifications:
email: false
install:
- chmod +x ./gradlew
- ./gradlew --info assemble
script: ./gradlew --info check
我认为您的问题是由这个 Gradle 问题引起的:src/test/resources not added to classpath intermittently。
咳咳……做好畏缩和捂脸的准备!
我刚刚意识到...我在 .gitignore
文件中有 configs/
。这不仅忽略了根项目目录中的 configs/
目录,而且忽略了 configs/
的每个实例。我只是用 ./configs/
替换它,然后实际上将文本文件添加到新的提交中。 *捂脸到一个新的维度*