我想在Maven中设置一个属性,但在没有Maven的情况下运行应用程序时也会读取合理的默认值。
目前我有一个属性文件,如下所示:
baseUrl=${baseUrl}
使用 maven-resources-plugin ,然后我可以过滤此属性,并将其设置为pom中的默认属性,或者使用命令行中的-DbaseUrl=
覆盖它。到现在为止还挺好。
但是,我想更进一步,在属性文件中设置合理的默认值baseUrl
,而不必像这样编写代码(当代码在单元测试中没有Maven时运行):
if ("${baseUrl}".equals(baseUrl)){ /* set to default value */ }
更好的是,我希望这个文件是无版本的,这样每个开发人员都可以设置自己的值。 (实际上属性文件应该是分层的,开发人员只能覆盖相关属性,新属性不会破坏它们的构建。顺便说一句,这是一个Android项目,我在单元测试中运行这个代码)
答案 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值。