Java 筆記 —— java 和 javac

Java 筆記 —— java 和 javac

1、Java JDK 安裝

1)JDK 在安裝的過程當中會出現兩次安裝提示,第 1 次是安裝 JDK ,第 2 次是安裝 JRE。我把 JDK 安裝在 D:\Java\jdk\ 這個路徑下,把 JRE 安裝在 D:\Java\jre\ 這個路徑下

2)在配置 PAHT 和 CLASSPATH 的值時,是對 JDK 安裝路徑的配置,與 JRE 安裝路徑無關(固然這只是通常狀況下) java


[ 返回頂部 ]ide



2、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 都會生效 ui


[ 返回頂部 ]spa



3、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 .net


[ 返回頂部 ]命令行



4、小結

1)配置 PATH 是爲了使 java 和 javac 命令能在命令行的任何目錄下執行

2)配置 CLASSPATH 是爲了執行 java   Test 命令時,可以找到 Test.class 文件

3)PATH 和 CLASSPATH 的配置都與 JDK 的安裝路徑有關,與 JRE 的安裝路徑無關(固然這只是通常狀況下)

4)向 CLASSPATH 添加指定路徑以後可使 java   Test 在命令行的任何目錄下執行;使用絕對路徑可使 javac   E:\Example\Test.java 在命令行的任何目錄下執行 設計


[ 返回頂部 ]code



5、javac 命令

  1. 格式:javac [options] [source files]
  2. 經常使用的 options 有:
    • -d   <目錄> ,該選項用於編譯時將 .class 和 .java 文件分開存放
    • -sourcepath   <路徑> ,該選項用於編譯時指定 .java 文件的位置
    • -classpath   <路徑> ,該選項用於編譯時指定 .class 文件的位置
  3. 用法

無 options對象

假設 D:\sources\ 路徑下有一個文件名爲 Test.java 的文件。

例如:javac   D:\sources\Test.java ,能夠在命令行的任何目錄下輸入該命令,編譯後,系統默認會在 D:\sources\ 路徑下生成 Test.class 文件 it

-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 對象

一、還沒配置 CLASSPATH 時:

編譯:(首先要在計算機中創建 D:\myclasses\ 路徑)

  • 在命令行的任何目錄下執行 javac   -sourcepath   E:\;F:\   -d   D:\myclasses   D:\sources\Test.java

運行:

  • 將命令行切換到 D:\myclasses\ 目錄下,而後執行 java   com.example.Test

二、CLASSPATH 的值配置爲 .;E:\ (. 符號表示本地目錄,E:\ 是存放 Man.java 文件的路徑):

編譯:

  • 在命令行的任何目錄下執行 javac   -sourcepath   F:\   -d   D:\myclasses   D:\sources\Test.java(編譯不能經過,雖說已經將 Man.java 的路徑配置到了 CLASSPATH 中,可是程序仍是找不到 Man.java ,這是由於在指定 -sourcepath 的 <路徑> 時,該路徑會暫時覆蓋掉 CLASSPATH 中的值)

三、想讓編譯經過:

  • 第一種方法:將 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

6、java 命令

  1. 格式:java   [options]   [class files]
  2. 經常使用的 options 有:
    • -classpath   <路徑>
  3. 用法

-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 !");
	}
}

一、沒有配置 CLASSPATH 的值時:

編譯:

  • 在命令行的任何目錄下執行 javac   -d   D:\myclasses   D:\sources\Test.java

運行:

  • 將命令行切換到 D:\myclasses\ 目錄下,而後執行 java   -classpath   .   com.example.Test(-classpath 中的 <路徑> 爲 . 符號,表示指定了本地目錄)

二、將 CLASSPATH 的值配置成 . 符號

編譯:

  • 在命令行的任何目錄下執行 javac   -d   D:\myclasses   D:\sources\Test.java

運行:

  • 將命令行切換到 D:\myclasses\ 目錄下,而後執行 java   -classpath   E:\   com.example.Test(運行時會找不到 Test.class 文件,由於我將 -classpath 中的 <路徑> 指定爲 E:\ ,它會暫時覆蓋掉 CLASSPATH 中的值)

7、小結

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

8、生成 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~

相關文章
相關標籤/搜索