我对 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程序以及如何运行编译后的Java程序(特别是在包内声明的程序)
如果你在包
Test
中有java类hello
,你可以使用javac hello\Test.java
编译它并使用java hello.Test
运行它(即我们使用完全限定名称来运行程序并且不能像java Test
那样运行它,它会给你错误“无法找到或加载主类测试”)
java App.java
是行不通的,但是从 src/main/java 文件夹中你可以像 com.mycompany.app.App
一样运行它
什么是罐式包装。
jar
即 Java 存档只不过是一个聚集了所有 Java 类的 zip 文件,以便可以将其作为一个单元进行分发。 类路径
类路径是java查找编译后的类的地方
如何运行依赖于其他jar文件中的Java类的程序
假设我的测试类是否依赖于 XYZ 类,该类位于
abc.jar 文件,那么我们需要告诉 java 搜索这个 abc.jar
依赖项(将此 jar 包含在类路径中)。这可以使用命令
java -cp abc.jar hello.Test
来完成,这里 -cp
选项只不过是一个类路径,用于告诉 java 可以在其中找到类的目录或档案。当测试类位于 jar 文件内(就像您的情况一样)时,可以使用此命令
Maven
如果您理解了上述内容,那么您就会知道 Maven 与运行您的程序无关。它只是一个构建工具,可以帮助您从代码构建 jar 文件,并帮助执行/组织除了构建之外的不同任务,例如清理、运行测试等。
mvn package
Maven是java的包管理工具之一..flag package,打包app。它用于声明项目的 deps、打包项目、构建项目并将二进制文件安装到 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 可以找到所需的类,您可以轻松使用它