Maven を使用してファイルをコピーするためのベスト プラクティス
-
06-09-2019 - |
質問
Maven2 を使用して、開発環境から dev-server ディレクトリにコピーしたい構成ファイルとさまざまなドキュメントがあります。不思議なことに、Maven はこのタスクに関しては得意ではないようです。
オプションの一部:
- 簡単な使い方 コピー Maven でのタスク
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
Ant プラグインを使用して実行します コピー アントから。
タイプのアーティファクトを構築する ジップ, 、通常は次のタイプの POM の「メイン」アーティファクトと並んで 瓶, 、 それから 開梱する そのアーティファクトをリポジトリからターゲット ディレクトリにコピーします。
maven リソース 後述するプラグイン。
Maven Assembly プラグイン -- しかし、物事を単純かつ「従来どおり」に実行したい場合、これには多くの手動定義が必要なようです。
このページ コピーを行うためのプラグインを構築する方法も示しています。
maven-アップロード 後述するプラグイン。
maven-依存関係-プラグイン と コピー, 、後述するように。
これらはすべて不必要に場当たり的に見えます。Maven は、これらの標準的なタスクを手間をかけずに実行することに優れていると考えられています。
何かアドバイス?
解決
Antrunプラグインから敬遠しないでください。一部の人々はAntとMavenのは反対であると考える傾向があるからといって、そうではありません。あなたには、いくつかの避けられない一回限りのカスタマイズを実行する必要がある場合はコピータスクを使用します:
<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を使用してください。あなたのビルド環境の少しを共有する場合は、より良い方法があるかもしれない - プロビジョニングするプラグインは、サーバーの数があります。あなたは、サーバーのルートに解凍されアセンブリを添付してもらえますか?あなたはどのようなサーバーを使用していますか?
繰り返しますが、私はより良い方法があると確信してます。
他のヒント
<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>
ファイルの使用をコピーするには:
<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>
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>
依存関係:documentendあるをコピーし、そしてアンパックなどのより有用な目標を持っています。
は、単純なコピー作業のために私は<コピー名前の変更 - の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>
必要に応じてさらに、あなたは複数の段階で複数の実行を指定することができます。、第二の目標は、単純な構成の残りの部分は同じままながら、それは言うことありませんこれは、「名前の変更」です。より多くの使用方法の例については従量ページを参照してください。
の注:このプラグインは、ファイルではなくディレクトリをコピーすることしかできません。 (この制限を見つけるための@ james.garrissに感謝します。)
上記のアリソリューションを構成するのが最も簡単ですが、私はアトラシアンからのmaven-のアップロード・プラグインを使用して運を持っていました。私は、良いドキュメントを見つけることができませんでした、ここで私はそれを使用する方法です。
<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への制約されていない、これは私が私の変数の名前だけのものです。私はDEV、テスト、およびライブのプロファイルを持っています。だから私は実行しますテスト環境でのJBossのインスタンスに私の耳をアップロードします:
mvn upload:upload -P test
ここでのsettings.xmlからsnipetあります:
<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>
...
注: このプラグインを持ってアトラシアンmavenのレポはこちらです: https://maven.atlassian.com/public/
私は、ソースをダウンロードして、プラグインが提供するすべての機能を確認するために内部のドキュメントを見てお勧めします。
`
さて、Mavenのは、細かい粒状のタスクを実行するには良いことになっていない、それはbashや蟻のようなスクリプト言語ではありません、それはむしろ、宣言です - 私は、戦争、または耳を必要とし、あなたはそれを得る - あなたが言います。あなたは戦争や耳の内部のようになりますどのようにカスタマイズする必要がある場合は、あなたが問題を抱えています。それはちょうどアリが、宣言型のような手続きではありません。 これは、初めに、いくつかの長所を持っている、そして最後に短所の多くを持つことができます。
私は最初のコンセプトは「ただ働き」という、細かいプラグインを持っていることでしたが、あなたは非標準のものを行う場合、現実は違うと思います。
あなたはしかし、あなたのPOMSといくつかのカスタムプラグインで十分に力を入れている場合は、例えばアリのようにはるかに優れたビルド環境を得ることができます(もちろん、あなたのプロジェクトに依存しますが、それは大きなプロジェクトのためのより多くの真を取得します)ます。
私はコピーのmaven-pluginのを持つ非常に良い経験をしました。これは、Mavenの資源・プラグインと比較してはるかに便利かつ簡潔な構文を持っています。
任意のファイルをコピーする一般的な方法は、 メイブンワゴン トランスポートの抽象化。次のようなプロトコルを介してさまざまな宛先を処理できます。 file
, HTTP
, FTP
, SCP
または WebDAV
.
を使用してファイルをコピーする機能を提供するプラグインがいくつかあります。 Wagon
. 。最も注目すべきものは次のとおりです。
すぐに使える Maven デプロイプラグイン
そこには
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
そしてチェックサムファイルが作成されます。これを回避する方法はありません。ワゴン Maven プラグイン
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
プラグインに渡されるものは、設定で定義されたサーバーと一致する必要があります。
私はあなたの$ {} project.server.configプロパティは、カスタム定義されたものですし、標準のディレクトリレイアウトの外にあると仮定することができます。
その場合は、、その後、私はコピータスクを使用すると思います。
もう一つの方法は、アセンブリのプラグインを使用してアーティファクトにこれらの事をバンドルすることです。次に、あなたがしたい、これらのファイルを解凍するために、依存関係のプラグインを使用することができます。また、成果物をコピーするには、依存関係のプラグインでの目標をそこにコピーされます。
私はこの回答のためにいくつかの異なるソースをつなぎ合わせることができました。
...
<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
上記の優れた回答のいくつかを要約すると、次のようになります。 メイビン モジュールを構築し、その結果を Maven リポジトリにコピーするように設計されています。デプロイメント/インストーラー入力ディレクトリへのモジュールのコピーは、Maven のコア機能のコンテキスト外で実行する必要があります。Ant/Maven と一緒に コピー 指示。