> 文档中心 > Java命令简易入门-3:javac与java命令之(java与jar)

Java命令简易入门-3:javac与java命令之(java与jar)


Java命令简易入门-3:javac与java命令之二(java与jar)

文章目录

  • Java命令简易入门-3:javac与java命令之二(java与jar)
    • 1. 实验环境与实验文件
    • 2. Java命令基本用法
      • 查看版本号与帮助
      • 执行java程序
      • 运行带命令行参数的java程序
    • 3. 执行jar文件
      • 执行jar文件
      • 打包可执行jar文件
    • 4. 类路径参数:-cp(-classpath)
      • 基本概念
      • 一个简单的例子
      • 所需使用的类在其他目录
      • 类文件在包(package)中
    • 5.调用jar包中的.class文件
    • 6. 执行模块中的类(待续)
    • 总结
    • 动动手

java命令是java程序的启动器,可以加载java主类、执行java程序。

1. 实验环境与实验文件

OS:Windows 10。
JDK:AdoptOpenJDK的jdk-11.0.8.10-hotspot

假设d:\test\目录下有SayHello.java,源代码如下:

public class SayHello {    public static void main(String[] args) { if (args.length <= 0) { //如命令行无参数,输出Hello!后退出     System.out.println("Hello!");     return; } System.out.print("Hello!"); String msg = String.join(", ", args);//将命令行参数用“, ”连接起来。 System.out.println(" "+msg+"!");    }}

该java源文件内包含一个主类SayHello。该程序可以处理从命令行给定的参数。

2. Java命令基本用法

查看版本号与帮助

查看版本号:java -version
查看帮助:java -help
在这里插入图片描述

执行java程序

用法1:执行某个.class文件中的主类。即,执行主类。
格式:java [options] [args…]
示例:java SayHello
说明:这里的SayHello是类名。当前目录下应有SayHello.class。[args…]是从命令行指定的参数。

用法2:直接执行某个.java源文件。即,执行单个源文件程序。
格式:java [options] [args]
示例:java SayHello.java
说明:这里SayHello.java是java源文件。这条命令将编译(javac)与执行(java)合二为一。
在这里插入图片描述

为了排除干扰,先将以前生成的SayHello.class删除,在进行操作。
注意:执行完java SayHello.java并不生成.class文件。

运行带命令行参数的java程序

示例:java SayHello Chen Lin Zhao
说明:这里Chen Lin Zhao作为参数传递给SayHello。Chen Lin Zhao被分割后放入String args[]供程序使用。
在这里插入图片描述

注意:为了确保当前目录下有相应的.class文件,所以我们先javac生成相应的.class文件

3. 执行jar文件

使用java命令还可执行可运行的.jar文件。

执行jar文件

格式:java [options] -jar [args…]
示例:java -jar SayHello.jar
在这里插入图片描述

jar文件本质上是一个压缩包文件,里面可以包含多个.class文件与程序所需的其他相关文件。
Java中常将编写好的程序(即.class文件文件)打包成jar,供他人使用。比如,数据库厂家将编写好的连接自家数据的java程序打包成jar文件。然后,你就可以利用该jar文件连接数据库。
在Java开发世界中大量使用jar文件分享程序。比如,你编写好的java程序包含有多个.class文件。如果想让别人使用这些程序,那么可以将这些文件打包到一个jar文件中并将该jar文件发送给他即可。

jar文件分为:可执行jar文件非可执行jar文件
非可执行jar文件:主要包含的是一些不包含主类的.class文件,别人如果在代码中需要调用你编写的类,就可以直接在你提供的jar文件的.class文件找。编程时需要用到的第三方库,经常以这种jar文件的形式提供。
可执行jar文件:是一个可独立运行的jar文件。你通过java -jar 某个jar文件就可执行该jar文件中的主类
注意:主类这个概念很重要,一般来说就是包含的public static void main(String[] args)方法的类,这个是程序执行的入口。.jar文件中可能会有多个包含main方法的类,因此需要指定某一个类为主类(即在jar文件中的MANIFEST.MF指定)。这样,java命令就知道启动时应该去执行哪个类的main方法了。
以下是一个MANIFEST.MF文件的内容:

Manifest-Version: 1.0Created-By: 11.0.8 (AdoptOpenJDK)Main-Class: SayHello

打包可执行jar文件

执行java -jar SayHello.jar首先需要有一个可执行的SayHello.jar文件。
我们可以通过命令行也可以通过IDE的相关功能生成相应的jar文件。这里演示通过命令行生成可执行jar文件。

打包命令:jar -cvfe SayHello.jar SayHello SayHello.class
说明:c代表创建jar文件, v代表输出详细信息,f代表生成的jar文件名, e代表执行应用程序入口点。
该命令中的SayHello代表主类。即,程序要执行时首先运行的类。其必须有public static void main(String[] args)方法。
SayHello.class代表jar文件中所需包含的.class文件。该例只打包了一个文件,实际上可以将整个程序目录中与其中的所有文件打包。
在这里插入图片描述

4. 类路径参数:-cp(-classpath)

基本概念

-cp参数指定了类的搜索路径(类路径)。运行一个java程序时需要使用其他的.class文件,如果这些文件在其他目录或jar文件中,java命令就可以在-cp参数所指定的路径中进行搜索。
先看看java命令中关于-cp的说明:
-cp ,使用 ; 分隔的, 用于搜索类文件的目录, JAR文件和 ZIP 档案列表。

一个简单的例子

java -cp . SayHello,代表在当前目录(.)中查找SayHello类。等同于java SayHello
在这里插入图片描述

所需使用的类在其他目录

D:\test\HelloWorldA.java中的HelloWorldA类中需要使用TestA类,而该类对应的的.class文件在**D:\testjava**

D:\test\HelloWorldA.java文件

public class HelloWorldA{    public static void main(String[] args) { TestA test = new TestA();  //该类在d:\testjava\TestA.java System.out.println("HelloWorld");    }}

d:\testjava\TestA.java文件

public class TestA{}

然后执行如下命令:

javac -cp .;d:\testjava\ HelloWorldA.javajava -cp .;d:\testjava\ HelloWorldA

第一条命令的-cp参数指的是,先在当前目录(.)下搜索编译所需的.class文件,如果找不到而只有相应的.java文件,那么将该.java编译成.class。如果即没找到.class文件又找不到对应的.java,再在d:\testjava\目录搜索。
第二条命令的-cp参数指的是,为了载入HelloWorldA这个类,需要依次在当前目录与d:\testjava\目录中搜索所需类(这里是TestA类)。
在这里插入图片描述

类文件在包(package)中

在java的编程规范中,类总是应该在某个包(package)中。
对上面的文件稍作改动,将HelloWorldB.java放入edu.jmu.hello包中,将TestB.java放入edu.hqu.test包中。同时,为了管理方便,将两个文件分别放入与其包名对应的目录结构中。

D:\test\edu\jmu\hello\HelloWorldB.java文件

package edu.jmu.hello;import edu.hqu.test.TestB;public class HelloWorldB{    public static void main(String[] args) { TestB test = new TestB(); System.out.println("HelloWorld");    }}

d:\testjava\edu\hqu\test\TestB.java文件

package edu.hqu.test;public class TestB{}

我们现在编译HelloWorldB.java,希望将其生成的.class文件放到D:\test\bin目录中,可使用如下命令。
javac -cp d:\testjava\ -d d:\test\bin\ D:\test\edu\jmu\hello\HelloWorldB.java
该命令编译D:\test\edu\jmu\hello\HelloWorldB.java,并在d:\testjava\下按照与包名对应的目录结构(edu.hqu.test对应edu\hqu\test\目录)寻找所需的类,如果没有则找到相应文件进行编译。最后将所生成的.class文件,按照包名对应的目录结构存放在d:\test\bin\目录下。现在
HelloWorldB.class存放在d:\test\bin\edu\jmu\hello\目录下
TestB.class存放在d:\test\bin\edu\hqu\test\目录下。
最后使用如下命令运行
java -cp d:\test\bin edu.jmu.hello.HelloWorldB
该命令从d:\test\bin开始搜索edu.jmu.hello.HelloWorldB类。其是按照对应的目录结构edu\jmu\hello\进行搜索的,找到了HelloWorldB.class。并且在edu\hqu\test\目录找到了所需的TestB.class。
在这里插入图片描述

5.调用jar包中的.class文件

现在将HelloWorldB.class与TestB.class及其对应的目录结构打包成d:\test\testclasses.jar。
注意:这两个.class文件均在d:\test\bin\相应的目录结构低下。
打包命令:jar -cvf d:/test/testclasses.jar -C d:/test/bin/ .
-C 参数的含义为"更改为指定的目录并包含"。即,转到D:\test\bin目录下,执行相应的jar命令。注意:最后那个.不能少。
在这里插入图片描述

注意:也可以直接到d:\test\bin目录下执行jar -cvf testclasses.jar edu进行打包。
该jar文件中实际上打包了edu/jmu/hello/HelloWorldB.class与edu/hqu/test/TestB.class。大家可以将该.jar文件打开(可使用Winrar或7-zip之类的软件)看看。
在这里插入图片描述

然后在任何目录下使用如下命令就可执行HelloWorldB。
java -cp d:\test\testclasses.jar edu.jmu.hello.HelloWorldB
该命令中java在-cp参数指定的d:\test\testclasses.jar中尝试加载edu.jmu.hello.HelloWorldB类。

在这里插入图片描述

6. 执行模块中的类(待续)

总结

  1. java命令可以用来执行java程序(.class文件)。java命令的功能是载入相应的类,所以命令中出现的是类名,而不是.class文件名。但会通过类名来找对应的.class文件。
  2. java命令所需寻找的.class文件可以可以直接在目录中,也可以在jar文件中。
  3. -cp参数指定java命令在指定路径搜索相应的.class文件。
  4. java命令中的类名参数是完全限定类名(带报名的类名)。寻找该类的时候也是按照与报名对应的目录结构进行查找。

动动手

为了便于管理代码文件(.java)与字节码文件(.class)文件,决定将这些文件统一存放在一个项目文件夹 d:\learnjava\中。将所有.java文件存放在项目文件夹下的src目录,所有.class文件存放在bin目录。文件可使用上面的HelloWorldB.java与TestB.java。

现在假设你在d:\learnjava\目录下,依次输入什么命令才能:

  1. 将.java文件编译成.class文件放到bin\目录下。
  2. 执行HelloWorldB。
  3. 将所有.class文件打包成classess.jar放入d:\learnjava\jar\目录下。
  4. 执行classess.jar中的HelloWorldB.
  5. 将TestB打成非可执行jar包,然后使用该jar包,编译并运行HelloWorldB。

完成的小伙伴,把你的截图和命令以回帖的形式贴上来吧。