我是jar文件和maven的新手,并试图理解maven的使用。在这篇5分钟Maven文章中,我们使用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程序以及如何运行编译后的Java程序(特别是在包内声明的程序)
如果在包hello
中有Java类Test
,可以使用javac helloTest.java
编译它,使用java hello.Test
运行它(即我们使用完全限定名运行程序,不能像java Test
那样运行它,它会给你错误"无法找到或加载主类test_;)
进入src/main/java/com/mycompany/app运行java App.java
不行但是在src/main/java文件夹下你可以运行com.mycompany.app.App
-
什么是jar打包。
jar
也就是说,Java归档文件只不过是一个压缩文件,聚合了所有Java类,以便它可以作为一个单元分发。 -
Classpath
Classpath是java查找编译类的地方 -
如何运行一个程序依赖于Java类在其他jar文件
,可以使用此命令。
假设如果我的测试类依赖于类XYZ是在Abc.jar文件,然后我们需要告诉Java在Abc.jar中搜索依赖项(在类路径中包含这个jar)。这可以使用命令java -cp abc.jar hello.Test
来完成,这里-cp
选项只是一个类路径,用于告诉java可以在哪些目录或存档中找到类。当Test类位于jar文件中时,例如 -
Maven
如果你已经理解了上面的事情,那么你就会知道Maven与运行你的程序无关。它只是一个构建工具,可以帮助您从代码中构建jar文件,并帮助执行/组织除构建之外的不同任务,如清理,运行测试等。
mvn package
Maven是java包管理工具之一。标记包,打包应用程序。它用于为项目声明深度,打包项目,构建项目,并将二进制文件安装到java进程可以读取的地方(~/.m2/xx/..)。
java -cp target/my-app-1.0-SNAPSHOT.jar
运行应用,调用应用的主类,-cp代表classPath
Maven不仅是一个打包工具,也是一个管理依赖关系的工具。
如果你的项目很简单,没有依赖/没有导入其他包,你可以"只去src/main/java/com/mycompany/app并运行java App.java
"。如果不是这样,你就不能做(试一试)
maven package
将导出/复制依赖项到target
文件夹,以便JDK可以找到所需的类,您可以轻松使用