在没有标记的情况下覆盖Maven中的属性

时间:2013-06-20 10:31:25

标签: maven maven-3 maven-resources-plugin

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

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

baseUrl=${baseUrl}

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

<properties>
    <baseUrl>some_default_url</baseUrl>
</properties>

答案 1 :(得分: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值。