阅读目录
Java JDK 安装
PATH
CLASSPATH
小结
javac 命令
java 命令
小结
生成 jar 包
一, Java JDK 安装
1)JDK 在安装的过程中会出现两次安装提示, 第 1 次是安装 JDK , 第 2 次是安装 JRE. 我把 JDK 安装在 D:\Java\jdk\ 这个路径下, 把 JRE 安装在 D:\Java\jre\ 这个路径下
2) 在配置 PAHT 和 CLASSPATH 的值时, 是对 JDK 安装路径的配置, 与 JRE 安装路径无关 (当然这只是一般情况下)
[ 返回顶部 ]
二, PATH
1) PATH 要配置的路径是:;D:\Java\jdk\bin;D:\Java\jdk\jre\bin(这里配置了两个路径, 英文分号是每个路径的分隔符). 通常我们会增加一个变量 JAVA_HOME, 它的值配置为: D:\Java\jdk(注意这里不用分号开头, 也不用分号结尾), 因此 PATH 的值通常配置为:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
2) 添加 JAVA_HOME 变量的好处: 当我重新安装 JDK 的时候, 如果我想改变 JDK 的安装路径为 E:\Java\jdk\ , 当我没有配置 JAVA_HOME 时, 我必须一个一个地去更改 PATH 的值, 比如改为 ;E:\Java\jdk\bin;E:\Java\jre\bin , 但是如果我有配置 JAVA_HOME 的值, 那我只需更改 JAVA_HOME 的值为 E:\Java\jdk 就行了, PATH 的值可以保持不变
3) 配置 PATH 环境变量的作用: 我们用命令行编译运行 Java 程序时, 会经常用到 java 和 javac 这两个命令, 当我们还没设定 PATH 的值的时候, 这两个命令是没办法在命令行的任意文件目录下执行的, 那么配置 PATH 值就是为了让这两个命令可以执行
4)java 和 javac 命令的工作原理: 我们到 jdk 的安装路径下可以看到有一个 bin 文件夹, 进入 bin 文件夹里面会发现 java 和 javac 就在这里. java 和 javac 都是 .exe 程序, 在命令行中如果想要执行 .exe 程序, 那么必须要从命令行进入到放置 .exe 程序的目录下, 我们可以在命令行中输入 cd /d D:\Java\jdk\bin 命令, 然后命令行会进入 bin 文件目录下, 这时, 即使我们没有配置 PATH 的值, 也可以执行 java 和 javac 命令, 可以在命令行输入 java -version 命令试试. 但是如果我们想在命令行的任何目录下都能执行 java 和 javac 命令那该怎么办呢? 显然, 要配置 PATH 的值. 当我们执行 java 命令时, 系统首先会在当前目录下寻找是否有 java.exe 程序, 有, 那么就执行, 没有, 那么就会去 PATH 里面寻找, 所以, 当我们配置好 PATH 之后, 在任何目录下执行 java 和 javac 都会生效
[ 返回顶部 ]
三, CLASSPATH
1)CLASSPATH 的值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(这里配置了 3 个路径, 其中 . 符号表示本地路径, 其他两个路径都可以在 JDK 的安装路径下面找到)
2) 配置 CLASSPATH 的作用: 寻找 .class 文件. 例如: 如果我有个 Java 程序在 E:\Example\ 路径下, 文件名称为 Test.java . 要编译程序, 那首先要将命令行切换到 E:\Example\ 目录 (在命令行处输入命令 cd /d E:\Example\), 然后执行 javac Test.java 命令将 .java 文件编译成 .class 文件. 没有配置 CLASSPATH 时: 我们可以直接在命令行的 E:\Example\ 目录下执行 java Test 命令, 能够执行成功的原因是在没有配置 CLASSPATH 时, 系统会默认在本地目录下寻找编译后的 Test.class 文件. 有配置 CLASSPATH 时: 假如我随便在 CLASSPATH 中添加一个路径 F:\; , 那么系统便不会默认在本地目录下寻找, 这时我们也想要在命令行的 E:\Example\ 目录下执行 java Test 命令, 则 CLASSPATH 应该配置成 .;F:\;( . 符号就表示本地目录)
3) 再举个例子: 我的 CLASSPATH 已经配置成: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar , 现在我将编译好的 Test.class 文件放在 D:\ExampleClass\ 路径下, 那么我想要在命令行中执行 java Test 命令要怎么办呢? 有两种方法, 第一种方法: 我将命令行切换到 D:\ExampleClass\ 目录下, 然后可以直接执行 java Test 命令 (因为 CLASSPATH 配置了 . 符号, 能在本地目录下寻找 Test.class 文件). 第二种方法: 将 D:\ExampleClass\ 路径添加到 CLASSPATH 中, 即 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;D:\ExampleClass , 这时我们就可以在命令行中的任何目录下执行 java Test
[ 返回顶部 ]
四, 小结
1) 配置 PATH 是为了使 java 和 javac 命令能在命令行的任何目录下执行
2) 配置 CLASSPATH 是为了执行 java Test 命令时, 能够找到 Test.class 文件
3)PATH 和 CLASSPATH 的配置都与 JDK 的安装路径有关, 与 JRE 的安装路径无关 (当然这只是一般情况下)
4) 向 CLASSPATH 添加指定路径之后可以使 java Test 在命令行的任何目录下执行; 使用绝对路径可以使 javac E:\Example\Test.java 在命令行的任何目录下执行
[ 返回顶部 ]
五, javac 命令
格式: javac [options] [source files]
常用的 options 有:
-d < 目录 > , 该选项用于编译时将 .class 和 .java 文件分开存放
-sourcepath < 路径 > , 该选项用于编译时指定 .java 文件的位置
-classpath < 路径 > , 该选项用于编译时指定 .class 文件的位置
用法
无 options
假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件.
例如: javac D:\sources\Test.java , 可以在命令行的任何目录下输入该命令, 编译后, 系统默认会在 D:\sources\ 路径下生成 Test.class 文件
-d < 目录 >(使用该选项之前要先在计算机中建立目录)
假设 D:\sources\ 路径下有一个文件名为 Test.java 的文件.
例如: javac -d E:\myclasses D:\sources\Test.java , 可以在命令行的任何目录下输入该命令, 编译后, 系统会在 E:\myclasses\ 路径下生成 Test.class 文件 (注意: 必须要先在计算机中建立 E:\myclasses\ 路径)
-sourcepath < 路径 >
例 1(.java 文件在同一个包下):
- // 假设该文件位于 E:\com\example\ 路径下, 文件名为 Fruits.java
- package com.example;
- public class Fruits{
- @Override
- public String toString(){
- return "Fruits";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- public class Test{
- public static void main(String[] args){
- System.out.println(new Fruits()); // 引用 Fruits 对象
- }
- }
程序:
两个 .java 文件位于同一个包下 (因为都是 package com.example)
Test 引用了 Fruits 对象
编译 Test.java 文件的方法:(要先在计算机中建立 D:\classes\ 路径)
第一种方法: 将命令行切换到 D:\sources\ 目录下, 然后执行 javac -sourcepath E:\ -d D:\classes Test.java
第二种方法: 在命令行的任意目录下, 执行 javac -sourcepath E:\ -d D:\classes D:\sources\Test.java 命令
第三种方法: 向计算机环境变量 CLASSPATH 中添加 ;E:\ 然后在命令行的任意目录下执行 javac -d D:\classes D:\sources\Test.java
运行 Test.class:
将命令行切换到 D:\classes\ 目录下, 然后执行 java com.example.Test
例 2(.java 文件在不同的包下):
- // 假设该文件位于 E:\hzl\net\example\ 路径下, 文件名为 Person.java
- package net.example;
- public class Person{
- @Override
- public String toString(){
- return "Person";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- import net.example.Person; // 要导入包
- public class Test{
- public static void main(String[] args){
- System.out.println(new Person()); // 引用 Person 对象
- }
- }
程序:
两个 .java 文件位于不同的包 (package net.example; 和 package com.example;)
Test 引用了 Person 对象
编译 Test.java 文件的方法:(首先要在计算机中建立 D:\yourclasses\ 路径)
第一种方法: 将命令行切换到 D:\sources\ 目录下, 然后执行 javac -sourcepath E:\hzl -d D:\yourclasses Test.java 命令 (注意: 如果我将 Person.java 中的包名改为 package hzl.net.example; 那么 Test.java 中的 import 应该改为 import hzl.net.example.Person; 要执行的编译命令应该为 javac -sourcepath E:\ -d D:\yourclasses Test.java)
第二种方法: 在命令行的任意目录下执行 javac -sourcepath E:\hzl -d D:\yourclasses D:\sources\Test.java
第三种方法: 向计算机环境变量 CLASSPATH 中添加 ;E:\hzl 然后在命令行任意目录下执行 javac -d D:\yourclasses D:\sources\Test.java
运行 Test.class:
将命令行切换到 D:\yourclasses\ 目录下, 然后执行 java com.example.Test
例 3(-sourcepath 的本质):
执行包含该选项的命令时, 系统会将指定的 < 路径 > 暂时覆盖掉 CLASSPATH 中的路径
- // 假设该文件位于 E:\net\example\ 路径下, 文件名为 Man.java
- package net.example;
- public class Man{
- @Override
- public String toString(){
- return "Man";
- }
- }
- // 假设该文件位于 F:\cn\example\ 路径下, 文件名为 Woman.java
- package cn.example;
- public class Woman{
- @Override
- public String toString(){
- return "Woman";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- import net.example.Man;
- import cn.example.Woman;
- public class Test{
- public static void main(String[] args){
- System.out.println(new Man()); // 引用 Man 对象
- System.out.println(new Woman()); // 引用 Woman 对象
- }
- }
程序:
有三个 .java 文件位于不同的包
Test 引用了 Man 和 Woman 对象
1, 还没配置 CLASSPATH 时:
编译:(首先要在计算机中建立 D:\myclasses\ 路径)
在命令行的任何目录下执行 javac -sourcepath E:\;F:\ -d D:\myclasses D:\sources\Test.java
运行:
将命令行切换到 D:\myclasses\ 目录下, 然后执行 java com.example.Test
2,CLASSPATH 的值配置为 .;E:\ (. 符号表示本地目录, E:\ 是存放 Man.java 文件的路径):
编译:
在命令行的任何目录下执行 javac -sourcepath F:\ -d D:\myclasses D:\sources\Test.java(编译不能通过, 虽然说已经将 Man.java 的路径配置到了 CLASSPATH 中, 但是程序还是找不到 Man.java , 这是因为在指定 -sourcepath 的 < 路径 > 时, 该路径会暂时覆盖掉 CLASSPATH 中的值)
3, 想让编译通过:
第一种方法: 将 E:\ 和 F:\ 都配置到 CLASSPATH 中, 即 CLASSPATH 的值为 .;E:\;F:\ , 然后在命令行的任何目录下执行 javac -d D:\myclasses D:\sources\Test.java
第二种方法: 不管 CLASSPATH 的值是什么, 直接在命令行的任何目录下执行 javac -sourcepath E:\;F:\ -d D:\myclasses D:\sources\Test.java
-classpath < 路径 >
同样, 执行包含该选项的命令时, 系统会将指定的 < 路径 > 暂时覆盖掉 CLASSPATH 中的路径
-sourcepath 能实现的功能,-classpath 同样能实现, 但是 -classpath 能实现的功能,-sourcepath 不一定能实现, 例如:
很多时候, 我们只有 .class 文件或者只有由 .class 文件组成的 jar 包, 那么我们在编译程序的时候就不能用 -sourcepath 而是要用 -classpath 来指定路径, 使程序能编译通过
- // 假设该文件位于 D:\cn\example\ 路径下, 文件名为 Animals.java
- // 假设我已经将它编译成 Animals.class 文件, 并且将它放在 F:\cn\example\ 路径下
- package cn.example;
- public class Animals{
- @Override
- public String toString(){
- return "Animals";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- import cn.example.Animals; // 导入包
- public class Test{
- public static void main(String[] args){
- System.out.println(new Animals()); // 引用 Animals 对象
- }
- }
程序:
假如我现在只有 Animals.class 文件, 没有 Animals.java 文件 (Animals.class 文件位于 F:\cn\example\ 路径下)
Test 类引用了 Apple 对象
编译 Test.java 文件的方法:(首先要在计算机中建立 D:\myclasses\ 路径)
在命令行的任何目录下运行 javac -classpath F:\ -d D:\myclasses D:\sources\Test.java(其中 -classpath 指定了 Apple.class 的路径)
运行 Test.class:
在命令行的任何目录下执行 java -classpath D:\myclasses;E:\ com.example.Test
[ 返回顶部 ]
六, java 命令
格式: java [options] [class files]
常用的 options 有:
-classpath < 路径 >
用法
-classpath < 路径 >
例 1:
- // 假设该文件位于 D:\cn\example\ 路径下, 文件名为 Animals.java
- // 假设我已经将它编译成 Animals.class 文件, 并且将它放在 F:\cn\example\ 路径下
- package cn.example;
- public class Animals{
- @Override
- public String toString(){
- return "Animals";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- import cn.example.Animals; // 导入包
- public class Test{
- public static void main(String[] args){
- System.out.println(new Animals()); // 引用 Animals 对象
- }
- }
编译:
在命令行的任何目录下执行 javac -classpath F:\ -d D:\myclasses D:\sources\Test.java
运行:
在命令行的任何目录下执行 java -classpath D:\myclasses;F:\ com.example.Test
例 2:
执行包含该选项的命令时, 系统也会将指定的 < 路径 > 暂时覆盖掉 CLASSPATH 中的路径
- // 假设该文件位于 D:\sources 路径下, 文件名为 Test.java
- package com.example;
- public class Test{
- public static void main(String[] args){
- System.out.println("Hello World !");
- }
- }
1, 没有配置 CLASSPATH 的值时:
编译:
在命令行的任何目录下执行 javac -d D:\myclasses D:\sources\Test.java
运行:
将命令行切换到 D:\myclasses\ 目录下, 然后执行 java -classpath . com.example.Test(-classpath 中的 < 路径 > 为 . 符号, 表示指定了本地目录)
2, 将 CLASSPATH 的值配置成 . 符号
编译:
在命令行的任何目录下执行 javac -d D:\myclasses D:\sources\Test.java
运行:
将命令行切换到 D:\myclasses\ 目录下, 然后执行 java -classpath E:\ com.example.Test(运行时会找不到 Test.class 文件, 因为我将 -classpath 中的 < 路径 > 指定为 E:\ , 它会暂时覆盖掉 CLASSPATH 中的值)
[ 返回顶部 ]
七, 小结
1)javac
-sourcepath 和 -classpath 都和 CLASSPATH 有关
如果指定 -sourcepath 或者 -classpath , 那么他们的 < 路径 > 会暂时覆盖掉 CLASSPATH 中的值
如果不指定 -sourcepath 或者 -classpath , 那么在编译程序时, 系统会自动到 CLASSPATH 中寻找相应的路径
2)java
-classpath 也和 CLASSPATH 有关
如果指定 -classpath , 那么它的 < 路径 > 会暂时覆盖掉 CLASSPATH 中的值
如果不指定 -classpath , 那么在运行程序时, 系统会自动到 CLASSPATH 中寻找相应的路径
3) 程序编译和运行的步骤
- // 假设该文件位于 E:\net\example\ 路径下, 文件名为 Person.java
- package net.example;
- public class Person{
- @Override
- public String toString(){
- return "Person";
- }
- }
- // 假设该文件位于 D:\sources\ 路径下, 文件名为 Test.java
- package com.example;
- import net.example.Person;
- public class Test{
- public static void main(String[] args){
- System.out.println(new Person()); // 引用 Person 对象
- }
- }
编译:
在命令行的任何目录下执行 javac -sourcepath E:\ -d D:\myclasses D:\sources\Test.java
编译时, 系统首先根据上面的命令找到 D:\sources\ 目录下的 Test.java 文件, 这是一个包含主类的 .java 文件
然后根据 -sourcepath E:\ 和 Test.java 文件中的 import net.example.Person; 语句找到 E:\net\example\ 路径下有 package net.example; 语句的 Person.java 文件 (没有指定 -sourcepath 时, 系统会去 CLASSPATH 中寻找, 其实指定 -sourcepath 时, 系统也是去 CLASSPATH 中寻找, 因为 -sourcepath 的作用是暂时覆盖掉 CLASSPATH 的值)
最后将编译好的 .class 文件存放在 D:\myclasses\ 路径下
整个过程: 包含主类的 .java 文件 --> CLASSPATH --> import 语句 --> 找到含有相应 package 语句的 .java 文件
运行:
在命令行的任何目录下执行 java -classpath D:\myclasses com.example.Test
运行时, 系统会根据 -classpath D:\myclasses 和 com.example.Test 找到 D:\myclasses\com\example\ 路径下的 Test.class
然后根据 -classpath D:\myclasses 和 import net.example.Person; 语句找到 D:\myclasses\net\example\ 路径下有 package net.example; 语句的 Person.class
[ 返回顶部 ]
八, 生成 jar 包
1) 假设计算机中有一个 D:\classes\ 路径, 该路径下有 a.class ,b.class 和 c.class 三个文件
2) 将命令行切换到 D:\classes\ 目录下, 然后执行 jar -cvf Test.jar *.class
3) 查看 D:\classes\ 路径, 会发现生成了一个 Test.jar 文件, 这个文件中就包含了 a.class ,b.class 和 c.class 三个文件
[ 返回顶部 ]
End~
来源: http://www.bubuko.com/infodetail-2551499.html