2010年5月26日 星期三

Package 討論

///////////////////////////////////
Package: Classpath 是設定你有 jar 會 lib 的地方,
而被包的或要使用物件就要使用 package dir 表示此物件在的路徑, 而這些要放在 dir 中.
所以會有兩個路徑, 一個表示 classpath, 一個表示 Package path


至於要使用的 class 要用 import package + class 名稱, 在編譯及執行時要加入 classpath(cp),
如: 有個 PackageTest.java 會用到 andy.Hello <-- 為 package path, 而 andy.Hello 在 /home/Andy/Desktop/working/JavaAll/JavaPractice/row <-- 為 class path


簡言之: classpath 指向 jar 或 package path 的地方, 而 package path 提供其它程式物件使用.


javac -cp /home/Andy/Desktop/working/JavaAll/JavaPractice/row (classPath) PackageTest.java
java -cp /home/Andy/Desktop/working/JavaAll/JavaPractice/row:./ PackageTest

Note: 此時 PackageTest.java 可放在任何地方使用



/////////////////////////////////////
另一種是用 Jar 檔:
將 package path 裝成 jar 檔, 使用時
java -cp hahaJar.jar haha.in.deep.hole.PitFiend

//////////////////////////////////////
在 Eclipse 要用時
0. 建 lib 目錄
1. include jar file
2. add path
(此時會在此 project 目錄下, 建 .classpath)



////////////////////////////////////////////
Noet: Packecage 太多時, 會有 conflict, 此時也需要移除一些 package, 而其中一例是 tomcat
中有許多 xml-apis.jar xercesImpl.jar xalan.jar, 要留下一組可用的 jar ok



//////////////////////////////////////////////
狀況實戰:
//////////////////////////////////////////////
1. 若你有個 jar 檔是個很有結構的程式, 裡面有 source 和 class, 但你卻想知道某個 class 是否能運作, 你要如何加入你的 java 去 Check 或使用它呢?

2. 同上, 請用將你的 java 加入此 package 為情況要如何作? 如何邊譯? 如何執行?

3. 同上, 若有個 jar 檔, 你想修改某個 java 檔案, 請問你要如何修改? 如何編譯呢?
(注意此時修改的 java 可能還會要更多的 lib, 還要注意設定目前 java 使用的物件路徑)


回答:
1. 此處用 datawarehouse.jar 這個說明, 首先你解 jar 後, 會一個很有結構的目錄, 其路徑大約是 net/asgc/gap/portal/util 這就是 package path, 而我們目標是想使用確定 util 中的VQSClientProperties.java/VQSClientProperties.class 的方法 Signature, 因此我們寫個 FooTest.java 來完成它, 在 FooTest.java 中我們可以不用定義 FooTest.java的Package, 單純的只是像個使用物件
其程式碼如下:
{{{
import java.lang.reflect.Method;
import net.asgc.gap.portal.util.VQSClientProperties;
public class FooTest {
public static void main(String[] args) {
try{
// VQSClientProperties.load(new Properties());
VQSClientProperties t;
System.out.println("GapUserInit: Look Client Property");
for (Method m : VQSClientProperties.class.getMethods() )
System.out.println("VQSClientProperties>>" + m);

}catch(Exception e){
e.printStackTrace();
}
}
}

}}}
此處有幾個重點:
1.要用 net.asgc.gap.portal.util.VQSClientProperties 為 Package 全名

在編譯時用:
javac -classpath /tmp/code/datawarehouse FooTest.java
注意: /tmp/code/datawarehouse 是Class path, 而 net.asgc.gap.portal.util 是 package path, 兩者不相同要會分別.

在執行時:
java -classpath .:/tmp/code/datawarehouse FooTest
顯而易見: 執行表是要連結的 Class.


2. 承上, 只要將 FooTest.java 加入你目前用的 Package, 在編譯與執行時指定 classPath 可以, 過程如下:
{{{
package net.asgc.gap.portal.util;

//import java.util.*;
import java.lang.reflect.Method;
import net.asgc.gap.portal.util.VQSClientProperties;
public class FooTest {
public static void main(String[] args) {
....
}
}

}}}
編譯: 指定 classpath
javac -classpath /tmp/code/datawarehouse FooTest.java

執行: 指定 classpath 並說明你要 run package
java -classpath /tmp/code/datawarehouse net.asgc.gap.portal.util.FooTest


3. 因為一個 java 可能會要使用許多的 lib, 所以此時 classpath 要結何其它的 lib
當成編譯與執行, 一旦少個 object code 都會無法運作. 因此我們會使用 script 去Link所有的路徑, 並作編譯, 甚至要 jar 起來.
I
largeCompiler.sh
{{{
#!/bin/sh
CP=/tmp/code/datawarehouse

for path in $(find /opt/apache-tomcat-5.5.27/webapps/gcp/WEB-INF/lib/ -name *.jar);
do
CP="$CP:$path";
done
javac -classpath $CP GapUserInit.java
}}}
而 /opt/apache-tomcat-5.5.27/webapps/gcp/WEB-INF/lib/ 是我們的函式庫, 雖然不一定都會得到, 但多聯結, 不會有問題.

II. 在 datawarehouse 最上層目錄可把所有內容.
jar cf test.jar -C datawarehouse .

沒有留言:

張貼留言