web-dev-qa-db-ja.com

Maven warプラグインを使用したWebリソースフィルタリングは、m2eを使用するEclipseでは機能しません

Mavenフィルタリングを使用してSpring構成ファイルをフィルタリングしようとしています。私のPOMは次のように構成されています。

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

そして

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

Mavenを直接起動するときに非常に役立ちます。

残念ながら、Eclipse WTPとm2eを使用してTomcat 6でWebアプリケーションをホットデプロイすると、フィルターされていないバージョンのapplicationContext.xmlが常に選択されます。 (フォルダーtarget/m2e-wtp/web-resources/WEB-INF/context内のファイルapplicationContext.xmlはフィルターされません)

この件に関する有用なドキュメントは見つかりません。それがm2eに実装されているかどうかさえわかりません。

私の設定に何か問題がありますか、これは実装されていない機能ですか?

23
Juan Calero

さて、ようやく手に入れました。

まず、クマルバイスが指摘したことをしました。引っ越した applicationContext.xmlをリソースフォルダに追加します。 WarプラグインのwebResourcesは外部リソースと連携することを目的としており、宛先フォルダー自体のファイルをフィルターすることはベストプラクティスではありませんでした。新しい構成を反映するようにPOMを更新しました

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

そして

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

それで、彼への信用の半分。しかし、それだけでは不十分であり、それでも機能しませんでした。 Maven/m2eが実際にファイルをフィルター処理していることに気付きましたが、定義されたプロパティファイルを取得できませんでした。いくつかのテストの結果、プロファイルのアクティブ化セクションでm2eがactiveByDefaultオプションを無視しているであることがわかりました。

だから、私はデフォルトのプロファイルをプロジェクトのMaven構成に追加し、それが機能しました

enter image description here

27
Juan Calero

Web.xmlのフィルタリングで同様の問題がありました。プロジェクト全体をEclipseに再インポートすることで問題を解決しました。

理由は/.settings/org.Eclipse.wst.common.componentファイルの破損でした。このファイルでは、ローカルWebサーバーのデプロイディレクトリにコピーされるファイルの順序が定義されています。例えば:

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

Web.xmlまたはapplication.xmlが複数のディレクトリに存在する場合、最初に見つかったディレクトリから取得されます。したがって、その重要なこと

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

最初のエントリです。

詳細は http://wiki.Eclipse.org/M2E-WTP_FAQ の「このWebリソースフォルダーとは」セクションにあります。

9
insideout

設定をデフォルト以外のmavenの場所に配置する代わりに、src/main/resources/WEB-INF/...の下にリソースを配置して、リソース領域を filter the resources に設定しようとしましたか?.

1
khmarbaise

今日、いくつかの瓶が戦争に含まれていたとき、私は同様の問題を抱えていました。フィルタリングをオンに設定し、元のjarとフィルターを比較しました。それらは同じように見えますが、これは真実ではありません。 jarの名前をZipに変更しようとしましたが、jar(Zip)内の構造が破損しているため、コンテンツを解凍できませんでしたが、元の構造は問題ありませんでした。ここでも言及されています フィルターWebリソースの追加 バイナリファイルの破損を防ぐためにフィルターをfalseに設定する必要があると言われています。

0
Michal

同様の問題が発生しました。私のソリューションはエレガントではなく、誇りに思っていませんが、許容できるとしましょう。私の場合、(テスト担当者がAPIをテストするための)Swaggerアプリケーションを備えたSpring Boot MVCアプリケーションがあります。問題は、このアプリを2つの環境で使用しているため、開発とテストの2つのプロファイルを作成したことです。開発環境では、「ru​​n as」だけでEclipseからアプリケーションを起動したいので、コンテキストパスは空白です(これは、Spring Java構成で設定できることを知っていますが、これが唯一のプレースホルダーではありませんスイッチ)およびテスト環境では、アプリケーションはカスタマイズされたバージョンのTomcatで実行されます。そのため、コンテキストパスはwarファイル名と同じです。

ここに問題があります-swaggerはこのコンテキストパスでレストドキュメントを呼び出しており、それは春のプロファイルに依存しますしたがって、フィルタリングが必要なWebリソースがあります。最初に、m2e-wtpフィルタリングを使用しようとしました:

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

それは機能していましたが、Eclipse Tomcatに埋め込まれたコマンドラインまたはJavaからのみ実行されました-jarは、Eclipseの「別のユーザーとして実行」では機能しませんでした。

リソースがフィルターされ、ターゲットのweb-resourceでそれらが表示されましたが、Eclipseがソースコードで直接実行されているか、コピーを作成しているようです...フィルターされたリソースが表示されません...私はこのようなものを作ります:

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

これはコードを修正するものであり、ターゲットではないため、最も幸運な解決策ではありませんが、少なくとも機能しています。コードを変更せずに動作させる方法を提案する人がいるなら、私は素晴らしいと思います。

0
Piotr Tempes

上記のすべてを試しましたが、成功しませんでした。ファイルは「m2e-wtp」フォルダで正しくフィルタリングおよび生成されましたが、何らかの理由でEclipseが「target/classes」からファイルをコピーしていました。

したがって、先ほどのコードのように、宛先フォルダーを「m2e-wtp」から「target/classes」に変更して、pom.xmlを変更しました。

重要:プロジェクトでMavenビルドを実行する必要があるたびに、プロジェクトをビルドするためにpomを変更する必要があります。

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