gpt4 book ai didi

java - 是否有可能让 `mvn tomcat6:run` 与过滤后的 web.xml 一起正常工作?

转载 作者:行者123 更新时间:2023-11-28 22:48:49 24 4
gpt4 key购买 nike

我有一个项目需要将 ${} 占位符替换应用于 web.xml,我想使用 mvn tomcat6 运行开发模式:运行。可以这样设置吗?


这是一个遗留代码库,我试图在其中引入这两种部署环境,以摆脱之前的过程,即“复制 web.xml 变体并编辑配置文件,并将其置于源代码控制之外”。我还想避免必须维护 Tomcat 安装和设置 IDE 以部署到它,而只需使用 tomcat6-maven-plugin 执行应用程序。

到目前为止,我所拥有的是这个项目布局:

foo
│ pom.xml

└───src
└───main
├───environments
│ ├───BAR
│ │ filter.properties
│ │
│ └───FOO
│ filter.properties

├───java
│ └───se
│ └───millimoo
│ IndexServlet.java

└───webapp
└───WEB-INF
web.xml

pom.xml

...
<build>
<filters>
<filter>src/main/environments/${environment}/filter.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/environments/${environment}</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>env-foo</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>FOO</environment>
</properties>
</profile>
<profile>
<id>env-bar</id>
<properties>
<environment>BAR</environment>
</properties>
</profile>
</profiles>
...

即:我将环境的目录添加为资源;告诉 Maven 从该目录中的 filter.properties 加载占位符值;并告诉 WAR 插件过滤部署描述符。我还设置了两个配置文件以在环境之间切换。

FOO\filter.properties

filter.environment=foofoo

BAR\filter.properties

filter.environment=barbar

web.xml

...
<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>se.millimoo.IndexServlet</servlet-class>
<init-param>
<param-name>environment</param-name>
<param-value>${filter.environment}</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
...

IndexServlet.java

打印 environment 初始化参数的值。


发生的事情是,当我使用 mvn tomcat6:run 运行它时,它使用未过滤的 web.xml,这显然不是我想要的。当我使用 mvn tomcat6:run-war 时使用过滤版本,但我不喜欢它:它更慢,并且在我的实际代码中有其他问题通常会减慢周转速度,这是练习的重点。 (它使用依赖项目的 JAR 文件,其中后端代码来自 Maven 存储库来构建 JAR,如果我在版本号增加后没有安装它们,它可能已经过时或根本不可用;而不是使用当前代码。)

有什么办法可以两全其美吗?能够通过 Maven 或其他易于嵌入的方式运行应用程序服务器,同时还对 web.xml 应用过滤?最好不要显着改变应用程序本身,即我不想在不使用 servlet init 参数的情况下加载配置值。 (在实际代码中,servlet 是第三方的。)

最佳答案

我认为你需要在你的 pom.xml 中添加这个,这样 Maven 就知道他也需要过滤这个目录:

<build>
<resources>
<resource>
<directory>src/main/webapp/WEB-INF</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>

编辑

正如评论中所讨论的,这种方法可能不是一个好的解决方案。

另一种解决方案:

Overriding the default destination directory

By default web resources are copied to the root of the WAR, as shown in the previous example. To override the default destination directory, specify the target path.

        ...
<configuration>
<webResources>
<resource>
...
</resource>
<resource>
<directory>configurations</directory>
<!-- override the destination directory for this resource -->
<targetPath>WEB-INF</targetPath>
<!-- enable filtering -->
<filtering>true</filtering>
<excludes>
<exclude>**/properties</exclude>
</excludes>
</resource>
</webResources>
</configuration>
...

在此示例中,我们覆盖了一个目录,但也许可以覆盖单个文件。

关于java - 是否有可能让 `mvn tomcat6:run` 与过滤后的 web.xml 一起正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47310760/

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