E N D
第九章 Package包裹與 Jar檔案 課前指引 當Java程式編輯完成後,執行程式編譯,編譯完成後,我們將發現程式中的每一類別都各自譯成一個xxx.class檔。如果一個目錄內有兩個檔案,編譯後將各自產生許多class檔,散落間插各處,分不清那個class檔是屬於那一檔案,不易管理亦不易儲存。Java於程式設計時,可依需要設定package包裹,將一個Java程式、或多個功能相同的Java程式,歸置於一個包裹內,同一包裹內的類別在編譯完成後,歸置於同一目錄內,如此既易管理亦易儲存。為了增加可攜性,Java更可將package包裹壓縮成jar檔案,因jar檔案本身就是眾多class檔的集合,故可立即用於執行。
章節大綱 9-1 簡介 9-6 壓縮檔案 9-2 類別檔案 9-7 jar檔與class檔之加入 9-3 單一檔案包裹 9-8 使用jar檔 9-4 多檔案包裹 9-9 SCJP常考關鍵 9-5 包裹匯入 備註:可依進度點選小節
9-1 簡介 • 當Java程式編輯完成後,執行程式編譯,編譯完成後,我們將發現程式中的每一類別都各自譯成一個xxx.class檔。如果一個目錄內有兩個檔案,編譯後將各自產生許多class檔,散落間插各處,分不清那個class檔是屬於那一檔案,不易管理亦不易儲存。
9-1 簡介 • Java於程式設計時,可依需要設定package包裹,將一個Java程式、或多個功能相同的Java程式,歸置於一個包裹內,同一包裹內的類別在編譯完成後,歸置於同一目錄內,如此既易管理亦易儲存。 • 為了增加可攜性,Java更可將package包裹壓縮成jar檔案,因jar檔案本身就是眾多class檔的集合,故可立即用於執行。
9-2 類別檔案 • 當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案,如前述,如此每一個class檔案就是一個物件。 • 在Java程式檔案諸多class類別中,僅允許其中具有代表性的主體類別前置 “public”,用於爾後置入包裹之後,可讓其他程式取用此包裹。
9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 01 public class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_1 {
9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 12 public static void main(String[] args) { 13 E a = new E(); 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber,前置public。 列10 為類別class E。 列11~17 為類別class Ex9_1,前置public。 討論事項: 在Java程式檔案諸多class類別中,僅允許其中主體類別可前置public。本例列01之class MyNumber與列11之class Ex9_1都前置public,將發生編譯錯誤。
9-2 類別檔案 • 範例9_1:設有檔案Ex9_1.java,解釋在Java程式諸多class類別中,僅允許其中主體類別可前置public。 編譯錯誤:
9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 01 class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_2 { 12 public static void main(String[] args) { 13 E a = new E();
9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber。 列10 為類別class E。 列11~17 為類別public class Ex9_2,也是程式中唯一前置public之類別。
9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 程式編譯與執行: 鍵入javac Ex9_2.java編譯之,產生Ex9_2.class、MyNumber.class、E.class等檔案。 鍵入java Ex9_2 執行之。
9-2 類別檔案 • 範例9_2:設有檔案Ex9_2.java,解釋當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案。 討論事項: (1) 當Java程式經過編譯後,程式內的每一類別都將各自產生一個xxx.class檔案,如前述,如此之每一個class檔案就是一個物件。本例產生E.class、Ex9_2.class、MyNumber.class三個類別檔案。 (2) 本例程式執行結果為 a= 5。
9-3 單一檔案包裹 • (1) 檢視檔案內之類別程序,只允許其中一個可前置修飾子public,否則將發生編譯錯誤。 • (2) 於程式檔案內的第一列鍵入 “package yyy” 即完成設定,其中yyy為包裹名稱。
9-3 單一檔案包裹 • (3) 執行程式編譯時,於Dos視窗鍵入 “javac -d . zzz.java”,其中 “-d ” 為建立目錄、句點 “.” 為指向目前程式檔所在之目錄、“zzz.java” 為程式檔名稱。 • (4) 編譯完成後,將產生目錄yyy,該程式檔案產生的所有class檔,均自動歸納入目錄yyy內。於Dos視窗鍵入 “java yyy/zzz” 執行之,其中zzz為主體類別。
9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {}
9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 12 public class Ex9_3 { 13 public static void main(String[] args) { 14 E a = new E(); 15 a.setNumber(5); 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 package為關鍵字,myPackage為包裹名稱。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~18 為類別public class Ex9_3,也是程式中唯一前置public之類別。 編輯包裹: 於程式檔案內的第一列鍵入 “package myPackage” 即完成設定,其中package為關鍵字,myPackage為包裹名稱。 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . Ex9_3.java編譯之,將產生目錄myPackage,各編譯完成之類別(class) 檔均放置於此目錄內。
9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 編輯包裹: 於程式檔案內的第一列鍵入 “package myPackage” 即完成設定, 其中package為關鍵字, myPackage為包裹名稱。 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . Ex9_3.java編譯之, 將產生目錄myPackage,各編譯完成 之類別(class) 檔均放置於此目錄內。
9-3 單一檔案包裹 • 範例9_3:設有檔案Ex9_3.java,解釋於單一程式檔案中,如何建立包裹?如何編譯包裹?如何執行包裹? 執行包裹: 鍵入java myPackage/Ex9_3 執行之。(注意此處使用左斜線) 討論事項: 編譯時,我們鍵入javac -d . Ex9_3.java編譯之,其中句點 “.” 是指向當時之目錄,將包裹置於當時目錄。如果我們要將包裹置於其他目錄,則以其他目錄之位置取代句點,如javac -d c:\aa\bb Ex9_3.java,其中c:\aa\bb為其他目錄。
9-4 多檔案包裹 • (1) 檢視所有程式檔案內之類別程序,每一包裹最多只允許其中一個可前置修飾子public,否則將發生執行錯誤。(如果每一檔案有一public類別,雖可編譯,但有時無法執行) • (2) 於各程式檔案內的第一列鍵入相同之 “package yyy” 即完成設定,其中yyy為共同包裹名稱。
9-4 多檔案包裹 • (3) 執行程式編譯時,於Dos視窗鍵入 “javac –d . *.java”,其中 “-d ” 為建立目錄、句點 “.” 為指向目前程式檔所在之目錄、“*.java” 為各程式檔案。 • (4) 編譯完成後,將產生目錄yyy,該程式檔案產生的所有class檔,均自動歸納入目錄yyy內。於Dos視窗鍵入 “java yyy/zzz” 執行之,其中zzz為主體類別。
9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 檔案MyNumber.java: 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }
9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 檔案Ex9_4.java: 11 package myPackage; 12 class E extends MyNumber {} 13 public class Ex9_4 { 14 public static void main(String[] args) { 15 E a = new E(); 16 a.setNumber(5); 17 System.out.println("a=: "+a.getNumber()); 18 } 19 }
9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 列01~10 為檔案MyNumber.java。 列11~19 為檔案Ex9_4.java。 編輯包裹: 於各程式檔案內的第一列鍵入相同之 “package myPackage” 即完成設定,其中myPackage為共同包裹名稱。
9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 建立包裹: 於Dos(或命令提示字元) 視窗, 鍵入javac -d . *.java編譯之, 將產生目錄myPackage,各編譯 完成之類別(class) 檔均放置於此 目錄內。
9-4 多檔案包裹 • 範例9_4:設有檔案Ex9_4.java與MyNumber.java,解釋於多個程式檔案中,如何建立共同包裹?如何編譯共同包裹?如何執行共同包裹? 執行包裹: 鍵入java myPackage/Ex9_4 執行之。
9-5 包裹匯入 • 包裹匯入之格式為import yyy.zzz,其中import為關鍵字,yyy為包裹名稱、zzz為包裹內之主體類別。 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 檔案MyNumber.java: 01 package myPackage; 02 public class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }
9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 列01 將檔案MyNumbdr.javar編譯在包裹myPackage內。 列02 本檔案之主體類別必須前置public,否則將無法被其他程式檔案使用。 建立包裹: 於Dos視窗鍵入 javac –d . MyNumber.java 編譯之,將產生目錄 myPackage,編譯完成之類別 (class) 檔放置於此目錄內。
9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 檔案Ex9_5.java: 01 import myPackage.MyNumber; 02 class E extends MyNumber {} 03 public class Ex9_5 { 04 public static void main(String[] args) { 05 E a = new E(); 06 a.setNumber(5); 07 System.out.println("a=: "+a.getNumber()); 08 } 09 }
9-5 包裹匯入 • 範例9_5:設有檔案Ex9_5.java與MyNumber.java,解釋包裹匯入之應用。 列01 以import myPackage.MyNumber將包裹匯入使用。 編譯與執行: 鍵入javac Ex9_5.java編譯之;鍵入java Ex9_5執行之。
9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {} 12 public class Ex9_6 { 13 public static void main(String[] args) { 14 E a = new E(); 15 a.setNumber(5);
9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 設定包裹package myPackage。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~17 為類別public class Ex9_6。 建立包裹: 於Dos視窗鍵入j avac –d . Ex9_6.java編譯之, 將產生包裹目錄myPackage, 編譯完成之類別(class) 檔放 置於此目錄內。
9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 建立jar檔: 鍵入jar cvf myJar.jar myPackage,壓縮包裹myPackage內之各class檔,建立jar檔myJar.jar。
9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 建立jar檔:
9-6 壓縮檔案 • 範例9_6:設有檔案Ex9_6.java,解釋如何建立包裹?如何建立jar檔?如何執行jar檔? 執行jar檔: 鍵入java -classpath myJar.jar myPackage/Ex9_6,執行myJar.jar檔之主類別Ex9_6。
9-7 jar檔與class檔之加入 • jar檔是由多個壓縮之class檔所組成,前節內容是將包裹內的數個class檔,同時壓縮成一個jar檔。本節將介紹如何將一個class檔壓縮,加入jar檔? • 包裹class檔 • 包裹(Package) 是由多個有關係的class檔所組成,因此、我們通常以包裹為單元,將其中之class檔案壓縮成一個jar檔。
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 01 package myPackage; 02 class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 } 11 class E extends MyNumber {} 12 public class Ex9_7 { 13 public static void main(String[] args) {
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 14 E a = new E(); 15 a.setNumber(5); 16 System.out.println("a=: "+a.getNumber()); 17 } 18 } 列01 設定包裹package myPackage。 列02~10 為類別class MyNumber。 列11 為類別class E。 列12~17 為類別public class Ex9_7。
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 建立包裹: 於Dos視窗鍵入javac –d . Ex9_7.java編譯之,將產生包裹目錄myPackage,編譯完成之類別(class) 檔放置於此目錄內。
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 建立jar檔: 鍵入jar cvf myJar.jar myPackage\Ex9_7.class,壓縮包裹內之Ex9_7.class檔,建立jar檔myJar.jar。(注意此處使用右斜線)
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 其他class檔加入jar檔: 鍵入jar uvf myJar.jar myPackage\MyNumber.class,壓縮包裹內之MyNumber.class檔,加入jar檔myJar.jar。 鍵入jar uvf myJar.jar myPackage\E.class,壓縮包裹內之E.class檔,加入jar檔myJar.jar。
9-7 jar檔與class檔之加入 • 範例9_7:設有檔案Ex9_7.java,解釋將包裹內的class檔加入jar檔。 執行jar檔: 鍵入java -classpath myJar.jar myPackage/Ex9_7,執行myJar.jar檔之主類別Ex9_7。
9-7 jar檔與class檔之加入 • 非包裹class檔 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 01 class MyNumber{ 02 private int number; 03 public void setNumber(int i) { 04 number = i; 05 } 06 public int getNumber() { 07 return number; 08 } 09 } 10 class E extends MyNumber {} 11 public class Ex9_8 { 12 public static void main(String[] args) { 13 E a = new E();
9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 14 a.setNumber(5); 15 System.out.println("a=: "+a.getNumber()); 16 } 17 } 列01~09 為類別class MyNumber。 列10 為類別class E。 列11~16 為類別public class Ex9_8。 建立class檔: 於Dos視窗鍵入 javac Ex9_8.java編譯之, 將產生Ex9_8.class、 MyNumber.class、E.class 等class檔。
9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 建立jar檔: 鍵入jar cvf myJar.jar Ex9_8.class,壓縮Ex9_8.class檔,建立jar檔myJar.jar。
9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 其他class檔加入jar檔: 鍵入jar uvf myJar.jar MyNumber.class,壓縮MyNumber.class檔,加入jar檔myJar.jar。 鍵入jar uvf myJar.jar E.class,壓縮E.class檔,加入jar檔myJar.jar。
9-7 jar檔與class檔之加入 • 範例9_8:設有檔案Ex9_8.java,解釋將非包裹內的class檔加入jar檔。 執行jar檔: 鍵入java -classpath myJar.jar Ex9_8,執行myJar.jar檔之主類別Ex9_8。
9-8 使用jar檔 • 我們已實作如何建立jar檔,讀者以後在Java程式設計上,將會開發jar檔提供給其他程式使用;或是讀者自己在設計程式時,使用到別人開發的jar檔。當設計提供其他程式使用的jar檔時,壓縮至jar檔之主類別必須前置 “public”,否則該jar檔無法被其他程式使用。在使用jar檔之設計上可分為:(1)使用匯入jar檔,(2)使用jar檔新物件。
9-8 使用jar檔 • 無論使用匯入jar檔、或使用jar檔新物件,為了方便管理,通常均以包裹(Package) 為單元,亦即以包裹的名稱為匯入名稱、或以包裹的名稱為原始物件的名稱。
9-8 使用jar檔 • 使用匯入jar檔 • 範例9_9:設有檔案Ex9_9.java與MyNumber.java,解釋匯入jar檔案之應用。 檔案MyNumber.java: 01 package myPackage; 02 public class MyNumber{ 03 private int number; 04 public void setNumber(int i) { 05 number = i; 06 } 07 public int getNumber() { 08 return number; 09 } 10 }
9-8 使用jar檔 • 範例9_9:設有檔案Ex9_9.java與MyNumber.java,解釋匯入jar檔案之應用。 列01 將檔案MyNumbdr.javar編譯在包裹myPackage內。 列02 本檔案之主體類別必須前置public,否則將無法被其他程式檔案使用。 建立包裹: 於Dos視窗鍵入 javac –d . MyNumber.java 編譯之,將產生目錄 myPackage,編譯完成之 類別(class) 檔放置於此目錄 內。