两个目标:
我想使用参数化的jenkins构建来构建war文件,并在war文件的构建过程中设置一些属性。
我还希望能够在部署war文件的服务器上优化这些属性。
第一个是设置适合目标环境的属性,第二个是能够快速更改它们,而无需再次重建整个应用程序。
在这种情况下,选择maven配置文件不够灵活。
一个示例是端口号,对于每个构建都是不同的,但是可以由部署文件的系统的系统管理员自发地更改。
我的想法是使用maven-resource-filtering插件将构建参数添加到属性文件中。然后在glassfish / tomcat上启动webapp以查看设置的JVM变量。
我在思考正确的方向吗?
答案 0 :(得分:0)
经过一番研究后,我的解决方案如下所示: 对于给定的参数" test":
目标1。:执行maven构建时使用命令行参数,例如:
install -Dtest=OnBuildValue
然后使用maven resources插件,通过build上的给定参数替换属性文件中的test=${test}
等字符串。添加:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven.resources.version}</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/parameters.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
....
</build>
目标2。:为了能够更改参数&#34; test&#34;在容器中,无需重建war文件,添加JVM参数-DTEST=ContainerValue
。
现在我们需要一些逻辑:
private static String getBuildParameter(String paramName)
throws IOException {
Resource resource = new ClassPathResource(
"/META-INF/spring/parameters.properties");
Properties props = PropertiesLoaderUtils.loadProperties(resource);
return props.getProperty(paramName);
}
public static String getParameter(final String paramName,
final String defaultValue, final String logMessage) {
String value = System.getProperty(paramName);
if (value!=null) {
Logger.getLogger(ParameterManager.class.getName()).log(
Level.WARNING,
"Parameter: " + paramName + ": " + value
+ " found in JVM parameters.");
return value;
}
try {
value = getBuildParameter(paramName.toLowerCase());
} catch (IOException e) {
// catch, log exception...
}
if (value!=null) {
Logger.getLogger(ParameterManager.class.getName()).log(
Level.WARNING,
"Parameter: " + paramName + ": " + value
+ " found in parameters set on build time.");
return value;
}
Logger.getLogger(ParameterManager.class.getName()).log(
Level.WARNING,
"Parameter: " + paramName + ": " + defaultValue
+ " as default parameter. " + logMessage);
return defaultValue;
}
这些方法是静态的,因为我用它来初始化这样的常量:
public static final String TEST_STRING;
static {
TEST_STRING = getParameter("TEST", "default value",
"The default is set, please ensure, that this is intended!");
}
然后可以从项目内的任何位置读取这些常量。你如何称呼这种逻辑,或者如果你能以不同的方式实现它,取决于你。我确信有更好的方法,我很高兴听到你的实施,但这对我有用。
注1: 如果使用Eclipse,则可以在Run-&gt; Run configurations-&gt;下定义maven参数。目标。 BUT 如果您使用glassfish工具(m2e插件)将项目部署到glassfish,它将不会使用运行配置。然后,您必须创建文件.m2 / settings.xml,如下所示:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd>
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles>
<profile>
<id>m2e</id>
<activation>
<property>
<name>m2e.version</name>
</property>
</activation>
<properties>
<test>xmlparameter</test>
</properties>
</profile>
</profiles>
<activeProfiles/>
</settings>