0

Ant から Maven にアプリケーションを移行中です。このアプリケーションをデプロイできる環境は 2 種類あります。1 つの構成は Local と呼ばれ、もう 1 つの呼び出し元は dev と呼ばれるため、当然 2 つの Ant ターゲットが存在します。各 ant ターゲットは、2 つの異なるフォルダーからリソースをコピーし、それを最終的な war ファイルの一部にします。

Mavenでこの動作を模倣するにはどうすればよいですか? ビルド時にパラメーターを渡すことを考えていましたが、このパラメーターに基づいて、maven リソース プラグインを使用して対応するフォルダーをコピーできます。このようなもの。

<resources>
          <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <excludes>
                    <exclude>${local}/**</exclude>
                </excludes>
            </resource>
        </resources>

私は正しい道にいますか?はいの場合、実行時に「ローカル」に置き換えるにはどうすればよいですか? また、補完操作を行っています。Dev 用にビルドする場合は、ローカルを除外し、その逆も同様です。これを処理するより良い方法はありますか?

また、この方法を使用すると、ターゲット war にフォルダー全体がコピーされます。フォルダー全体ではなくフォルダーの内容のみをコピーするようにmavenを構成するにはどうすればよいですか。

4

2 に答える 2

2

<directory>リソースをコピーするとき、Maven は定義された値に include/exclude パターンを適用し、そのディレクトリからのパス構造を維持します。flattenmapper私が見つけたアリに相当するものはありません。

残りについては、Maven ビルド プロファイルを検討してください。ビルド時に変更したい構成を含むプロファイルを定義してから、コマンド ラインから適切なプロファイルをアクティブにします。以下に示す構成では、コマンド

mvn -Dtarget.env=local process-resources

/src/main/resources/localからにファイルをコピーしますtarget/classes。リソースのdirectory要素に「local」が含まれているため、コピーされたリソースのパスには表示されません。

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <property>
                <name>target.env</name>
                <value>local</value>
            </property>
        </activation>
        <properties>
            <resource.dir>local</resource.dir>
        </properties>
    </profile>

    <!-- add a similar profile for dev -->
</profiles>

<resources>
    <resource>
        <directory>src/main/resources/${resource.dir}</directory>
        <filtering>true</filtering>
    </resource>
</resources>

ここで示したプロファイルでは、さらに多くのことができます。ユースケース全体が解決しない場合でも、これで開始できることを願っています。

于 2012-06-27T20:43:52.717 に答える
1

私がお勧めできる最善の方法は、次のような構造を作成することです (プロパティ ファイルのみ)。

.
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |-- resources
    |   |-- environment
    |   |   |-- test
    |   |   |   `-- database.properties
    |   |   `-- production
    |   |       `-- database.properties
    |   `-- webapp

次のようなアセンブリ記述子を作成して、各環境の maven-assembly-plugin と組み合わせて使用​​します。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>test</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <outputDirectory>WEB-INF</outputDirectory>
      <directory>${basedir}/src/main/environment/test/</directory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

最後に、環境ごとに実行する必要があります。

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <id>test</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
      <execution>
        <id>production</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin>

その結果、1 回のビルドで、本番用と開発用に構成された 2 つの war ファイルが作成されます。

于 2012-06-27T20:43:04.303 に答える