gpt4 book ai didi

eclipse - maven构建时如何覆盖WAR文件中的文件?

转载 作者:行者123 更新时间:2023-12-02 07:17:34 25 4
gpt4 key购买 nike

我有一个 Java webapp 项目,是在 Eclipse(更准确地说是 MyEclipse 10)中开发并使用 Maven 3 构建的。

我有以下布局(仅包括与我的问题相关的文件:

project root
|-- src
| |-- main
| | |-- java
| | |-- resources
| | | |-- log4j.xml
| | | +-- struts.properties
| | |-- webapp
| | | |-- META-INF
| | | | +--context.xml
| | |-- config
| | | |-- test
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| | | +-- prod
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| +--test
+--pom.xml

如您所见,我包含了许多配置文件。位于项目结构中正确位置的那个,即在 src/main/resourcessrc/main/webapp 内,是我工作时经常使用的那些在 MyEclipse 中。我可以使用 MyEclipse 连接器自动更新部署,例如我的开发机器上的 Tomcat 实例。我只需单击“运行服务器”即可进行调试。实际上在这种情况下根本不需要使用 Maven。

然后,当我想为另一个环境(例如测试或生产)构建版本时,我运行 mvn -P test clean install 并且它会构建一个不错的 WAR。

我的目标是用 src/config/{environment}/ 中的配置文件替换最终 WAR 中的配置文件。

我已经在我的 pom.xml 中设置了配置文件:

<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>

<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>

然后,我尝试将这些资源从指定的配置文件(使用环境变量)复制到 WAR 内的正确位置(或将压缩到 WAR 的临时文件夹):

<webResources>
<resource>
<directory>/src/main/config/${environment}</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/${environment}</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
</webResources>

现在这似乎有效,除了“标准”资源被复制到此后的目录中,因此它们会覆盖这些文件。所以我总是以例如来自 src/main/resourceslog4j.xml 而不是来自 src/main/configuration/prod/

从 Maven 输出中提取:

[INFO] Processing war project
[INFO] Copying webapp webResources [D:\workspace\MyProject/src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp webResources [D:\workspace\MyProject\src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp resources [D:\workspace\MyProject\src\main\webapp]

正如您在最后一行看到的,src/main/webapp 中的内容会在之后复制,从而覆盖我的自定义文件:(

我的问题:如何强制 Maven 使用“来自激活的配置文件”的文件并以某种方式覆盖“自然”文件?

最佳答案

正如第二个中所指出的Q/A given by user944849 ,最简单的解决方案是过滤掉原始文件,以便可以用配置文件文件夹中的文件替换它们。

所以我为标准资源添加了过滤:

    <resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<!-- Exclude those since they are copied from the profile folder for the build -->
<exclude>log4j.xml</exclude>
<exclude>struts.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>

以及网络资源:

<warSourceExcludes>**/context.xml</warSourceExcludes>

所以现在这3个文件没有复制到WAR文件夹中。在下一步(webResources)中,它们将从事件配置文件的文件夹中复制。

我还添加了一个默认文件夹,其中包含具有共同值的 3 个文件。此默认文件夹中的文件也会被复制,但仅在配置文件的文件夹文件之后复制。由于资源不会被覆盖,因此只有在资源不存在时才会复制它们。如果您在没有激活配置文件的情况下进行构建,或者如果您可以定义合理的默认值,那么每个配置文件都不需要复制文件(如果文件相同),这非常有用。

config文件夹的结构:

-- config
|-- test
| |--log4j.xml
| | |--struts.properties
| | +--context.xml
| +-- prod
| | |--log4j.xml
| | +--context.xml
| +-- default
| |--log4j.xml
| |--struts.properties
| +--context.xml
...

以及我的 pom.xml 的 webResources 部分:

<webResources>
<!-- Resources from the activated profile folder -->
<resource>
<directory>/src/main/config/${environment}</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/${environment}</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
<!-- Default resources in case some file was not defined in the profile folder -->
<!-- Files are not overwritten so default files will be copied only if it does not exist already -->
<resource>
<directory>/src/main/config/default</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/default</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
</webResources>

关于eclipse - maven构建时如何覆盖WAR文件中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12729513/

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