【问题标题】:How do I run a java application with maven from command line on ubuntu?如何在 ubuntu 的命令行中使用 maven 运行 java 应用程序?
【发布时间】:2021-06-25 22:53:43
【问题描述】:

我正在尝试使用 OpenJDK 13 在 ubuntu 的命令行中使用 maven 运行此 java application

openjdk version "13.0.2" 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 13.0.2+8)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 13.0.2+8, mixed mode, sharing)

该项目是使用 Intellij Idea 创建的。

我想我已经使用这些命令成功构建了

git clone https://github.com/danvega/httpclient-tutorial.git
cd httpclient-tutorial
mvn package

但是,我不知道如何从命令行运行应用程序。

我试过这些命令

cd target/classes
java dev.danvega.Application

得到了这个错误

Error: Unable to initialize main class dev.danvega.Application
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/type/TypeReference

我错过了什么?

【问题讨论】:

  • 一个离题建议:在 git 存储库中包含文件夹 .idea 和 target 是一种不好的做法。您可以避免它创建一个 .gitignore 文件。 .idea 文件夹保存与您的 intellij 实例相关的配置,它可能与我的冲突。并且目标文件夹包含已编译的源,您在编译时创建它,在 repo 中不需要。 ;)
  • 你的问题不清楚,是执行创建的jar maven还是执行目标文件夹中的类?
  • @code_mechanic 谢谢。我不确定我应该跑哪一个。我只想使用该 repo 中的代码将输出显示在大约 16'39" 到视频中 (youtu.be/5MmlRZZxTqk?t=1001)

标签: java maven


【解决方案1】:

您启动 Java 时没有指定 Maven 依赖项的位置,这称为 CLASSPATH(如果您使用 Java 模块系统,Java 9 还包括 MODULEPATH),类似于在 Windows 上的 PATH 中可以找到 *.dll 文件的方式或 LD_LIBRARY_PATH 可用于 Unix 系统上的 *.so

请在您之前查看其他人的精彩回答和问题:

我个人更喜欢:

  1. Maven Exec 插件https://www.mojohaus.org/exec-maven-plugin/examples/example-exec-for-java-programs.html
  2. 创建一个胖 jar(例如,使用 Maven Shade 插件),它对于分发您的代码和所有必需的依赖项也很实用,因此任何人都可以轻松地从 java -jar yourfat.jar 开始(或者只需单击它就会在 Windows 上启动)

【讨论】:

    【解决方案2】:

    在这里,您有一个依赖于 jackson-databind 的 maven 项目,而后者又会有更多的依赖关系,即 jackson-corejackson-annotations

    来自这些依赖项的类不会捆绑在您的应用程序 jar 中,因此您不能直接使用 java 命令从项目中运行 Application 主类,您需要在 java 类路径中指定依赖类,以便 java 可以加载程序的这些依赖类。

    由于它是一个 maven 项目,这些依赖的 jars 将被拉入 maven 默认目录 (.m2) 到您的主路径中,正如您所提到的,您使用的是 /home/<your username>/ 的 ubuntu,比如你登录的用户名是singularli,那么你的home路径一定是/home/singularli,你也可以用echo $HOME命令查看。

    所以,你会在你的家/home/singularli/.m2/repository 中找到存储所有 jar 的 maven 文件夹,现在你会在这里找到像 jackson-databindjackson-core 这样的 jar(这些在子目录中很少,因为它是根据包名保持的,下面给出的命令示例会让你对它有更多的了解。

    最后,一旦找到这些jars,您需要使用-cp 标志指定类路径,并将这些jar 包含在您的应用程序jar 中,如下所示:

    java -cp "target/httpclient-tutorial-1.0-SNAPSHOT.jar:/home/singularli/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.11.4/jackson-core-2.11.4.jar:/home/singularli/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.11.4/jackson-databind-2.11.4.jar:/home/singularli/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.11.4/jackson-annotations-2.11.4.jar" dev.danvega.Application
    

    它的工作方式应该与您在问题中提到的视频中显示的方式相同。

    请注意,您可能有不同的版本,即 com/fasterxml/jackson/core/jackson-annotations/2.11.4,我以 2.11.4 为例,您可以检查该项目中的版本并包括也就是说,如果存在不同的版本并且您包含其中任何一个,则可能会导致一些问题,因为该项目中使用的某些功能可能不存在于该版本中

    【讨论】:

    • 是的,同意,但是作者并没有说明他是想使用 maven 运行项目还是使用类或 jar,所以我假设他/她只是想使用从项目生成的 jar 文件运行。
    【解决方案3】:

    包含com/fasterxml/jackson/core/type/TypeReference的第三方依赖(可以在pom.xml中找到com.fasterxml.jackson.core:jackson-databind,编译时和运行时都需要。如果使用java命令运行,需要指定依赖在类路径上。但是由于您使用的是 Maven,为了方便起见,您可以使用一个 exec-maven-plugin 来在运行时处理类路径:

    mvn exec:java -Dexec.mainClass="dev.danvega.Application"
    

    您也可以在同一命令中编译然后运行:

    mvn package exec:java -Dexec.mainClass="dev.danvega.Application"
    

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多