如何在Android中访问属性资源文件来解析Maven项目信息?

时间:2012-12-24 13:14:42

标签: android maven resources classpath

在我的(非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);

2 个答案:

答案 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)。