在Maven中,如何输出使用的类路径?

时间:2013-05-20 17:35:45

标签: maven classpath war maven-war-plugin

对于我目前的目的,我有一个Maven项目,它创建一个war文件,我想看看它在创建war时使用的实际类路径。有没有办法在单个命令中执行此操作 - 无需编译整个项目?

一个想法是让Maven生成target/classpath.properties文件,然后在那时停止。

7 个答案:

答案 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个版本的类路径,一个用于主构建,另一个用于测试。