it-swarm.com.de

Maven: Passen Sie die Datei web.xml des Web-App-Projekts an

Ich habe ein Maven-Projekt für eine Webanwendung und möchte die Datei web.xml abhängig vom ausgeführten Profil anpassen. Ich benutze das Maven-War-Plugin, mit dem ich ein "Ressourcen" -Verzeichnis definieren kann, in dem die Dateien gefiltert werden können. Das Filtern allein reicht mir jedoch nicht aus.

Im Einzelnen möchte ich einschließen (oder ausschließen) den gesamten Abschnitt über Sicherheit, abhängig von dem Profil, das ich laufe. Dies ist der Teil:

....
....

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

....
....

Wenn dies nicht einfach ist, gibt es eine Möglichkeit, zwei web.xml-Dateien zu haben und je nach Profil die entsprechende auszuwählen?

52

gibt es eine Möglichkeit, zwei web.xml-Dateien zu haben und je nach Profil die entsprechende auszuwählen?

Ja, in jedem Profil können Sie eine Konfiguration für maven-war-plugin hinzufügen und jeweils so konfigurieren, dass sie auf einen anderen web.xml Verweisen.

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

Alternativ zur Angabe der maven-war-plugin - Konfiguration in jedem Profil können Sie im Hauptabschnitt des POM eine Standardkonfiguration angeben und diese dann für bestimmte Profile überschreiben.

Oder, um noch einfacher zu sein, verwenden Sie im Hauptfenster <build><plugins> Ihres POM eine Eigenschaft, um auf das webXml -Attribut zu verweisen, und ändern Sie dann einfach den Wert in verschiedenen Profilen

<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

Es gibt eine dritte Kompromissoption, die ich in meinem Projekt implementiert habe. Es behält alles in einer web.xml bei, während es und die pom.xml lesbar bleiben. In meinem Fall musste ich abhängig von der Umgebung manchmal über Sicherheit und manchmal über keine Sicherheit verfügen.

Also, was ich getan habe, war:

Definieren Sie in der Datei pom.xml zwei Profile (oder wie viele Sie benötigen). Fügen Sie in die Profile zwei Eigenschaften ein. Wenn Sie Sicherheit wünschen, lassen Sie sie leer, wie folgt:

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

Wenn Sie die gesamte Sicherheit ausschließen möchten, definieren Sie sie wie folgt:

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

Dann haben Sie eine einzige web.xml-Datei mit den folgenden Inhalten:

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

Das Maven-War-Plugin pom.xml muss für die Filterung konfiguriert sein. Meins sieht so aus:

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

Wenn Sie also das Profil auswählen, um die Sicherheit einzuschließen, erhalten Sie zwei zusätzliche CRLFs in Ihrer web.xml. Wenn Sie das Profil so auswählen, dass es KEINE Sicherheit enthält, befindet sich das XML immer noch in der Datei web.xml, ist jedoch auskommentiert, sodass es ignoriert wird. Das gefällt mir, weil Sie sich nicht darum kümmern müssen, mehrere Dateien synchron zu halten, und trotzdem die XML-Datei lesbar ist (und sie in der Datei web.xml enthalten ist, nach der die Leute natürlich suchen würden).

45
Chris Clark

Kommentar zu Chris Clark Antwort. Sie können rückgängig machen - damit Sie in der Entwicklung keine Einschränkungen haben möchten (Sicherheit oder jndi, andere)

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


${enable.security.start} -->

Also haben Sie in der Entwicklung den Abschnitt auskommentiert. Aber in der Produktion wird es übersetzt (mit Maven-Profil):

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


<!-- -->

und kommentierter Abschnitt werden sichtbar.

21
Andrzej Jozwik

"matt b" hat bereits die Antwort gepostet, die die beste Art ist, dies zu tun. Es ist die Art und Weise, wie ich es 99% der Zeit empfehlen würde.

Gelegentlich kann Ihre Konfigurationsdatei jedoch sehr kompliziert sein, und es ist nicht sinnvoll, die gesamte Datei für jede Umgebung zu duplizieren, wenn sich nur eine XML-Zeilengruppe unterscheidet. In diesen Fällen können Sie das Filtern von Eigenschaften missbrauchen, um Ihr Ziel zu erreichen.

Achtung, es folgt eine sehr klebebandartige Lösung, die nichts für schwache Nerven ist:

In Ihrer pom.xml:

Achtung StackOverflow Editoren !!!!

Das Html-Entity-Escape ist Teil der Lösung. Die Lösung funktioniert NICHT, wenn Sie alles durch mehr als und weniger als Zeichen ersetzen. Bitte lassen Sie die Antwort so wie sie ist ...

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

in Ihrer web.xml

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

Da nicht vorhandene Eigenschaften als leere Zeichenfolge ausgewertet werden, werden Ihre Konfigurationen, für die diese Eigenschaft nicht festgelegt ist (oder für die die Eigenschaft ein leeres XML-Tag ist), hier als leere Zeile ausgewertet.

Es ist hässlich und die XML ist in dieser Form schwer zu ändern. Wenn Ihre web.xml-Datei jedoch komplex ist und Sie ein höheres Risiko haben, dass 4-5 Kopien der web.xml-Datei nicht mehr synchron sind, ist dies möglicherweise ein für Sie geeigneter Ansatz.

19
Brian M. Carr

In Version 2.1-alpha-2 wurde dem Maven-War-Plugin eine neue Konfiguration hinzugefügt. Sein Name ist filteringDeploymentDescriptors und es macht genau das, was Sie wollen.

Das funktioniert:

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

Und das funktioniert auch:

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

Weitere Informationen finden Sie in der offiziellen Dokumentation von filteringDeploymentDescriptors .

10

Eine Verbesserung zu https://stackoverflow.com/a/3298876/237936

Verwenden Sie in Ihren verschiedenen Profilen die Standardeigenschaft maven.war.webxml, anstatt eine benutzerdefinierte Eigenschaft anzugeben.

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

Weitere Informationen finden Sie unter folgendem Link: 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?

Anders als der von matt b vorgeschlagene Ansatz ist es nützlich, anders herum zu denken, hauptsächlich, weil Sie in vielen Fällen anwendungsserverspezifische Konfigurationen bündeln müssen, die nicht von den Maven-Plugins (afaik) abgedeckt werden. Diese können durchaus Unterschiede zwischen den Profilen aufweisen.

Insbesondere können Sie ein übergeordnetes Projekt verwenden, das alle gemeinsamen Dateien zwischen Webprojekten mit verschiedenen Profilen enthält. Dann können untergeordnete Projekte unterschiedliche web.xml-Dateien haben und der Rest wird mit Profilen und dem maven-war-plugin. Ich habe dieses Layout beispielsweise verwendet, um unbeaufsichtigte Builds (außer der Angabe eines Profils) für verschiedene Zielumgebungen (Entwicklung, UAT usw.) zu erzielen.

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

Der Pom von WebPc hat den folgenden 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>

Und das ist der Schlüssel für WebPc-DEV

<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