为什么用maven包生成jar文件后要运行java类?

问题描述 投票:0回答:3

我对 jar 文件和 Maven 很陌生,并试图了解 Maven 的使用。 在这篇 Maven in 5 分钟 文章中,我们使用 maven 创建 my-app 项目,目录结构如下所示:

my-app
|-- pom.xml
 -- src
    |-- main
    |   -- java
    |       -- com
    |           -- mycompany
    |               -- app
    |                   -- App.java
     -- test
         -- java
             -- com
                 -- mycompany
                     -- app
                         -- AppTest.java

然后我们使用 1.

mvn package
,然后使用 2.
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
来运行我们的 App.java 类。

我的理解是1.创建一个新的“目标”目录并在其中放置jar文件。我们使用2.使用jar文件来运行App类。我的问题是,为什么我们要这样运行App类?为什么它比直接进入 src/main/java/com/mycompany/app 编译并运行

java App.java
更好?也许我不明白包装的好处。感谢您的帮助。

java maven packaging
3个回答
2
投票

要知道“为什么”的答案,你需要先了解以下几点:

  1. 如何编译Java程序以及如何运行编译后的Java程序(特别是在包内声明的程序)
    如果你在包

    Test
    中有java类
    hello
    ,你可以使用
    javac hello\Test.java
    编译它并使用
    java hello.Test
    运行它(即我们使用完全限定名称来运行程序并且不能像
    java Test
    那样运行它,它会给你错误“无法找到或加载主类测试”)
    所以,仅仅进入 src/main/java/com/mycompany/app 并运行
    java App.java
    是行不通的,但是从 src/main/java 文件夹中你可以像
    com.mycompany.app.App

    一样运行它
  2. 什么是罐式包装。

    jar
    即 Java 存档只不过是一个聚集了所有 Java 类的 zip 文件,以便可以将其作为一个单元进行分发。

  3. 类路径
    类路径是java查找编译后的类的地方

  4. 如何运行依赖于其他jar文件中的Java类的程序
    假设我的测试类是否依赖于 XYZ 类,该类位于 abc.jar 文件,那么我们需要告诉 java 搜索这个 abc.jar 依赖项(将此 jar 包含在类路径中)。这可以使用命令

    java -cp abc.jar hello.Test
    来完成,这里
    -cp
    选项只不过是一个类路径,用于告诉 java 可以在其中找到类的目录或档案。当测试类位于 jar 文件内(就像您的情况一样)时,可以使用此命令

  5. Maven
    如果您理解了上述内容,那么您就会知道 Maven 与运行您的程序无关。它只是一个构建工具,可以帮助您从代码构建 jar 文件,并帮助执行/组织除了构建之外的不同任务,例如清理、运行测试等。


0
投票
mvn package

Maven是java的包管理工具之一..flag package,打包app。它用于声明项目的 deps、打包项目、构建项目并将二进制文件安装到 java 进程可以读取的位置(~/.m2/xx/..)。

java -cp target/my-app-1.0-SNAPSHOT.jar 

运行应用程序,调用应用程序的主类,-cp代表classPath


0
投票

Maven 不仅仅是一个打包工具,还可以管理依赖关系。

如果您的项目很简单,没有依赖项/没有导入其他包,您可以“只需转到 src/main/java/com/mycompany/app 并运行

java App.java
”。如果不是这样的话,你就做不到(试试吧)

maven package
将导出/复制依赖项到
target
文件夹,以便 JDK 可以找到所需的类,您可以轻松使用它

© www.soinside.com 2019 - 2024. All rights reserved.