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に実装されているかどうかさえわかりません。
私の設定に何か問題がありますか、これは実装されていない機能ですか?
さて、ようやく手に入れました。
まず、クマルバイスが指摘したことをしました。引っ越した 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構成に追加し、それが機能しました
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リソースフォルダーとは」セクションにあります。
設定をデフォルト以外のmavenの場所に配置する代わりに、src/main/resources/WEB-INF/...の下にリソースを配置して、リソース領域を filter the resources に設定しようとしましたか?.
今日、いくつかの瓶が戦争に含まれていたとき、私は同様の問題を抱えていました。フィルタリングをオンに設定し、元のjarとフィルターを比較しました。それらは同じように見えますが、これは真実ではありません。 jarの名前をZipに変更しようとしましたが、jar(Zip)内の構造が破損しているため、コンテンツを解凍できませんでしたが、元の構造は問題ありませんでした。ここでも言及されています フィルターWebリソースの追加 バイナリファイルの破損を防ぐためにフィルターをfalseに設定する必要があると言われています。
同様の問題が発生しました。私のソリューションはエレガントではなく、誇りに思っていませんが、許容できるとしましょう。私の場合、(テスト担当者がAPIをテストするための)Swaggerアプリケーションを備えたSpring Boot MVCアプリケーションがあります。問題は、このアプリを2つの環境で使用しているため、開発とテストの2つのプロファイルを作成したことです。開発環境では、「run 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>
これはコードを修正するものであり、ターゲットではないため、最も幸運な解決策ではありませんが、少なくとも機能しています。コードを変更せずに動作させる方法を提案する人がいるなら、私は素晴らしいと思います。
上記のすべてを試しましたが、成功しませんでした。ファイルは「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>