java - Maven:自定義web-app項目的web.xml




web-applications maven-2 (5)

有沒有辦法有兩個web.xml文件,並根據配置文件選擇適當的?

是的,在每個配置文件中,您可以添加maven-war-plugin配置,並將每個配置配置為指向不同的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>
        ...

我有一個Web應用程序Maven項目,我想根據正在運行的配置文件自定義web.xml文件。 我正在使用Maven-War-plugin,它允許我定義一個“資源”目錄,可以過濾文件。 但是,單獨過濾對我來說還不夠。

更詳細地說,我希望包括(或排除)整個安全部分,具體取決於我正在運行的配置文件。 這是部分:

....
....

<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文件並根據配置文件選擇合適的文件?


“matt b”已經發布了答案,這是最常用的方式。 這是我建議99%的時間這樣做的方式。

但是,有時候,您的配置文件可能非常複雜,當只有一個XML節不同時復制每個環境的整個文件沒有多大意義。 在這些情況下,您可以濫用屬性過濾來實現目標。

警告,接下來是一個非常管道的磁帶解決方案,並不適合膽小的人:

在你的pom.xml中:

注意編輯!!!!

html實體轉義是解決方案的一部分。 如果用大於號和小於號的符號替換所有解決方案,該解決方案將無效。 請保留答案......

<properties>
    <test.security.config>
        &lt;security-constraint&gt;
            &lt;web-resource-collection&gt;
                &lt;web-resource-name&gt;protected&lt;/web-resource-name&gt;
                &lt;url-pattern&gt;/pages/*.xhtml&lt;/url-pattern&gt;
                &lt;url-pattern&gt;/pages/*.jsp&lt;/url-pattern&gt;
            &lt;/web-resource-collection&gt;

            &lt;auth-constraint&gt;
                &lt;role-name&gt;*&lt;/role-name&gt;
            &lt;/auth-constraint&gt;

            &lt;/security-constraint&gt;
                &lt;login-config&gt;
                &lt;auth-method&gt;${web.modules.auth.type}&lt;/auth-method&gt;
                &lt;realm-name&gt;MyRealm&lt;/realm-name&gt;
            &lt;/login-config&gt;

        &lt;security-constraint&gt;
    </test.security.config>
</properties>

在你的web.xml中

....
${test.security.config}
....

由於不存在的屬性計算為空字符串,因此未設置此屬性的配置(或屬性為空xml標記)將在此處計算為空行。

這很醜陋,而且這種形式很難修改xml。 但是,如果您的web.xml很複雜,並且您更有可能將4-5個web.xml副本變得不同步,那麼這可能是一種適合您的方法。


對https://.com/a/3298876/2379360的改進

您可以在不同的配置文件中使用默認屬性maven.war.webxml,而不是指定自定義屬性。

<profiles>
    <profile>
        <id>profile1</id>
        <properties>
            <maven.war.webxml>path/to/custom/webXml</webXmlPath>
        </properties>
    </profile>
</profiles>

我在項目中實現了第三個妥協選項。 它將所有內容保存在一個web.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.xml中獲得兩個額外的CRLF。 當您選擇不包含安全性的配置文件時,XML仍然在web.xml中,但它已被註釋掉,因此會被忽略。 我喜歡這個,因為您不必擔心保持多個文件同步,但XML仍然可讀(並且它位於web.xml文件中,人們自然會在其中查找)。


is there a way to have two web.xml files and select the appropriate one depending on the profile?

除了matt b建議的方法之外,反過來考慮它是有用的,主要是因為在許多情況下,您將必須捆綁maven插件未涵蓋的應用程序服務器特定配置(afaik)。 這些可能在配置文件之間存在差異。

具體來說,您可以使用包含不同配置文件的Web項目之間的所有公共文件的父項目。 然後子項目可以有不同的web.xml文件,其餘的id用profile和maven-war-plugin 。 例如,我使用此佈局來實現針對不同目標環境(開發,uat等)的無人參與構建(除了指定配置文件之外)

WebPc
├── common
   ├── css
   ├── images
   ├── js
   └── WEB-INF
   └──├── wsdl
│── pom.xml

├── WebPc-DEV
   ├── pom.xml
   └── src
       └── main
           └── webapp
               └── WEB-INF
                   ├── geronimo-web.xml
                   ├── ibm-web-bnd.xml
                   ├── ibm-web-ext.xml
                   └── web.xml
├── WebPc-UAT
   ├── pom.xml
   └── src
       └── main
           └── webapp
               └── WEB-INF
                   ├── geronimo-web.xml
                   ├── ibm-web-bnd.xml
                   ├── ibm-web-ext.xml
                   └── web.xml

WebPc的pom有以下pom

<groupId>my.grp</groupId>
<artifactId>WebPc</artifactId>
<packaging>pom</packaging>

<profiles>
    <profile>
        <id>DEV</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <modules>
            <module>WebPc-DEV</module>
        </modules>
    </profile>
    <profile>
        <id>UAT</id>
        <modules>
            <module>WebPc-UAT</module>
        </modules>
    </profile>
</profiles>

<build>
    <pluginManagement>
        <plugins>

            <!-- copy common resources located on parent
                 project common folder for packaging -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <resourceEncoding>${project.build.sourceEncoding}</resourceEncoding>
                    <webResources>
                        <resource>
                            <directory>../common</directory>
                            <excludes>
                                <exclude>WEB-INF/**</exclude>
                            </excludes>
                        </resource>
                        <resource>
                            <directory>../common/WEB-INF</directory>
                            <includes>
                                <include>wsdl/*.wsdl</include>
                                <include>wsdl/*.xsd</include>
                            </includes>
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

        </plugins>
    </pluginManagement>
</build>

這是WebPc-DEV的pom

<parent>
    <groupId>my.grp</groupId>
    <artifactId>WebPc</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</parent>

<artifactId>WebPc-DEV</artifactId>
<packaging>war</packaging>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
        </plugin>
    </plugins>
</build>




web.xml