为什么我应该在用maven包生成jar文件后运行java类?

qyyhg6bp  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(56)

我是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类。
我的理解是1.创建一个新的'target'目录,并在其中创建jar文件。我们使用2.使用jar文件运行App类。我的问题是,为什么我们以这种方式运行App类?为什么它比直接去src/main/java/com/mycompany/app编译并运行java App.java更好?也许我不明白打包的好处。谢谢你的帮助。

e5nszbig

e5nszbig1#

要想知道为什么,你需要先了解以下几点:
1.如何编译Java程序以及如何运行编译后的Java程序(特别是在包中声明的程序)
如果你在hello包中有java类Test,你可以使用javac hello\Test.java编译它,并使用java hello.Test运行它(即我们使用完全限定名来运行程序,不能像java Test那样运行它,它会给予你错误“找不到或加载主类Test”)
所以,只是转到src/main/java/com/mycompany/app并运行java App.java是行不通的,但是从src/main/java文件夹中,您可以像运行com.mycompany.app.App一样运行它
1.什么是罐 Package 。
jar即Java归档文件只不过是一个zip文件,它聚集了所有的Java类,这样它就可以作为一个单元分发。
1.类路径
类路径是Java查找已编译类的地方
1.如何运行依赖于其他jar文件中的Java类的程序
假设我的Test类依赖于abc.jar文件中的XYZ类,然后我们需要告诉java搜索这个abc.jar的依赖项(将此jar包含在类路径中)。这可以使用命令java -cp abc.jar hello.Test来完成,这里的-cp选项只是一个类路径,用于告诉java可以找到类的目录或存档。当测试类是在jar文件中,就像在您的情况中一样

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

xt0899hw2#

mvn package

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

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


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

oyjwcjzk

oyjwcjzk3#

Maven不仅是一个打包工具,也是一个管理依赖项的工具。
如果你的项目很简单,没有依赖关系/没有导入其他包,你可以“直接去src/main/java/com/mycompany/app运行java App.java“。如果不是这样,你不能这样做(试试)
maven package将依赖项导出/复制到target文件夹,以便JDK可以找到所需的类,您可以轻松使用它

相关问题