web-dev-qa-db-ja.com

Mavenでファイルをコピーするためのベストプラクティス

Maven2を使用して、dev環境からdev-serverディレクトリにコピーする設定ファイルとさまざまなドキュメントがあります。奇妙なことに、Mavenはこのタスクに強いようには見えません。


いくつかのオプション:

  • Mavenでcopyタスクを使用する

<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>

  • Antプラグインを使用して、Antからcopyを実行します。

  • タイプZipのアーティファクトを作成します。通常、タイプjar、次にunpackリポジトリからターゲットディレクトリへのアーティファクト。

  • maven-resourcesプラグイン。以下で説明します。

  • Maven Assemblyプラグイン-しかし、これを単純かつ「従来どおり」に実行したい場合、これには多くの手動定義が必要なようです。

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

  • maven-uploadプラグイン、以下で説明します。

  • maven-dependency-pluginwithcopy、以下で説明します。


これらはすべて不必要にアドホックに見える:Mavenは、これらの標準的なタスクを大騒ぎせずに行うことができます。

何かアドバイス?

176
Joshua Fox

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

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

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

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

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

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

110
Tim O'Brien
<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>
132
peter

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

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</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>  

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 はドキュメントエンドであり、アンパックのようなより有用な目標があります。

18
Tires

単純なコピータスクの場合、 copy-rename-maven-plugin をお勧めします。簡単で使いやすいです:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

複数のファイルをコピーする場合は、<sourceFile>...</destinationFile>部分を

<fileSets>
  <fileSet>
    <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
    <destinationFile>target/someDir/environment.properties</destinationFile>
  </fileSet>
  <fileSet>
    <sourceFile>src/someDirectory/test.logback.xml</sourceFile>
    <destinationFile>target/someDir/logback.xml</destinationFile>
  </fileSet>                
</fileSets>

さらに、必要に応じて複数のフェーズで複数の実行を指定できます。2番目の目標は「名前の変更」です。これは、設定の残りの部分が同じままで、言うことを実行するだけです。その他の使用例については、 sage-Page を参照してください。

:このプラグインは、ディレクトリではなくファイルのみをコピーできます。 (この制限を見つけてくれた@ james.garrissに感謝します。)

15
morten.c

上記のantソリューションは設定が最も簡単ですが、アトラシアンの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/

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

`

6
Kyle Renfro

まあ、mavenはきめ細かなタスクを実行するのに適しているわけではありません。bashやantのようなスクリプト言語ではなく、むしろ宣言的です-あなたが言う-私は戦争または耳が必要です。ただし、戦争や耳の内側の外観をカスタマイズする必要がある場合は、問題が発生します。 antのような手続き型ではなく、宣言型です。これには最初にいくつかの長所があり、最後には多くの短所があります。

最初のコンセプトは、「ちょうど動作する」素晴らしいプラグインを持つことだったと思いますが、非標準的なことをすれば現実は異なります。

ただし、pomsと少数のカスタムプラグインに十分な労力を注ぐと、たとえばantのようにはるかに優れたビルド環境が得られます(もちろんプロジェクトによって異なりますが、より大きなプロジェクトではますます真実になります)。

5
siddhadev

任意のファイルをコピーする一般的な方法は、 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>はサポートされている任意のプロトコルにできます。既存の Wagon Providers のリストを参照してください。例えば

  • ファイルをローカルにコピーする: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 settings で提供できます。プラグインに渡されるrepositoryId/serverIdは、設定で定義されたサーバーと一致する必要があります。

4
user318054

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

4
azerole

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

その場合は、コピータスクを使用します。

3
whaley

別の方法は、Assemblyプラグインを使用して、これらのものを成果物にバンドルすることです。その後、依存関係プラグインを使用して、これらのファイルを必要な場所に展開できます。アーティファクトをコピーするための依存関係プラグインにもコピー目標があります。

2
Brian Fox

この答えについては、さまざまなソースをまとめることができました。

...
<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

1
Brett Dutton