【问题标题】:Parametrize webapp using Jenkins, Maven and JVM parameters使用 Jenkins、Maven 和 JVM 参数对 webapp 进行参数化
【发布时间】:2016-11-18 15:58:16
【问题描述】:

两个目标:

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

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

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

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

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

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

我的想法是否正确?

【问题讨论】:

  • Spring 已经提供了开箱即用的功能......那么为什么要自己动手呢?
  • 我建议您在启动时在应用程序中的部署之外读取配置文件并从中进行配置。
  • @M.Deinum 您介意命名该功能还是链接文档?我不知道在哪里可以找到它。
  • 如果您只是使用默认机制,则无需执行任何其他操作。使用<context:property-placeholder /> 添加@Value("${server.port:8080} 并完成。如果未提供 server.port 的值,则 8080 是默认值。这可以是环境变量、系统属性、JNDI 属性、web env init 或上下文参数,也可以来自属性文件。

标签: java spring maven jenkins build


【解决方案1】:

经过一些研究,我的解决方案如下所示, 对于给定的参数“test”:

目标 1.: 执行 maven 构建时使用命令行参数,例如使用:

install -Dtest=OnBuildValue

然后使用 maven 资源插件,它通过构建时的给定参数替换属性文件中的 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:为了能够改变容器中的参数“test”,而不必重建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->Run configurations->Goals 下定义 maven 参数。 但是如果您使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2021-03-31
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2010-10-21
    • 2013-10-31
    • 2012-08-27
    相关资源
    最近更新 更多