12

Eclipse(より正確にはMyEclipse 10)で開発し、Maven3を使用してビルドするJavaWebアプリケーションプロジェクトがあります。

私は次のレイアウトを持っています(私の問題に関連するファイルのみを含みます:

project root
|-- src
|   |-- main
|   |   |-- java
|   |   |-- resources
|   |   |   |-- log4j.xml
|   |   |   +-- struts.properties
|   |   |-- webapp
|   |   |   |-- META-INF
|   |   |   |   +--context.xml
|   |   |-- config
|   |   |   |-- test
|   |   |   |   |--log4j.xml
|   |   |   |   |--struts.properties
|   |   |   |   +--context.xml
|   |   |   +-- prod
|   |   |   |   |--log4j.xml
|   |   |   |   |--struts.properties
|   |   |   |   +--context.xml
|   +--test
+--pom.xml

ご覧のとおり、いくつかの構成ファイルを含めました。プロジェクト構造内の適切な場所にいる人、つまり内部src/main/resourcessrc/main/webappいて、MyEclipseで作業するときに日常的に使用している人です。MyEclipseコネクターを使用して、デプロイメントを開発マシン上のTomcatインスタンスなどに自動的に更新できます。「サーバーの実行」をクリックするだけで、デバッグできます。実際には、このコンテキストでMavenを使用する必要はまったくありません。

次に、テストや本番環境などの別の環境用のリリースをビルドする場合は、実行するmvn -P test clean installと、優れたWARがビルドされます。

私の目標は、最終的なWAR内の構成ファイルを。内の構成ファイルに置き換えることですsrc/config/{environment}/

私は自分のプロファイルを設定しましたpom.xml

<profiles>
    <profile>
        <id>test</id>
        <properties>
            <environment>test</environment>
        </properties>
    </profile>

    <profile>
        <id>prod</id>
        <properties>
            <environment>prod</environment>
        </properties>
    </profile>
</profiles>

次に、これらのリソースを(変数を使用して)指定されたプロファイルからenvironmentWAR内の正しい場所(またはWARに圧縮される一時フォルダー)にコピーしようとします。

<webResources>
    <resource>
        <directory>/src/main/config/${environment}</directory>
        <targetPath>META-INF/</targetPath>
        <includes>
            <include>context.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/config/${environment}</directory>
        <targetPath>WEB-INF/classes/</targetPath>
        <includes>
            <include>
                struts.properties
            </include>
            <include>
                log4j.xml
            </include>
        </includes>
    </resource>
</webResources>

「標準」リソースがこの後にディレクトリにコピーされることを除いて、これは機能しているように見えます。そのため、これらのファイルは上書きされます。だから私はいつも言うからのものの代わりに例えばlog4j.xmlからで終わるsrc/main/resourcessrc/main/configuration/prod/

Maven出力からの抽出:

[INFO] Processing war project
[INFO] Copying webapp webResources [D:\workspace\MyProject/src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp webResources [D:\workspace\MyProject\src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp resources [D:\workspace\MyProject\src\main\webapp]

最後の行でわかるように、からのものは後src/main/webappにコピーされるため、カスタムファイルが上書きされます:(

私の質問:Mavenに「アクティブ化されたプロファイルから」ファイルを使用させ、どういうわけか「自然な」ファイルを上書きする方法は?

4

6 に答える 6

13

user944849による2番目のQ/Aで指摘されているように、最も簡単な解決策は、元のファイルをフィルターで除外して、プロファイルのフォルダーのファイルに置き換えることでした。

だから私は標準的なリソースにフィルタリングを追加しました:

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <!-- Exclude those since they are copied from the profile folder for the build -->
                <exclude>log4j.xml</exclude>
                <exclude>struts.properties</exclude>
            </excludes>
            <filtering>false</filtering>
        </resource>
    </resources>

そしてWebリソースへ:

<warSourceExcludes>**/context.xml</warSourceExcludes>

そのため、3つのファイルはWARフォルダーにコピーされません。次のステップ(webResources)で、アクティブなプロファイルのフォルダーからコピーされます。

また、共通の値を持つ3つのファイルを含むデフォルトのフォルダーを追加しました。このデフォルトフォルダのファイルもコピーされますが、プロファイルのフォルダのファイルの後にのみコピーされます。リソースは上書きされないため、リソースがまだ存在しない場合にのみコピーされます。これは、プロファイルをアクティブ化せずにビルドする場合、または適切なデフォルト値を定義できる場合、ファイルが同一であれば各プロファイルでファイルを複製する必要がない場合に便利です。

構成フォルダーの構造:

-- config
   |-- test
   |   |--log4j.xml
   |   |   |--struts.properties
   |   |   +--context.xml
   |   +-- prod
   |   |   |--log4j.xml
   |   |   +--context.xml
   |   +-- default
   |       |--log4j.xml
   |       |--struts.properties
   |       +--context.xml
...

そして、私のpom.xmlのwebResourcesセクション:

<webResources>
    <!-- Resources from the activated profile folder -->
    <resource>
        <directory>/src/main/config/${environment}</directory>
        <targetPath>META-INF/</targetPath>
        <includes>
            <include>context.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/config/${environment}</directory>
        <targetPath>WEB-INF/classes/</targetPath>
        <includes>
            <include>
                struts.properties
            </include>
            <include>
                log4j.xml
            </include>
        </includes>
    </resource>
    <!-- Default resources in case some file was not defined in the profile folder -->
    <!-- Files are not overwritten so default files will be copied only if it does not exist already -->
    <resource>
        <directory>/src/main/config/default</directory>
        <targetPath>META-INF/</targetPath>
        <includes>
            <include>context.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/config/default</directory>
        <targetPath>WEB-INF/classes/</targetPath>
        <includes>
            <include>
                struts.properties
            </include>
            <include>
                log4j.xml
            </include>
        </includes>
    </resource> 
</webResources>
于 2012-10-05T06:44:57.310 に答える
1

これらの質問/回答のいずれかを見てください。1つはあなたのために働くかもしれません。

戦争がパッケージ化される前に、MavenビルドフェーズでAntタスクを実行しますか?

戦争を構築するときにMavenプロジェクトでファイルが上書きされました

于 2012-10-04T15:57:39.837 に答える
1

戦争ファイルをオーバーレイする必要があると思います。jarではなくwarタイプのすべてのプロファイルに依存関係を作成すると、現在のwarファイルのファイルがオーバーレイされます。

もう1つの可能性は、maven-war-pluginのオーバーレイ構成である可能性があります。

そのため、プロファイルは、現在のファイルにコピーしたいファイルをアクティブにします。プラグインサイトにもいくつかの例を含むかなりのドキュメントがあります

それがうまくいくことを願っています!

于 2012-10-04T14:39:57.667 に答える
1

別の試み:)

オーバーレイパラメータをいじってみました。webappフォルダー内の別のwarファイルにあるwebappフォルダー内のファイルのみを置き換えると思います。ですから、それはあなたのセットアップにとって完璧なことではありません。

しかし、上記のwebResourceパラメーターはこれを行うことができます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.mimacom.maven.examples</groupId>
<artifactId>mimacom-war-overlays</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>${project.artifactId}</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.build.compiler.version>1.6</project.build.compiler.version>
    <junit.version>4.9</junit.version>
</properties>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>${project.build.compiler.version}</source>
                    <target>${project.build.compiler.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
    </dependency>
</dependencies>

<profiles>
    <profile>
        <id>prod</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.3</version>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>src/main/config/prod</directory>
                            </resource>
                        </webResources>
                        <!--<includes>-->
                            <!--<include>${basedir}/environments/overlay-1/css/styles.css</include>-->
                        <!--</includes>-->
                        <!--<overlays>-->
                            <!--<overlay>-->
                                <!--<includes>-->
                                    <!--../environments/overlay-1/css/**-->
                                <!--</includes>-->
                            <!--</overlay>-->
                        <!--</overlays>-->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>test</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.3</version>
                    <configuration>
                        <webResources>
                            <resource>
                                <directory>src/main/config/test</directory>
                            </resource>
                        </webResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

</profiles>

アクティブ化されたプロファイルは、warファイルに追加のフォルダーを追加します。だからそれはトリックをする必要があります!

于 2012-10-05T12:32:28.810 に答える
1

同じリソースを使用しますが、各プロファイル(testとprod)の構成が異なるようです。

したがって、次のような構成を使用することをお勧めします。

<profiles>
<profile>
    <id>test</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <property>
            <name>env</name>
            <name>test</name>
        </property>
    </activation>
    <build>
        <filters>
            <filter>test.properties</filter>
        </filters>
    </build>
</profile>

<profile>
    <id>prod</id>
    <activation>
        <property>
            <name>env</name>
            <value>prod</value>
        </property>
    </activation>
    <build>
        <filters>
            <filter>prod.properties</filter>
        </filters>
    </build>
</profile>
</profiles>

このシナリオでは、2つのプロファイルがあり、それぞれが「env」パラメーターを使用してアクティブ化されます。各プロファイルには、リソースをフィルタリングし、log4j.xml、struts.properties、context.xmlファイルをsrc / main / resourcesに配置し、変数を使用して各プロファイルで適切な構成を使用するためのファイルがあります。

お役に立てば幸いです。

于 2013-02-14T22:38:18.763 に答える
0

これは、pom.xmlに挿入された単純なスニペットのみに依存する上記のソリューションのより単純なバージョンです。

デフォルトの(ローカルワークステーション)Webアプリを次のコマンドでビルドします。

mvn war:exploded

環境コマンドラインパラメータを追加して、resources-prodなどの環境固有のディレクトリからターゲットのWEB-INF/classesディレクトリにファイルをコピーします。

mvn war:exploded -Denvironment=prod

これをpom.xmlのプロジェクト要素内に追加します。

<!-- this profile will allow files in environment-specific folders like resources-prod or resources-test
     to be added to the resulting war's classpath under WEB-INF/classes
     to activate the profile, simply add '-Denvironment=prod' to your maven build command 
     this also works fine with war:inplace and war:exploded 
-->
<profile>
    <id>environment-specific</id>
    <activation>
        <property>
            <name>environment</name>
        </property>
    </activation>
    <build>
    <plugins>   
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <webResources>
                <!-- note the order of the following resource elements are important. 
                     if there are duplicate files, the first file copied will win
                -->
                <resource>
                    <!-- this is relative to the pom.xml directory -->                        
                    <directory>resources-${environment}</directory>
                    <!-- override default destination at root of war -->
                    <targetPath>WEB-INF/classes</targetPath>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <targetPath>WEB-INF/classes</targetPath>
                </resource>
            </webResources>
        </configuration>
      </plugin>             
    </plugins>
    </build>
</profile>

詳細と作業例へのリンク

于 2014-02-14T21:03:55.137 に答える