复制静态文件以在 gradle 中构建输出文件夹

copy static files to build output folder in gradle

我之前使用的是 ANT(Android 项目)并且我在与我的代码相同的包中有“静态”文件

这是一个例子

src/com/my/app/test/Parser.java

src/com/my/app/test/json_to_parse.json

执行单元测试时,json 文件被复制到 gen 文件夹中,因此可以通过

访问测试中的 json

getClass().getResourceAsStream(fileName)

我不得不将项目转换为 gradle,但现在测试失败了。 检查“构建”文件夹后,我发现 .json 文件不存在,因此 getResourceAsStream 方法 returns null.

知道如何将这些“静态”文件(json、xml、...)包含到构建文件夹中吗?

您询问的文件在 Maven/Gradle 行话中称为 "resource files"。

Gradle 假定您使用的是 Maven Standard Directory Layout.

因此,要么将文件移至 src/test/resources(然后 Gradle 将自动拾取它们),要么告诉 Gradle 它应该在其他地方寻找资源.

在后一种情况下,您需要 modify the processTestResources task. 但是,将资源文件保存在与源代码相同的目录中是一种不好的做法。所以我建议前一种选择。

在 Android Studio 中,将文件移动到资源文件夹中并没有开箱即用(尽管应该有)

这应该在 Android Studio 1.2 中得到修复。 然而,这就是我所做的:

将所有静态文件移动到资源文件夹中。

在我的单元测试模块中,我已将其添加到 build.gradle 文件

task copyTestResources(type: Copy) {
    from "${projectDir}/src/test/resources"
    into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources

现在,位于 src/test/resources 中的所有文件都将被复制到 /classes/test 中,我可以通过

访问它们
getClass().getResourceAsStream(fileName)

如果我保持资源文件夹中的包结构与 java 文件夹中的相同,我不需要调整任何代码。

为了让故事更完整一点:

JUnit4 运行程序需要

getClass().getResourceAsStream(name)

而 Robolectric 需要

getClass().getClassLoader().getResourceAsStream(name)

如果您在使用 AndroidStudio 创建 apk 时出现问题。

您可以使用 jar.exe

创建包含资源的 jar 文件

例如我将a.txt放入资源目录 运行 命令中的这段代码:

"C:\Program Files\Java\jdk1.7.0_79\bin\jar" cvfe res.jar -c resources

之后创建了一个 jar 文件 "res.jar" 然后将 res.jar 添加到项目的 libs 文件夹中 当您的 apk 创建资源时,资源会添加到您的最终 apk 中,您可以使用此代码访问 a.txt:

someclass.class.getClassLoader().getResourceAsStream("resources/a.txt");

使用此作业无需更改 Gradle 设置。