25

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 を直接呼び出すとうまく機能します。

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

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

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

4

6 に答える 6

29

さて、ついに私はそれを手に入れました。

まず、khmarbaiseが指摘したことを実行しました。applicationContext.xmlresources フォルダに移動しました。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構成に追加すると、機能しました

ここに画像の説明を入力

于 2012-03-22T08:32:35.043 に答える
9

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

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

<?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 リソース フォルダーとは?」セクションを参照してください。

于 2014-01-27T15:34:22.593 に答える
1

リソースを src/main/resources/WEB-INF/... の代わりに配置しようとして、デフォルト以外の Maven の場所に設定を配置するのではなく、リソースをフィルタリングするようにリソース領域を設定しましたか。

于 2012-03-21T09:38:57.400 に答える
0

私はちょうど同様の問題を抱えていました。私のソリューションはエレガントではなく、誇りに思っていませんが、許容できるとしましょう。私の場合、swagger アプリケーションを使用したスプリング ブート mvc アプリケーションがあります (テスターが API をテストするため)。問題は、このアプリを 2 つの環境で使用しているため、dev と test の 2 つのプロファイルを作成したことです。開発環境では、「ru​​n as」だけでEclipseからアプリケーションを起動したいので、コンテキストパスは空白です(Spring Java構成で設定できることはわかっていますが、切り替えたいプレースホルダーはそれだけではありません)。 test env アプリケーションは、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 の「run as」では機能していませんでした。

リソースはフィルタリングされ、ターゲットの 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>

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

于 2014-07-17T12:01:04.623 に答える
0

上記のすべてを試しましたが、成功しませんでした。ファイルはフィルタリングされ、「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>
于 2015-07-24T17:12:49.150 に答える