gpt4 book ai didi

maven - 如何阻止 Maven 扩展环境。变量w/ Jenkins ?

转载 作者:行者123 更新时间:2023-12-04 19:56:47 25 4
gpt4 key购买 nike

我熟悉 Jenkins,但对 Maven 不熟悉,我想弄清楚如何阻止我们在 Jenkins 中的 Maven 作业在 ApplicationContext.xml 中扩展环境变量。文件。

在我们的内部 ApplicationContext.xml我们引用的文件 ${DeployMode} Tomcat 在加载/运行时扩展的环境变量(我们创建的):

<!-- SPRING CONTEXT static accessor -->
<beans:bean id="contextApplicationContextProvider"
class="com.dartneuroscience.compserv.rest.appcontext.AppContextProvider">
<beans:constructor-arg>
<beans:value>${DeployMode}</beans:value>
</beans:constructor-arg>
</beans:bean>

<beans:bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location"
value="/WEB-INF/App_${DeployMode}.properties" />
</beans:bean>

问题是在 Jenkins 运行的 Maven 构建中,构建的 WEB-INF/ApplicationContext.xml如果在构建机器上设置了环境变量(在本例中假设为“Prod”),则看起来像这样:

<!-- SPRING CONTEXT static accessor -->
<beans:bean id="contextApplicationContextProvider"
class="com.dartneuroscience.compserv.rest.appcontext.AppContextProvider">
<beans:constructor-arg>
<beans:value>Prod</beans:value> <!-- Expanded env. var -->
</beans:constructor-arg>
</beans:bean>

<beans:bean id="placeholderConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location"
value="/WEB-INF/App_Prod.properties" /> <!-- Expanded env. var -->
</beans:bean>

因此该值现在被“硬编码”到 WAR 中,并且将始终像“Prod”一样工作,即使目标 Web 服务器有其 DeployMode。环境变量设置为其他变量,例如“Staging”。

当我在同一个构建服务器上手动运行 Maven 时不会发生这种情况——它只会在 Jenkins 构建作业时发生。

我可以将设置传递给 Jenkins 以阻止此行为吗?

我查看了选项,例如 EnvInject 插件到 UNSET所有环境变量作为作业运行,但我真的对这种行为感到困惑,并想深入了解它。

谢谢。

更新1

我在顶级 POM 中找到了以下资源过滤 block ,并添加了 <excludes/>阻止跳过我们的 AppContext.xml文件:

  <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<webResource>
<directory>${basedir}/src/main/webapp/WEB-INF</directory>
<includes>
<include>*.xml</include>
</includes>
<excludes>
<exclude>*AppContext.xml</exclude>
</excludes>
<targetPath>WEB-INF</targetPath>
<filtering>true</filtering>
</webResource>
</webResources>

但这仍然没有回答为什么环境变量在 Jenkins 运行时被添加到属性列表中,而在从命令行运行时被忽略;尽管我确实在几年前发现了这个 Hudson 问题:Resource filtering fails when run from Hudson

此外,EnvInjectPlugin 做了它宣传的事情,但在至少删除 PATH var 时,构建失败了,因为 maven 找不到 ls命令。

更新2

将 Jenkins 中的工作从“Maven 2/3 项目”更改为“自由式软件项目”并使用 Invoke top-level Maven targets构建步骤无需修改 POM 即可生成所需的结果。

最佳答案

Jenkins 可能以某种方式启用资源过滤。您有很多配置过滤的选择。您可以完全禁用它,将过滤限制为具有特定扩展名的文件,告诉它不要在过滤器中包含构建属性,或者选择不同的分隔符以完全过滤。查看resources:resources docsdescription of resource filtering concepts .

关于maven - 如何阻止 Maven 扩展环境。变量w/ Jenkins ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com