使用Jenkins,Maven和JVM参数参数化webapp

时间:2016-07-15 12:28:26

标签: java spring maven jenkins build

两个目标:

  1. 我想使用参数化的jenkins构建来构建war文件,并在war文件的构建过程中设置一些属性。

  2. 我还希望能够在部署war文件的服务器上优化这些属性。

  3. 第一个是设置适合目标环境的属性,第二个是能够快速更改它们,而无需再次重建整个应用程序。

    在这种情况下,选择maven配置文件不够灵活。

    一个示例是端口号,对于每个构建都是不同的,但是可以由部署文件的系统的系统管理员自发地更改。

    我的想法是使用maven-resource-filtering插件将构建参数添加到属性文件中。然后在glassfish / tomcat上启动webapp以查看设置的JVM变量。

    我在思考正确的方向吗?

1 个答案:

答案 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>