我想在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中),本地的。