在我的(非Android测试)测试中,我将一个名为common.properties的资源放在我的Android项目的 src / main / resources 中,以读取 Maven项目版本它:
@Test
public void testReadVersion() throws IOException {
Properties props = new Properties();
props.load(FileUtils.openInputStream(FileUtils.toFile(this.getClass().getResource("/common.properties"))));
String version = props.getProperty("version");
assertNotNull(version);
assertTrue(!"".equals(version));
}
这很有效。 但是当我尝试在生产代码中访问相同的资源时,我总是在访问资源时获得NullPointerExceptions:
Properties props = new Properties();
final StringBuilder versionBuilder = new StringBuilder();
try {
props.load(FileUtils.openInputStream(FileUtils.toFile(this.getClass().getResource("/common.properties"))));
versionBuilder.append(props.getProperty("version"));
}
catch (IOException e) {
// will be ignored.
}
我调试了它。它为null,因为它找不到资源。我该怎么解决这个问题?当我将文件放入 res / raw 以通过
读取它时props.load(getResources().openRawResource(R.raw.common));
文件访问有效,但无法从我的文件内容中翻译该值: version = $ {project.version} 。 结果将是值字符串本身 $ {project.version} 而不是版本1.0 等。我有什么选择?
[UPDATE]
下面接受的解决方案不再适用于我的最新项目。我总是得到$ {project.version}而不是值。不知道为什么会这样。即使是AssetManager的解决方案也不适用于我。我发现了一个很好的解决方法,也不那么不方便。我获取并显示android:versionName(AndroidManifest)的信息。
String versionName = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
TextView version = (TextView)findViewById(R.id.version);
version.setText(" " + versionName);
答案 0 :(得分:0)
首先,我建议使用更简单的方法:
InputStream resourceAsStream = this.getClass().getResourceAsStream("/common.properties");
Properties prop = new Properties();
prop.load(resourceAsStream);
如果您在测试中运行或在生产代码中运行,它将起作用。 此外,要从资源中替换pom中的值,您必须设置过滤:
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
</resources>
...
</build>
...
</project>
答案 1 :(得分:0)
@khmarbaise解决方案对我不起作用,所以我结合了资源过滤(Dmitriy Tarasov示例)和资产加载使用AssetManager(描述为here)。