Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Maven中,如何输出正在使用的类路径?_Maven_Classpath_War_Maven War Plugin - Fatal编程技术网

在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

就我目前的目的而言,我有一个Maven项目,它创建了一个
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
唯一的要求是编译完成。 如果不运行编译,它将不起作用

另一个命令是command
mvn 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