为什么用maven包生成jar文件后还要运行一个javaclass?

Why should I run a java class after generating jar file with maven package?

我是 jar 文件和 maven 的新手,正在尝试了解 Maven 的使用。 在这篇 Maven in 5 minutes 文章中,我们使用 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 class.

我的理解是 1. 创建一个新的 'target' 目录并在其中放置 jar 文件。并且我们使用 2. to 运行 App class 使用 jar 文件。我的问题是,为什么我们 运行 App class 是这样的?为什么它比去 src/main/java/com/mycompany/app 和 运行ning java App.java 更好?也许我不明白包装的好处。感谢您的帮助。

mvn package

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

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

运行应用程序,调用应用程序的main class,-cp代表classPath

Maven 不仅是一个打包工具,也是管理依赖项的工具。

如果您的项目很简单,没有 dependency/no 导入其他包,您可以“只去 src/main/java/com/mycompany/app 和 运行 java App.java”。如果不是这样,你做不到(试试看)

maven package 将 export/copy 依赖项添加到 target 文件夹,以便 JDK 可以找到所需的 类 并且您可以轻松使用它

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

  1. 如何编译 Java 程序以及如何 运行 已编译的 java 程序(尤其是在包内声明的程序)
    如果包 hello 中有 java class Test,则可以使用 javac hello\Test.java 编译它,使用 java hello.Test 运行 编译它(也就是说,我们使用 运行 程序的完全限定名称,不能像 java Test 那样 运行,它会给你错误“找不到或加载主 class 测试”)
    所以,只是去 src/main/java/com/mycompany/app 和 运行ning java App.java 是行不通的,但是从 src/main/java 文件夹你可以 运行 就像 com.mycompany.app.App

  2. 什么是jar包
    jar 即 Java 存档只是一个 zip 文件,聚合了所有 java classes 以便它可以作为一个单元分发。

  3. 类路径
    类路径是 java 将查找已编译的 classes

    的地方
  4. 如何 运行 依赖于 Java class 其他 jar 文件中的程序
    假设我的测试 class 取决于 class XYZ,它位于 abc.jar 文件,那么我们需要告诉 java 在这个 abc.jar 中搜索 依赖项(将此 jar 包含在 classpath 中)。这可以使用命令 java -cp abc.jar hello.Test 来完成,这里 -cp 选项只是一个 class 路径,用于告诉 java 关于 classes 的目录或档案可以找到。当测试 class 在 jar 文件中时可以使用此命令,就像您的情况

  5. Maven
    如果你已经理解了上面的事情,那么你就会知道 Maven 与 运行ning 你的程序无关。它只是一个构建工具,可帮助从您的代码构建 jar 文件,并有助于 executing/organizing 除了构建之外的不同任务,如清理、运行 宁测试等