对于我目前的目的,我有一个Maven项目,它创建一个war
文件,我想看看它在创建war
时使用的实际类路径。有没有办法在单个命令中执行此操作 - 无需编译整个项目?
一个想法是让Maven生成target/classpath.properties
文件,然后在那时停止。
答案 0 :(得分:64)
要在文件中单独获取类路径,您可以:
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>
来自:http://maven.apache.org/plugins/maven-dependency-plugin/usage.html
答案 1 :(得分:14)
或调用“mvn -e -X ....”并检查输出......
答案 2 :(得分:8)
此命令输出 Mac和Linux上的类路径:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
打印结果而不保存到文件中可能很有用,例如,在将结果分配给Bash脚本中的变量时。此解决方案仅在Mac和Linux上运行,但Bash shell脚本也是如此。
在Windows中(例如在BAT文件中),没有echo
可执行文件,您将需要这样的内容(未经测试):
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添加错误消息的影响。
答案 3 :(得分:6)
命令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
。
答案 4 :(得分:3)
为Janiks答案添加了缺少的arg参数。现在完成了。别客气。
mvn -q exec:exec -Dexec.classpathScope="compile" -Dexec.executable="echo" -Dexec.args="%classpath"
答案 5 :(得分:1)
这是单一命令解决方案,但会编译代码。
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}'
Shell脚本示例用法
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
我在shell脚本中使用它的变体以这种方式运行独立的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
答案 6 :(得分:1)
在ecerulm的评论中注明Janik's answer,您可能希望将范围指定为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个版本的类路径,一个用于主构建,另一个用于测试。