現在の目的のために、war
ファイルを作成するMavenプロジェクトがあり、war
を作成するときに実際にどのクラスパスが使用されているかを確認します。プロジェクト全体をコンパイルすることなく、単一のコマンドでそれを行う方法はありますか?
1つのアイデアは、Mavenがtarget/classpath.properties
ファイルを生成し、その時点で停止することです。
ファイル内でクラスパスを単独で取得するには、次のようにします。
mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
または、これをPOM.XMLに追加します。
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<!-- configure the plugin here -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
From: http://maven.Apache.org/plugins/maven-dependency-plugin/usage.html
または「mvn -e -X ....」を呼び出して出力を確認します...
次のコマンドoutputs MacおよびLinuxのクラスパス:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
結果を出力し、ファイルに保存しないことは、たとえば、Bashスクリプトの変数に結果を割り当てるときに役立ちます。このソリューションはMacおよびLinuxでのみ実行されますが、Bash Shellスクリプトも実行されます。
echo
実行可能ファイルが存在しないWindows(BATファイルなど)では、次のようなものが必要です(テストされていません):
mvn -q exec:exec -Dexec.executable=cmd -Dexec.args="/c echo %classpath"
または、クラスパスを使用してJava
プログラムを実行することもできます。
mvn -q exec:exec -Dexec.executable=Java -Dexec.args="-cp %classpath Main"
またはそのように(正しいクラスパスを自動的に使用します):
mvn -q exec:Java -Dexec.mainClass="Main"
ただし、これらの代替アプローチはどちらも、プログラムが失敗したときにエラーメッセージを追加するMavenの影響を受けます。
コマンド mvn dependency:list
は、コンパイル、ランタイム、およびテストに使用されるすべてのjarを含むクラスパスを次の形式でリストします。
INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ MyProject ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.netbeans.api:org-openide-filesystems:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-netbeans-modules-queries:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-netbeans-api-progress:jar:RELEASE80:compile
[INFO] org.netbeans.api:org-openide-dialogs:jar:RELEASE80:compile
[INFO] org.Apache.derby:derby:jar:10.11.1.1:compile
[INFO] org.netbeans.api:org-openide-windows:jar:RELEASE80:compile
唯一の要件は、コンパイルが終了することです。コンパイルが実行されないと動作しません。
他のコマンドは、コマンドmvn dependency:tree
。
ecerulm のコメントで Janikの回答 に記載されているように、スコープを_dependency:build-classpath
_に指定することもできます。クラスパスの出力はスコープによって異なるため(デフォルトではtest
は何らかの理由で使用されます)。私はこのようなコマンドで終わった:
_mvn -DincludeScope=compile dependency:build-classpath
_
POM内では、次のように使用できます。
_<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>compile</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/compile-classpath.txt</outputFile>
</configuration>
</execution>
<execution>
<id>build-test-classpath</id>
<phase>generate-test-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/test-classpath.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
_
これにより、メインビルド用とテスト用の2つのバージョンのクラスパスが出力されます。
これは単一コマンドのソリューションですが、はコードをコンパイルします。
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}'
シェルスクリプトの使用例
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
シェルスクリプトでそのバリエーションを使用して、スタンドアロンのmain()(Hibernateスキーマ生成用)をこの方法で実行しました
#/bin/bash
MAVEN_TEST_CLASSPATH=$(mvn -e -X clean package | grep -o -P '\-classpath .*?test.*? ')
Java $MAVEN_TEST_CLASSPATH foo.bar.DBSchemaCreate
ファイル出力の例
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath