覆盖Maven中的属性而不使用标记化



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

目前我有一个属性文件,看起来像这样:

baseUrl=${baseUrl}

使用maven-resources-plugin,我可以过滤这个属性,并将其设置为pom中的默认属性,或者从命令行使用-DbaseUrl=覆盖它。到目前为止一切顺利。

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

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

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

<properties>中设置POM中的属性。除非您通过使用-D开关、配置文件等覆盖它,否则将使用设定值。在您的例子中,这将是:

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

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

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();
    }
}

项目。资产目录中的属性具有以下属性:

baseUrl=${baseUrl} 

和地方。资产中的属性:

baseUrl=http://192.168.0.1:8080/

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

相关内容

  • 没有找到相关文章

最新更新