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

Posted

技术标签:

【中文标题】在 Maven 中,如何输出正在使用的类路径?【英文标题】:In Maven, how output the classpath being used? 【发布时间】:2013-05-15 08:02:39 【问题描述】:

对于我目前的目的,我有一个 Maven 项目,它创建了一个 war 文件,我想看看它在创建 war 时使用的实际类路径。有没有办法在一个命令中做到这一点——而不必编译整个项目?

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

【问题讨论】:

这应该是maven的基本要求。但我相信他们不会同意的。 【参考方案1】:

或调用“mvn -e -X ....”并检查输出...

【讨论】:

我认为这不能解决问题,因为显示错误和调试信息无助于输出正在使用的类路径。 调试信息包含每个涉及的生命周期插件的整个类路径(包括其他东西) 谢谢您,先生,我对您的解决方案进行了迭代,如果您认为它对未来的读者有益,请随意重复使用其中的任何一个,因为现在我的答案在底部,很少有人会阅读它(***.com/a/37551032/2265487)【参考方案2】:

要在文件中单独获取类路径,您可以:

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

【讨论】:

mvn dependency:build-classpath 将默认输出test dependency scope 的类路径,其中包括systemprovidedcompileruntimetest。如果您想获取 compileruntime 范围的类路径。你可以使用-Dmdep.includeScope=compile @ecerulm 谢谢,这是一个非常有价值的细节。但是-DincludeScope=compile 为我工作而不是-Dmdep.includeScope 我在下面添加了一个补充answer,允许指定所需的范围。 在我的用例中,我希望将类路径打印在标准输出上,而不必弄乱临时文件。这有效:mvn dependency:build-classpath -Dmdep.includeScope=runtime -Dmdep.outputFile=/dev/fd/4 4&gt;&amp;1 &gt;/dev/null 要在 Linux 中将其发送到 STDOUT(并且没有日志消息),您可以使用 mvn dependency:build-classpath -Dmdep.outputFile=/dev/stdout -q【参考方案3】:

这是一个单命令解决方案,但会编译代码

mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk 'print $2'
它基于Philip Helger之前的answer(顺便感谢)

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

【讨论】:

在 maven 3.3.9 中,您的 grep-command 不会返回任何内容(不幸的是,使用 -e -X 运行时我看不到任何类路径)。此解决方案是否有更新? 现在在 Mint 18(基于 Ubuntu 16.04)上测试,它可以工作:O。您能否为 uname -amaven --version 提供控制台响应?在具有成功结果的测试系统上,$ uname -a --> "Linux ******* 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux"。 $ mvn --version --> "Apache Maven 3.3.9; Java version: 1.8.0_111, vendor: Oracle Corporation; OS name: '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 方法,请告诉我以更新答案)【参考方案4】:

命令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

【讨论】:

【参考方案5】:

此命令输出 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 添加错误消息的影响。

【讨论】:

这比这个问题的公认答案好多少? 它输出类路径而不是将其保存到文件中。 这样做的另一个好处是它还包含您项目的类文件 (target/classes),而不仅仅是依赖项。【参考方案6】:

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

【讨论】:

【参考方案7】:

在 Janiks 答案中添加了缺少的范围参数。现在它已经完成了。不客气。

mvn -q exec:exec -Dexec.classpathScope="compile" -Dexec.executable="echo" -Dexec.args="%classpath" 

【讨论】:

以上是关于在 Maven 中,如何输出正在使用的类路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pom 中的依赖项加载到 eclipse 项目的类路径中?

Maven 编译器插件:如何更改 testCompile 的类路径值?

在 Maven 中 - 如何根据正在使用的配置文件的名称重命名输出 .war 文件

Maven:将文件夹或 jar 文件添加到当前类路径中

如何修改maven默认仓库的路径

Maven - 如何处理生成的类