web-dev-qa-db-ja.com

Maven:web-appプロジェクトのweb.xmlをカスタマイズする

WebアプリケーションMavenプロジェクトがあり、実行中のプロファイルに応じてweb.xmlファイルをカスタマイズしたい。 Maven-War-pluginを使用しています。これにより、ファイルをフィルタリングできる「リソース」ディレクトリを定義できます。ただし、フィルタリングだけでは不十分です。

より詳しくは、実行中のプロファイルに応じて、セキュリティに関するセクション全体をinclude(またはexclude)にします。これは一部です:

....
....

<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>

....
....

これが簡単に行われない場合、2つのweb.xmlファイルを作成し、プロファイルに応じて適切なファイルを選択する方法はありますか?

52

2つの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>
        ...
73
matt b

プロジェクトに実装した3番目の妥協オプションがあります。すべてを1つのweb.xmlに保持しながら、それとpom.xmlの両方を読み取り可能にします。私の場合、環境によっては、セキュリティが必要な場合とセキュリティがない場合がありました。

だから私がやったことは:

Pom.xmlで、2つのプロファイル(または必要なプロファイル)を定義します。プロファイル内に、2つのプロパティを含めます。セキュリティが必要な場合は、次のように空のままにします。

<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に2つの追加のCRLFが追加されます。セキュリティを含めないプロファイルを選択すると、XMLはすべてweb.xmlに残りますが、コメント化されているため無視されます。複数のファイルの同期を維持する必要はありませんが、XMLはまだ読み取り可能です(そして、それはweb.xmlファイル内にあり、人々が自然に検索するので)。

45
Chris Clark

Chris Clark answerにコメントしてください。あなたは逆にすることができます-したがって、開発では制約(セキュリティまたはjndi、その他)を持ちたくない

<!-- ${enable.security.end}
<security-constraint>
    ...
</security-constraint>


${enable.security.start} -->

そのため、開発中にセクションをコメントアウトしました。しかし、本番環境では(mavenプロファイルを使用して)翻訳されます:

<!-- -->
<security-constraint>
    ...
</security-constraint>


<!-- -->

コメントされたセクションが表示されます。

21
Andrzej Jozwik

「matt b」は、それを行う最も大胆な方法である答えをすでに投稿しています。私はそれを99%の時間で行うことをお勧めします。

ただし、場合によっては、構成ファイルが非常に複雑になる場合があり、XMLスタンザが1つだけ異なる場合は、環境ごとにファイル全体を複製することはあまり意味がありません。これらの場合、目標を達成するためにプロパティフィルタリングを悪用できます。

警告、非常にダクトテープyのソリューションが続き、心の弱い人のためではありません:

Pom.xmlで:

StackOverflowエディターへの注意!!!!

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が複雑で、web.xmlの4〜5個のコピーが同期しなくなるリスクが高い場合は、これが適切なアプローチになる可能性があります。

19
Brian M. Carr

バージョン2.1-alpha-2のmaven-war-pluginに新しい構成が追加されました。その名前はfilteringDeploymentDescriptorsで、あなたが望むものを正確に実行します。

これは動作します:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
</plugin>

そして、これも機能します:

<properties>
    <maven.war.filteringDeploymentDescriptors>true</maven.war.filteringDeploymentDescriptors>
</properties>

詳細は、 filteringDeploymentDescriptorsの公式ドキュメント で入手できます。

10

https://stackoverflow.com/a/3298876/237936 の改善

カスタムプロパティを指定する代わりに、さまざまなプロファイルでデフォルトプロパティmaven.war.webxmlを使用します。

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

詳細については、次のリンクを参照してください。 https://maven.Apache.org/plugins-archives/maven-war-plugin-2.4/war-mojo.html#webXml

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

多くの場合、Mavenプラグイン(afaik)でカバーされていないアプリケーションサーバー固有の構成をバンドルする必要があるため、matt bによって提案されたアプローチ以外に、それを逆に考えることが有用です。これらは、プロファイル間で非常によく異なる場合があります。

具体的には、異なるプロファイルのWebプロジェクト間ですべての共通ファイルを持つ親プロジェクトを使用できます。子プロジェクトには、異なるweb.xmlファイルと、プロファイルと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>
0
dkateros