Java命令简易入门-3:javac与java命令之二(java与jar)
文章目录
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 <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.0
Created-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 <目录和 zip/jar 文件的类搜索路径>,使用 ; 分隔的, 用于搜索类文件的目录, 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.java
java -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. 执行模块中的类(待续)
总结
- java命令可以用来执行java程序(.class文件)。java命令的功能是载入相应的类,所以命令中出现的是类名,而不是.class文件名。但会通过类名来找对应的.class文件。
- java命令所需寻找的.class文件可以可以直接在目录中,也可以在jar文件中。
- -cp参数指定java命令在指定路径搜索相应的.class文件。
- java命令中的类名参数是完全限定类名(带报名的类名)。寻找该类的时候也是按照与报名对应的目录结构进行查找。
动动手
为了便于管理代码文件(.java)与字节码文件(.class)文件,决定将这些文件统一存放在一个项目文件夹 d:\learnjava\中。将所有.java文件存放在项目文件夹下的src目录,所有.class文件存放在bin目录。文件可使用上面的HelloWorldB.java与TestB.java。
现在假设你在d:\learnjava\目录下,依次输入什么命令才能:
- 将.java文件编译成.class文件放到bin\目录下。
- 执行HelloWorldB。
- 将所有.class文件打包成classess.jar放入d:\learnjava\jar\目录下。
- 执行classess.jar中的HelloWorldB.
- 将TestB打成非可执行jar包,然后使用该jar包,编译并运行HelloWorldB。
完成的小伙伴,把你的截图和命令以回帖的形式贴上来吧。