对于我目前的目的,我有一个创建war
文件的 Maven 项目,我想看看它在创建war
. 有没有办法在一个命令中做到这一点——而不必编译整个项目?
一种想法是让 Maven 生成target/classpath.properties
文件,然后在该点停止。
对于我目前的目的,我有一个创建war
文件的 Maven 项目,我想看看它在创建war
. 有没有办法在一个命令中做到这一点——而不必编译整个项目?
一种想法是让 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>
来自:http ://maven.apache.org/plugins/maven-dependency-plugin/usage.html
此命令在 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 -e -X ....”并检查输出...
该命令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 个版本的类路径,一个用于主构建,另一个用于测试。
在 Janiks 答案中添加了缺少的范围参数。现在它已经完成了。不客气。
mvn -q exec:exec -Dexec.classpathScope="compile" -Dexec.executable="echo" -Dexec.args="%classpath"
这是一个单一的命令解决方案,但会编译代码。
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