【问题标题】:How to compile Maven project from command line with all dependencies?如何从命令行编译具有所有依赖项的 Maven 项目?
【发布时间】:2016-07-11 20:04:44
【问题描述】:

我有一个 Maven 项目,我通常可以从 eclipse 编译和运行,但是当我从命令行编译它时,它的依赖项丢失并且我收到错误。只有在下载依赖项并将它们添加到 c:/Java/jdk/jre/lib/ext 后才能编译项目

如何在不手动将它们添加到 jdk 的情况下从控制台行编译项目及其依赖项?编译器可以以某种方式读取 maven 依赖项吗?

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>TCPPing</groupId>
  <artifactId>TCPPing</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.3</version>
    </dependency>
        <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.6</version>
    </dependency>
  </dependencies>
</project>

【问题讨论】:

  • 请考虑至少阅读一些 maven 文档:maven.apache.org/guides/getting-started/… - 请永远不要再向 lib/ext/ 添加任何内容! java 类路径选项足以运行您的应用程序。不要用项目特定的文件污染你的 java 安装。
  • 我确实读过它,但我仍然不明白该怎么做,我对这一切都很陌生。我设法生成包含所有依赖项的项目的 jar 文件并运行它,但这不是我需要的,我只希望我的编译器从 projectFolder/lib 读取我的依赖项
  • 请添加您项目的pom.xml
  • 您需要将哪些依赖项添加到 JDK 的 ext 文件夹中?您可以使用 search.maven.org 找到相应的依赖项并将它们添加到您的 pom 中。
  • 我需要上述 pom.xml 中的所有依赖项。 commons-cli、commons-net 和 logback-classic

标签: java maven


【解决方案1】:

从带有一些 maven 支持(Eclipse、IntellIJ)的 IDE 运行应用程序应该非常简单。这些 IDE 将负责创建正确的类路径。

如果您想手动执行此操作,请尝试以下操作:

切换到包含 pom.xml 的目录 执行maven命令:

mvn clean install

这将编译您的项目并创建您在 pom.xml 文件中定义的 jar。它运行干净的 maven 阶段和安装(编译、测试等)的每个阶段。

然后收集您用作依赖项的所有 jar 文件(运行项目所需的):

mvn dependency:copy-dependencies

这会执行依赖插件,它将所有依赖项复制到target/dependency

然后您可以使用以下命令运行您的 main 方法:

cd target/
java -cp TCPPing-0.0.1-SNAPSHOT.jar:dependency TCPPing

-cp 定义类路径(所有位置/jar 文件/包含类的文件夹)。 TCPPing 是您运行的具有 main 方法的类。

注意: 适用于 Linux / Mac - 我认为 windows 使用 ;

【讨论】:

  • 谢谢!有点不相关的问题,但你知道为什么我的 logback 记录器在我运行这样的程序时不起作用吗?它工作正常,我从 Eclipse 运行它,但是当我从控制台运行程序时,它只是在控制台中打印日志,而不是在文件中?
  • 它可能找不到您的配置文件并使用默认值(登录到控制台)。如果您遵循 maven 标准并将配置文件放入 src/main/resources (我还建议使用 src/main/java 作为 java 文件的默认设置,您已经重新配置了该部分)它最终会出现在您所在的 jar 中创建并因此在类路径中可用。 IDE 从文件夹中获取它,因为您可能在 IDE 中维护一组文件夹作为类路径。例如。 IDE 几乎可以处理任何事情——在这种情况下并不总是需要,但很幸运。
  • @wemu,我正在使用您提到的命令来运行项目。控制台打印Error: Could not find or load main class SocketWindowWordCount,你认为可能是什么原因?
  • 我建议创建一个新问题 - 您的问题看起来像是缺少依赖项或错误的类路径,但从评论中很难判断您在做什么。
【解决方案2】:

Javac 对 maven 一无所知。因此它不会使用 maven pom.xml。

maven 的价值在于它消除了构建、测试和发布项目的手动工作。

这包括获取依赖项,并运行 javac 并将它们添加到 javac 命令的类路径中。

你可以在maven下载依赖到~/.m2/repository后手动执行javac。但是,您需要告诉 javac 在哪里可以找到 jar。因此是通过类路径参数完成的。

如果您在使用 mvn 编译后尝试运行项目,则需要在放置 .class 文件的同一文件夹中执行此操作。因此应该是 /target/java 或类似的。

【讨论】:

  • 我有 /target/classes 文件夹,里面有所有的类文件。但是当我在该文件夹中打开命令行并运行 java TCPPing 参数时,我仍然得到 NoClassDefException
猜你喜欢
  • 2015-12-16
  • 2019-05-02
  • 2016-03-08
  • 2019-07-04
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2012-11-15
  • 2016-01-27
相关资源
最近更新 更多