it-swarm.com.de

Die Filterung von Webressourcen mit Maven war Plugin funktioniert in Eclipse mit m2e nicht

Ich versuche, eine Spring-Konfigurationsdatei mithilfe der Maven-Filterung zu filtern. Mein POM ist wie folgt konfiguriert:

        ...
        <plugin>
          <groupId>org.Apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <webResources>
              <resource>
                <filtering>true</filtering>
                <targetPath>WEB-INF/context</targetPath>
                <directory>src/main/webapp/WEB-INF/context</directory>
                <includes>
                  <include>applicationContext.xml</include>
                </includes>
              </resource>
            </webResources>
          </configuration>
        </plugin>
        ...

und

  <profiles>
    <profile>
        <id>desarrollo</id>
         <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
              <filter>src/main/properties/dev.properties</filter>
            </filters>
      </build>
    </profile>
    <profile>
        <id>pruebas</id>
        <build>
            <filters>
              <filter>src/main/properties/test.properties</filter>
            </filters>
      </build>
    </profile>
            ...

Es funktioniert gut, wenn Sie Maven direkt aufrufen. 

Wenn die Webapp in Tomcat 6 mit Eclipse WTP und m2e im Hot-Deployment bereitgestellt wird, wird die ungefilterte Version von applicationContext.xml immer ausgewählt. (Die Datei applicationContext.xml im Ordner target/m2e-wtp/web-resources/WEB-INF/context wird niemals gefiltert.)

Ich kann keine nützliche Dokumentation zu diesem Thema finden. Ich bin mir nicht mal sicher, ob es in m2e implementiert wird.

Stimmt etwas nicht mit meiner Konfiguration oder ist dies eine nicht implementierte Funktion?

22
Juan Calero

Nun, endlich habe ich es verstanden.

Zuerst habe ich getan, was Khmarbaise gezeigt hat. Ich habe applicationContext.xml in den Ressourcenordner verschoben. War Plugins webResources sind für die Arbeit mit externen Ressourcen gedacht, und das Filtern einer Datei im Zielordner selbst war nicht die beste Vorgehensweise. Ich habe das POM aktualisiert, um die neue Konfiguration zu berücksichtigen

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

und 

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF/context</targetPath>
                        <directory>src/main/resources/WEB-INF/context</directory>
                        <includes>
                            <include>applicationContext.xml</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

Also die Hälfte des Kredits für ihn ... Aber das war nicht genug, es funktionierte trotzdem nicht. Ich erkannte, dass Maven/m2e meine Datei zwar filterte, aber meine definierten Eigenschaftendateien nicht erhielt. Nach einigen Tests habe ich herausgefunden, dass m2e die Option activeByDefaultim Aktivierungsabschnitt für Profile ignoriert.

Also habe ich mein Standardprofil zur Projekt-Maven-Konfiguration hinzugefügt und dann hat es funktioniert

enter image description here

26
Juan Calero

Ich hatte ein ähnliches Problem beim Filtern der web.xml. Ich habe das Problem gelöst, indem ich das gesamte Projekt in Eclipse neu importiert habe.

Der Grund war eine beschädigte /.settings/org.Eclipse.wst.common.component -Datei. In dieser Datei wird die Reihenfolge der Dateien festgelegt, die in das lokale Installationsverzeichnis der Webserver kopiert werden. Zum Beispiel:

<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
  <wb-module deploy-name="liquidvote-rest">
    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
    <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/Java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
    <property name="context-root" value="myapp"/>
    <property name="Java-output-path" value="/myapp/target/classes"/>
  </wb-module>
</project-modules>

Wenn die Datei web.xml oder application.xml in mehreren Verzeichnissen vorhanden ist, wird sie aus dem ersten gefundenen Verzeichnis übernommen. Deshalb ist es wichtig, dass

    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>

ist der erste Eintrag.

Weitere Informationen finden Sie unter http://wiki.Eclipse.org/M2E-WTP_FAQ im Abschnitt "Was ist dieser Webressourcenordner?"

7
insideout

Haben Sie versucht, die Ressourcen unter src/main/resources/WEB-INF/... abzulegen, und konfigurieren Sie den Ressourcenbereich so, dass er die Ressourcen filtert anstatt die Konfiguration in einen nicht standardmäßigen Maven-Speicherort zu verschieben.

1
khmarbaise

Heute hatte ich ein ähnliches Problem, als mehrere Krüge in den Krieg aufgenommen wurden. Ich habe die Filterung eingeschaltet und die Originalgläser mit Filter verglichen. Sie scheinen gleich zu sein, aber das stimmt nicht. Ich habe versucht, jar in Zip umzubenennen, und ich konnte den Inhalt aufgrund der beschädigten Struktur in jar (Zip) nicht entpacken, während der ursprüngliche Inhalt in Ordnung war. Es wird hier auch erwähnt Hinzufügen von Webressourcen zum Filtern wo gesagt wird, dass die Filterung auf false gesetzt werden muss, um eine Beschädigung Ihrer Binärdateien zu vermeiden.

0
Michal

Ich hatte gerade ein ähnliches Problem. Meine Lösung ist nicht elegant und ich bin nicht stolz darauf, aber sagen wir, es ist akzeptabel. In meinem Fall habe ich eine Spring Boot-MVC-Anwendung mit Swagger-Anwendung (für Tester zum Testen unserer API). Die Sache ist, dass wir diese App in zwei Umgebungen verwenden, also habe ich zwei Profile erstellt - dev und test. In dev env möchten wir die Anwendung von Eclipse mit "run as" auslösen, sodass der Kontextpfad leer ist (ich weiß, dass im Frühjahr Java-Konfig festgelegt werden kann, aber es ist nicht der einzige Platzhalter, den wir wechseln möchten) und in test env Die Anwendung wird in unserer angepassten Version von Tomcat ausgeführt. Der Kontextpfad entspricht also dem Namen der Kriegsdatei.

und hier ist das Problem - Swagger ruft Rest Docs in diesem Kontextpfad auf und hängt vom Federprofil ab. Wir haben also eine Webressource, die gefiltert werden muss. Zuerst versuchte ich die m2e-wtp-Filterung zu verwenden:

...
<build>
<plugins>
<plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/scripts.js</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
...

es funktionierte, aber nur in Eclipse Tomcat eingebettet oder von der Kommandozeile aus Java -jar ausgeführt wurde, funktionierte es nicht mit "Ausführen als" von Eclipse.

Die Ressource wurde gefiltert und ich habe sie in web-resource in target gesehen, aber Eclipse scheint direkt auf einem Quellcode zu laufen oder macht eine Kopie, die ich nicht kenne ... es kann keine gefilterten Ressourcen sehen ... also dachte ich mir Ich werde so etwas machen:

<resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources/webapp/swagger</directory>
                <targetPath>${basedir}/src/main/webapp/swagger</targetPath>
                <includes>
                    <include>scripts.js</include>
                </includes>
            </resource>
        </resources>

Es ist nicht die beste Lösung, weil es den Code modifiziert und nicht das Ziel, aber es funktioniert zumindest. Wenn jemand Anregungen hätte, wie er ohne Code-Modifikationen funktionieren könnte, wäre ich großartig.

0
Piotr Tempes

Ich habe alles oben beschriebene ohne Erfolg versucht. Die Dateien wurden im Ordner "m2e-wtp" korrekt gefiltert und generiert, aber aus irgendeinem Grund kopierte Eclipse Dateien aus "target/classes". 

Daher habe ich meine pom.xml geändert und den Zielordner von "m2e-wtp" in "target/classes" geändert, wie Code voraus. 

Wichtig: Jedes Mal, wenn Sie einen Maven Build für ein Projekt ausführen müssen, müssen Sie das Pom ändern, um das Projekt zu erstellen.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>  
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <filters>
            <filter>${project.basedir}/src/main/filters/${build.profile.id}/config.properties</filter>
        </filters>
        <webResources>
            <resource>
                <filtering>true</filtering>
                <directory>${project.basedir}/src/main/resources</directory>
                <targetPath>${project.basedir}/target/classes</targetPath>
                <includes>
                    <include>*.properties</include>
                    <include>*.xml</include>
                    <include>META-INF/spring/*.xml</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>