206

Maven2 を使用して、開発環境から dev-server ディレクトリにコピーしたい構成ファイルとさまざまなドキュメントがあります。不思議なことに、Maven はこの作業が得意ではないようです。

オプションのいくつか:

  • Mavenでコピータスクを簡単に使用
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
  • Ant プラグインを使用して、Antからのコピーを実行します。

    • 通常はタイプjarのPOMの「メイン」アーティファクトとともに、タイプzipのアーティファクトを構築し、そのアーティファクトをリポジトリからターゲット・ディレクトリに解凍します。

    • 以下に示すように、maven-resourcesプラグイン。

    • Maven Assembly プラグイン - しかし、単純に「慣習的に」物事を行いたい場合、これには多くの手動定義が必要なようです。

    • このページには、コピーを行うためのプラグインの作成方法も示されています!

    • 以下に示すように、maven-uploadプラグイン。

    • 以下で説明するように、 copyを使用したmaven-dependency-plugin


これらはすべて不必要にその場しのぎに思えます。Maven は、これらの標準的なタスクを大騒ぎせずに行うことに優れているはずです。

何かアドバイス?

4

14 に答える 14

141
<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include> **/*.properties</include>
            </includes>
        </resource>
    </resources>
    ...
</build>
于 2009-08-10T11:26:02.483 に答える
128

Antrun プラグインをためらわないでください。Ant と Maven が対立していると考える人がいるからといって、そうではありません。避けられない 1 回限りのカスタマイズを実行する必要がある場合は、コピー タスクを使用します。

<project>
  [...]
  <build>
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>deploy</phase>
            <configuration>
              <target>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

この質問に答えるにあたり、私はあなたが尋ねたことの詳細に焦点を当てています. ファイルをコピーするにはどうすればよいですか? この質問と変数名は、「サーバーのプロビジョニングを処理するためのより良い方法はありますか?」のような、より大きな質問につながります。Maven をビルド システムとして使用してデプロイ可能なアーティファクトを生成し、これらのカスタマイズを個別のモジュールまたは別の場所で完全に実行します。ビルド環境をもう少し共有している場合は、より良い方法があるかもしれません。多数のサーバーをプロビジョニングするためのプラグインがあります。サーバーのルートで展開されているアセンブリを添付していただけますか? どのサーバーを使用していますか?

繰り返しますが、もっと良い方法があると確信しています。

于 2009-03-29T05:51:02.977 に答える
54

ファイルをコピーするには、次を使用します。

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>copy-resource-one</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>

                    <configuration>
                        <outputDirectory>${basedir}/destination-folder</outputDirectory>
                        <resources>
                            <resource>
                                <directory>/source-folder</directory>
                                <includes>
                                    <include>file.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
           </executions>
        </plugin>

サブフォルダーを含むフォルダーをコピーするには、次の構成を使用します。

           <configuration>
              <outputDirectory>${basedir}/target-folder</outputDirectory>
              <resources>          
                <resource>
                  <directory>/source-folder</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>  
于 2015-08-18T19:52:55.360 に答える
21

Maven 依存関係プラグインにより、ant タスクをいじる時間が大幅に短縮されました。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>install-jar</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>...</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

dependency:copyは documentend であり、unpack などのより便利な目標があります。

于 2011-11-18T10:59:06.950 に答える
7

上記の ant ソリューションは構成が最も簡単ですが、Atlassian の maven-upload-plugin を使用することができました。適切なドキュメントを見つけることができませんでした。これを使用する方法は次のとおりです。

<build>
  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
       <resourceSrc>
             ${project.build.directory}/${project.build.finalName}.${project.packaging}
       </resourceSrc>
       <resourceDest>${jboss.deployDir}</resourceDest>
       <serverId>${jboss.host}</serverId>
       <url>${jboss.deployUrl}</url>
     </configuration>
  </plugin>
</build>

上記の「${jboss.host}」などの変数は ~/.m2/settings.xml で定義され、maven プロファイルを使用してアクティブ化されます。このソリューションは JBoss に限定されません。これは、私が変数に名前を付けたものです。開発、テスト、およびライブ用のプロファイルがあります。したがって、テスト環境で私の耳を jboss インスタンスにアップロードするには、次を実行します。

mvn upload:upload -P test

以下は、settings.xml の抜粋です。

<server>
  <id>localhost</id>
  <username>username</username>
  <password>{Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1</password>
</server>
...
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <jboss.host>localhost</jboss.host> 
      <jboss.deployDir>/opt/jboss/server/default/deploy/</jboss.deployDir>
      <jboss.deployUrl>scp://root@localhost</jboss.deployUrl>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
       <jboss.host>testserver</jboss.host>
       ...

注: このプラグインを含む Atlassian Maven リポジトリはこちら: https://maven.atlassian.com/public/

ソースをダウンロードし、内部のドキュメントを参照して、プラグインが提供するすべての機能を確認することをお勧めします。

`

于 2009-04-23T14:04:41.863 に答える
4

私はcopy-maven-pluginで非常に良い経験をしました。maven-resources-plugin と比較して、はるかに便利で簡潔な構文があります。

于 2013-03-29T16:04:51.100 に答える
4

任意のファイルをコピーする一般的な方法は、Maven Wagonトランスポートの抽象化を利用することです。fileHTTPFTPSCPなどのプロトコルを介してさまざまな宛先を処理できますWebDAV

を使用してファイルをコピーする機能を提供するプラグインがいくつかありますWagon。最も注目すべきは次のとおりです。

  • すぐに使える Maven Deploy プラグイン

    そこにdeploy-fileゴールがあります。それは非常に柔軟性がありませんが、仕事を成し遂げることができます:

    mvn deploy:deploy-file -Dfile=/path/to/your/file.ext -DgroupId=foo 
    -DartifactId=bar -Dversion=1.0 -Durl=<url> -DgeneratePom=false
    

    使用することの重大な欠点Maven Deploy Pluginは、Maven リポジトリで動作するように指定されていることです。特定の構造とメタデータを想定しています。foo/bar/1.0/file-1.0.ext配下にファイルが配置され、チェックサムファイルが作成されていることがわかります。これを回避する方法はありません。

  • Wagon Maven プラグイン

    upload-single目標を使用します。

    mvn org.codehaus.mojo:wagon-maven-plugin:upload-single
    -Dwagon.fromFile=/path/to/your/file.ext -Dwagon.url=<url>
    

    をコピーに使用するのWagon Maven Pluginは簡単で、最も用途が広いようです。


上記の例<url>では、サポートされている任意のプロトコルを使用できます。既存のワゴン プロバイダーのリストを参照してください。例えば

  • ファイルをローカルにコピー:file:///copy/to
  • を実行しているリモート ホストにファイルをコピーしますSSH:scp://host:22/copy/to


上記の例では、コマンド ラインでプラグイン パラメータを渡しています。または、プラグインを で直接設定することもできますPOM。次に、呼び出しは単純に のようになりmvn deploy:deploy-file@configured-execution-idます。または、特定のビルド フェーズにバインドすることもできます。


SCP動作するようなプロトコルについては、次の拡張子を定義する必要があることに 注意してくださいPOM

<build>
  [...]
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.12</version>
    </extension>
  </extensions>


コピー先で認証が必要な場合は、認証情報を設定で提供できServerます。プラグインに渡されるrepositoryId/は、設定で定義されたサーバーと一致する必要があります。serverId

于 2017-02-26T12:38:43.160 に答える
3

${project.server.config} プロパティはカスタム定義されたものであり、標準のディレクトリ レイアウトの外にあるとしか思えません。

もしそうなら、私はコピータスクを使用します。

于 2009-02-25T17:11:32.470 に答える
2

もう 1 つの方法は、アセンブリ プラグインを使用してこれらのものをアーティファクトにバンドルすることです。次に、依存関係プラグインを使用して、これらのファイルを必要な場所に解凍できます。依存関係プラグインには、アーティファクトをコピーするためのコピー ゴールもあります。

于 2009-03-31T17:07:41.133 に答える
1

この回答のために、さまざまな情報源をまとめることができました。

...
<repository>
    <id>atlassian</id>
    <name>Atlassian Repo</name>
    <url>https://maven.atlassian.com/content/repositories/atlassian-public</url>
</repository>
...
<dependency>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
</dependency>
...
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <serverId>jira-repo</serverId>
        <resourceSrc>
            ${project.build.directory}/${project.build.finalName}.${project.packaging}
        </resourceSrc>
        <resourceDest>opt/jira/webapps</resourceDest> <!-- note: no leading slash -->
        <url>scp://root@jira</url>
    </configuration>
</plugin>
...

から~/.m2/settings.xml:

...
<servers>
  <server>
    <id>jira-repo</id>
    <username>myusername</username>
    <password>mypassword</password>
  </server>
</servers>
...

次に、コマンドを実行します: (-X はデバッグ用です)

mvn -X upload:upload

于 2010-10-12T09:02:25.990 に答える
-1

上記のいくつかの優れた回答を要約すると、Mavenはモジュールを構築し、結果を Maven リポジトリにコピーするように設計されています。デプロイメント/インストーラ入力ディレクトリへのモジュールのコピーは、Maven のコア機能のコンテキスト外で、たとえば Ant/Maven copyコマンドを使用して行う必要があります。

于 2009-08-13T10:53:25.523 に答える