1

我想在 Maven 中设置一个属性,但在没有 Maven 的情况下运行应用程序时也要读取一个合理的默认值。

目前我有一个如下所示的属性文件:

baseUrl=${baseUrl}

使用maven-resources-plugin,我可以过滤此属性,并将其设置为 pom 中的默认属性,或者使用-DbaseUrl=命令行覆盖它。到现在为止还挺好。

但是,我想更进一步,baseUrl在属性文件中设置一个合理的默认值,而不必在这样的代码中编写 hack(当代码在单元测试中没有 Maven 的情况下运行时):

 if ("${baseUrl}".equals(baseUrl)){ /* set to default value */ } 

更好的是,我希望这个文件是无版本的,这样每个开发人员都可以设置自己的值。(实际上属性文件应该是分层的,这样开发人员只覆盖相关属性,新属性不会破坏他们的构建。顺便说一下,这是一个 Android 项目,我在单元测试中运行此代码)

4

2 回答 2

0

只需在 POM 中设置属性,在<properties>. -D除非您使用开关、配置文件等覆盖它,否则将使用设置值。在您的情况下,这将是:

<properties>
    <baseUrl>some_default_url</baseUrl>
</properties>
于 2013-06-20T12:04:19.667 回答
0

最后我决定创建一个静态助手:

public class PropertyUtils {


    public static Properties getProperties(Context context)  {
        AssetManager assetManager =  context.getResources().getAssets();
        Properties properties = new Properties();
        try {
            loadProperties(assetManager, "project.properties", properties);
            if (Arrays.asList(assetManager.list("")).contains("local.properties")){
                loadProperties(assetManager, "local.properties", properties);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return properties;
    }

    private static void loadProperties(AssetManager assetManager, String fileName, Properties properties) throws IOException {
        InputStream inputStream = assetManager.open(fileName);
        properties.load(inputStream);
        inputStream.close();
    }
}

assets 目录中的 project.properties 具有以下属性:

baseUrl=${baseUrl} 

和资产中的 local.properties:

baseUrl=http://192.168.0.1:8080/

local.properties 从版本控制中排除,并覆盖任何 project.properties。因此,在 CI 工具中构建时,baseUrl 会被相关值覆盖,并且当在本地(在 IntelliJ 中)运行时,将使用 local.properties 值。

于 2013-06-26T10:30:51.060 回答