【问题标题】:Use src/test/resources as directory with gradle java使用 src/test/resources 作为 gradle java 的目录
【发布时间】:2020-10-18 08:27:19
【问题描述】:

我有两个包含 java 代码和资源的工作目录,一个用于测试,另一个用于生产。

src/main/java
src/main/资源

src/test/java
src/test/资源

当运行我的代码并像这样从 FileInputStream 读取文件时:

new FileInputStream("./someFile.json");

只要文件位于项目的根目录中,它就可以正常工作。如果我在资源文件夹中有文件并像这样直接指向它,它也可以工作:

new FileInputStream("src/test/resources/someFile.json");

有没有办法将 gradle 中的 src/test/resources 声明为 FileInputStream 查找资源的主文件夹?

如果我把我的文件这样放,它工作正常。

但是当我像这样将文件放在 src/test/java/resources 中时

我得到一个 fileNotFoundException。

我需要一种方法来添加要使用 gradle 扫描的目录。



将此添加到 build.gradle 仍然会引发 fileNotFoundException。

sourceSets {
test {
    java {
        srcDirs = ['src/test/java']
    }
    resources {
        srcDirs = ['src/test/resources']
        }
    }
}

【问题讨论】:

  • 不要像访问文件一样访问资源。如果您需要为资源打开InputStream,请使用Class#getResourceAsStream(String)。请注意,Gradle 源目录是类路径/模块路径的“根”(因此不包含在资源名称中)。
  • 是的,您确实误解了它。我只是想从测试代码而不是生产代码访问测试资源文件夹。
  • 那很好 :) 但是我的第一条评论仍然适用。
  • 更新了我的问题以更清晰。我只希望能够通过 gradle 访问正确的资源目录。可能与 sourceSets 有关。
  • 您使用的构建工具无关紧要(并且 Gradle 已经在 src/test/resources 下正确处理资源,作为 java 插件的一部分开箱即用)。资源通过Class#getResourceAsStream(String) 和相关API 访问。请勿尝试使用FileInputStream 读取资源。

标签: java gradle intellij-idea


【解决方案1】:

如果您使用java 或者,因为您似乎正在构建一个命令行应用程序application 插件,那么一切都将为您设置开箱即用:

plugins {
    id 'application'
}

您可以删除所有 sourceSet 配置,然后像这样加载文件:

new FileInputStream("/someFile.json");

(请注意,我写了/ 而不是./,这将含义从“查看当前目录,项目根目录”更改为“查看类路径资源的根目录”。)
最好遵循 Slaw 在问题下的评论并通过 Class#getResourceAsStream(String) 找到文件 - 但这有点超出您的问题。

【讨论】:

  • "但这有点超出你的问题" – 我不同意。不应使用FileInputStream 读取资源永远。资源不一定是文件,这意味着假设它们是错误的(例如,一旦打包在 JAR 文件中,它们就是 JAR 文件中的条目,而不是文件本身)。向资源打开InputStream 的正确方法是通过Class#getResourceAsStream(String)(或相关API)。除了将资源放在正确的源目录(在本例中为src/test/resources)之外,所使用的构建工具无关紧要。
  • 你是对的@Slaw!这就是我再次提到它的原因。
  • 当使用 Class#getResourceAsStream(String) 时,我得到一个 no JSON input found 错误。
  • 也许这有帮助? stackoverflow.com/q/1464291/1005481 它有 Jon Skeet 的答案!
  • 我尝试了您的建议,即应用程序插件,但在 IDE 的“问题”视图中不断出现“Gradle 错误标记”,并且build.gradle 文件上出现了红十字覆盖。任何的想法?如果这很重要,我正在使用 Gradle v7.1.1。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2015-03-22
  • 2015-04-24
  • 1970-01-01
  • 2016-11-19
  • 2021-04-23
相关资源
最近更新 更多