复制静态文件以在 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 设置。
我之前使用的是 ANT(Android 项目)并且我在与我的代码相同的包中有“静态”文件
这是一个例子
src/com/my/app/test/Parser.java
src/com/my/app/test/json_to_parse.json
执行单元测试时,json 文件被复制到 gen 文件夹中,因此可以通过
访问测试中的 jsongetClass().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 设置。