Maven:自定义 web.xml web 应用程序项目

我有一个 Web 应用程序 Maven 项目,我想根据正在运行的配置文件自定义 web.xml文件。我正在使用Maven-War插件,它允许我定义一个“资源”目录,可以在其中过滤文件。但是,仅靠过滤对我来说是不够的。

更详细地说,我想包括(或排除)整个关于安全性的部分,这取决于我运行的配置文件。这是部分:

....
....

<security-constraint>

    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <url-pattern>/pages/*.xhtml</url-pattern>
        <url-pattern>/pages/*.jsp</url-pattern>
    </web-resource-collection>

    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>

    </security-constraint>
        <login-config>
        <auth-method>${web.modules.auth.type}</auth-method>
        <realm-name>MyRealm</realm-name>
    </login-config>

<security-constraint>

....
....

如果这不容易完成,有没有办法拥有两个web.xml文件并根据配置文件选择适当的文件?


答案 1

有没有办法拥有两个web.xml文件,并根据配置文件选择适当的文件?

是的,在每个配置文件中,您可以添加maven-war-插件的配置,并将每个配置文件配置为指向不同的.web.xml

<profiles>
    <profile>
        <id>profile1</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <configuration>
                        <webXml>/path/to/webXml1</webXml>
                    </configuration>
                </plugin>
                 ...

作为必须在每个配置文件中指定 maven-war-plugin 配置的替代方法,您可以在 POM 的主要部分中提供默认配置,然后只需为特定配置文件覆盖它。

或者更简单,在POM的主要部分中,使用属性来引用属性,然后只需更改其在不同配置文件中的值<build><plugins>webXml

<properties>
    <webXmlPath>path/to/default/webXml</webXmlPath>
</properties>
<profiles>
    <profile>
        <id>profile1</id>
        <properties>
            <webXmlPath>path/to/custom/webXml</webXmlPath>
        </properties>
    </profile>
</profiles>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>${webXmlPath}</webXml>
            </configuration>
        </plugin>
        ...

答案 2

还有第三个折衷选项,我在我的项目中实现了它。它将所有内容保存在一个网络中.xml同时仍然使它和pom.xml可读。就我而言,我需要有时有安全感,有时没有安全感,这取决于环境。

所以我做的是:

在 pom.xml中,定义两个配置文件(或您需要的任意多个配置文件)。在配置文件中,包括两个属性。当你想要安全性时,你可以把它们留空,就像这样:

<enable.security.start></enable.security.start>
<enable.security.end></enable.security.end>

如果要排除所有安全性,请按如下方式定义它们:

<enable.security.start>&lt;!--</enable.security.start>
<enable.security.end>--&gt;</enable.security.end>

然后,您有一个包含以下内容的 web.xml文件:

${enable.security.start}
<security-constraint>
  ...
  // all of the XML that you need, in a completely readable format
  ...
</login-config>  
${enable.security.end}

pom.xml maven-war-plugin 必须配置为使用过滤。我的看起来像这样:

   <configuration>
      <webResources>
        <resource>
          <filtering>true</filtering>
          <directory>src/main/webapp</directory>
          <includes>
            <include>**/web.xml</include>
          </includes>
        </resource>
      </webResources>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
      <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
      ...

因此,基本上,当您选择要包含安全性的配置文件时,您将在Web中获得两个额外的CRLF.xml。当您选择配置文件以不包括安全性时,XML 仍然在 Web 中.xml,但它被注释掉了,因此被忽略。我喜欢这个,因为你不必担心保持多个文件同步,但XML仍然是可读的(它在Web.xml文件中,人们自然会寻找它)。


推荐