在Maven中,如何输出正在使用的类路径?
就我目前的目的而言,我有一个Maven项目,它创建了一个在Maven中,如何输出正在使用的类路径?,maven,classpath,war,maven-war-plugin,Maven,Classpath,War,Maven War Plugin,就我目前的目的而言,我有一个Maven项目,它创建了一个war文件,我想看看它在创建war时使用的实际类路径。有没有一种方法可以在一个命令中实现这一点,而不必编译整个项目 一种方法是让Maven生成目标/classpath.properties文件,然后在该点停止。或调用“mvn-e-X…”并检查输出…要在文件中单独获取类路径,您可以: mvn dependency:build-classpath -Dmdep.outputFile=cp.txt 或者将其添加到POM.XML中: <pr
war
文件,我想看看它在创建war
时使用的实际类路径。有没有一种方法可以在一个命令中实现这一点,而不必编译整个项目
一种方法是让Maven生成
目标/classpath.properties
文件,然后在该点停止。或调用“mvn-e-X…”并检查输出…要在文件中单独获取类路径,您可以:
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>
[...]
org.apache.maven.plugins
这是一个单命令解决方案,但是确实编译了代码
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}')
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath
我在shell脚本中使用了它的一个变体,以这种方式运行独立的main()(用于Hibernate模式生成)
文件输出示例
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath
命令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
唯一的要求是编译完成。
如果不运行编译,它将不起作用
另一个命令是commandmvn dependency:tree
此命令输出Mac和Linux上的类路径:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
例如,将结果指定给Bash脚本中的变量时,打印结果而不保存到文件中可能会很有用。此解决方案仅在Mac和Linux上运行,Bash shell脚本也是如此
在Windows中(例如在BAT文件中),如果没有echo
可执行文件,您将需要这样的内容(未测试):
或者,您可以使用类路径执行java
程序:
mvn -q exec:exec -Dexec.executable=java -Dexec.args="-cp %classpath Main"
或者甚至是这样(它将自动使用正确的类路径):
但是,这两种替代方法都会遇到Maven在程序失败时添加错误消息的问题。正如他在对的评论中所指出的,您可能需要指定依赖项的作用域:构建类路径
,因为类路径输出会因不同的作用域而不同(默认情况下,出于某种原因使用测试)。我的命令是这样的:
mvn -DincludeScope=compile dependency:build-classpath
<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>
在POM中,可以这样使用:
mvn -DincludeScope=compile dependency:build-classpath
<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>
[...]
org.apache.maven.plugins
maven依赖插件
2.9
构建类路径
生成源
构建类路径
编译
${project.build.directory}/compile-classpath.txt
构建测试类路径
生成测试源
构建类路径
测试
${project.build.directory}/test-classpath.txt
[...]
这将输出2个版本的类路径,一个用于主构建,另一个用于测试。将缺少的arg for scope添加到Janiks答案中。现在它完成了。不客气
mvn -q exec:exec -Dexec.classpathScope="compile" -Dexec.executable="echo" -Dexec.args="%classpath"
我认为这并不能解决问题,因为显示错误和调试信息无助于输出正在使用的类路径。调试信息包含每个涉及的生命周期插件(包括其他东西)的整个类路径谢谢,先生,我在您的解决方案上写了一个迭代,如果你认为它对未来的读者有好处,就可以重用它,因为现在我的答案是在底部,很少有人会用Maven 3.3.9来阅读它(),你的GRIP命令不返回任何东西(不幸的是,在与-E-X一起运行时,我看不到任何类路径)。这个解决方案可能有更新吗?现在正在Mint 18上测试(基于Ubuntu 16.04),它可以工作:O。你能为uname-a
和maven--version
提供控制台响应吗?在测试成功的系统上,$uname-a-->“Linux**********4.4.0-21-generic”37 Ubuntu SMP Mon Apr 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux”
mvn--version-->“ApacheMaven 3.3.9;Java版本:1.8.0_111,供应商:Oracle Corporation;操作系统名称:'linux',version:'4.4.0-21-generic',arch:'amd64',family:'unix'
注意,如果您不在linux中,grep可能不在您的系统上(如windows中),或者可能表现不同(如macos上的某些选项组合)。如果您使用的是windows,您可以尝试使用Cygwin或MinGW来安装grep,但我不知道您是否会遇到与macos类似的问题,Cygwin或MinGW的行为可能与Ubuntu 16.04软件包上使用的不同。(如果您使用windows并发现MinGW或Cygwin方法很有用,请告诉我更新答案)这比这个问题的公认答案好多少?它输出类路径而不是将其保存到文件中。它的另一个优点是还包括项目的类文件(target/classes
),而不仅仅是依赖项。mvn依赖项:构建类路径
默认情况下将为测试
输出类路径,其中包括系统
,提供
,编译
,运行时
和测试
。如果您想获取编译
或运行时作用域。您可以使用-Dmdep.includeScope=compile
@ecerulem谢谢,这是一个非常有价值的细节。但是-DincludeScope=compile
对我来说是有效的,而不是-Dmdep.includeScope
。我在下面添加了一个补充,允许指定所需的作用域。在我的用例中,我希望在stdout wi上打印类路径不必处理临时文件。这样做:mvn依赖项:build classpath-Dmdep.includeScope=runtime-Dmdep.outp