2008/07/29
Fat-jar -- 把全部的jar打包成一個可以執行的jar
傳統只要把這些外部的library放置於jre/lib/ext/ ,便可以存取。
不過若是用eclipse開發java程式,
則可以在Project上按右鍵,可簡單的依下列方式引用外部的library
Properties-> Java Build Path-> Libraries-> Add External JARs
但是當Project要export出來成可執行的jar檔時,
若沒有對classpath做設定,可能造成jar檔找不到外部library的jar檔而無法執行。
過去我都把Project export出來的proj.jar 與外部的lib1.jar及lib2.jar放在同一個目錄,並寫一個bat檔來執行它們。
bat檔的內容如下: (其實這是佷久以前陶百神教我的)
java -classpath proj.jar;lib1.jar;lib2.jar Main-ClassName(沒有.class哦)
另一種方法是在export proj.jar檔前, 在MANIFEST.MF中加入下面這行設定:
Class-Path: lib1.jar lib2.jar
(用空白做分隔)
今天才發現原來eclipse有個很方便的plugin叫 Fat-jar
可以從Eclipse的選單,help-> software updates -> Find and Install -> Search for new features to install -> new remote site
會跳出一個輸入對話窗,要求plugin的名字和更新的來源,輸入如下:
Name: Fat Jar
URL: http://kurucz-grafika.de/fatjar
之後便開始安裝Fat-jar
Fat-jar 簡單易用,
直接在要export的Project上按右鍵,選"build fat-jar"
之後便會跳出選單,把你的Main-Class 設定好,按下一步。
接著把你要一起包進去的lib1.jar lib2.jar ...勾選,按下一步。
它就會幫你全部打包成一個xxx.jar檔,並放置於你的Project的根目錄下。
這個xxx.jar檔無論放在什麼位置,應該都是雙點便可執行的。
也可以在console下輸入java -jar xxx.jar 來執行它。
Reference:
Java World
http://www.javaworld.com.tw/jute/post/view?bid=20&id=111801&sty=1&tpg=1&age=0
2008/02/27
Eclipse shortcut
- 找配對的右括號(block寫太長時,很好用):在左括號的後方按 ctrl+shift+p,便會自動跳到右括號後方。
- 每次回來寫程式,都忘了哪些code是需要implement or enhancement,這時候可以用//TODO 來標記,之後便可利用Tasks Panel列出Todo list,方便maintain程式。
- ctrl+shift+上下鍵,可以一次跳一個member or function (Mac: command + shift +上下鍵)
- ctrl+上下鍵 跟滑鼠中間滾輪差不多
- ctrl+左右鍵 游標一次跳一個word (Mac: alt +左右鍵)
- ctrl+ alt + r 可以更改變數名字 (Mac: 我習慣把它改成 command + r )
- ctrl + k 找下一個選取字串 (Mac: command + K)
- ctrl + shfit + 左右鍵 可以快速選取變數 or statement (Mac: alt + shift + 左右鍵)
- alt + 左右鍵 可以返回前一個游標處 (Mac: command + [ ])
- alt + / word completion (Mac: 我習慣把word completion 改成 ctrl + . | content assist改成command + .)
- ctrl + / comment (Mac: command + /)
- ctrl + shift + / comment block
- ctrl + shift + \ uncomment block
- ctrl + l jump to the designated line (Mac: command + L )
- ctrl + F6 or ctrl + E Next editor 就是常常習慣用的switch tabs,我習慣把它改成ctrl + tab (Mac: ctrl + fn + 上下鍵,我習慣用BetterTouchTool把它mapping 到three fingers swipe)
- F3 jump to declaration (Mac: fn + F3)
- ctrl + alt + H open call hierarchy (Mac: ctrl + alt + H, 我習慣改成command + alt + H)
- F4 open hierarchy and outline view
- ctrl + O quick outline (Mac: command + O )
- ctrl +1 參考eclipse 提供的修改意見(有紅色或黃色底波線highligh的variables) (Mac: command + 1)
- ctrl + shift + L open hotkey menu (Mac: command + shift + L)
- alt + shift + S show the source menu (等於在variable上按右鍵)
- syso alt+ / template for System.out.println();
- ctrl + shift + X 將選取的英文改成大寫 (Mac: command + shift + X)
- ctrl + shift + Y 將選取的英文改成小寫 (Mac: command + shift + Y)
- Mac: command + shift + R Search File in project
- ctrl + D delete current line (Mac: command + D)
- ctrl + Q Jump to last edit point
- ctrl + J Search as you type. At first it won’t seem that anythings happening. But just type something and you’ll start searching. Hit ESC to cancel. (Mac: command + J)
- Mac: command + shift + F Pretty format selected code block.
2007/11/30
Ubuntu7.10 - 終於沒有亂碼和掉字了~
果然陶百神一來, 許多存在已久的困擾都消失了.
首先我的Eclipse開以前在Windows上寫的程式, 註解都會出現亂碼.
一直以為是我ubuntu預設utf-8編碼的問題, (因為在windows上寫的程式, 中文是以Big5編碼)
拜了陶百神之後, 才知道原來Eclipse也可以設定編碼.
差點就下決心把之前所有註解都改成英文了...XD
接著是FireFox開中文網頁, 常常會掉字.
之前一直想說就將就一下好了. (我真不像個資工人..)
後來才知道原來我的firefox會掉字,
是因為我的ubuntu語系是english.
所以在瀏覽utf-8的中文網頁時, 就會出現掉字.
參考下列這個網站
http://c9s.blogspot.com/2007/08/ubuntu.html
修改/etc/font/conf.d/65-nonlatin.conf
並在sans, serif下的prefer tag裡的第一行加上
<family>AR PL ShanHeiSun Uni</family>
(前提,你預設firefox的字型為Sans , Serif,
且也擁有AR PL ShanHeiSun Uni字型, 不過方式一樣, 用別的字型也可以如法泡製)
改好後再
$ sudo fc-cache -v
最後重開firefox, 就沒有掉字問題了~~~~~~~酷!!!
最後就剩連到samba抓共享資料時, 因為folder及file name的中文是big5編碼, 所以我又看到一片亂碼..
拜了陶百神之後才知道因為我是用ssh連所以才會有encoding的問題,
而ubuntu的Places>Cnnect to Server 這工具, 有Service type可選, 只要選擇Windows share.
就可以正確瀏覽Samba的big5編碼。
耶~~我的Ubuntu中文顯示無亂碼也無掉字,讓我更不想換回windows了~~
2007/11/05
Ubuntu>eclipse3.2>JRE_SRC
我記得以前在windows下跑eclipse3.2,
若要使eclipse隨滑鼠游標自動顯示document help,如下圖.
只要
Window> Preferences
Java> Installed JREs
Edit>JRE home directory
設JDK路徑(而非JRE路徑唷!)便可~
但在ubuntu下,我一直找不到j2sdk這個目錄,但是我確實有安裝sun-java6-jdk這個套件.
Eclipse的
Window> Preferrence>
Java> Build Path> Classpath Variables 的變數 JRC_SRC(reserved) -empty
並不允許user去改它!!
結果我在Synaptic Package Manager上找到sun-java6-source,並安裝它, 重開eclipse.
JRC_SRC 變數就會自動被改成/usr/lib/jvm/java-6-1.6.0.03/src.zip
然後eclipse的document help就啟動了~~
Eclipse 3.2 改字型及顯示行號
每次我都忘記..
改字型:
Window> Preferrence >
General> Appearance> Colors and Fonts> Java> Java Editor Text Font click Change..
顯示行號:
Window> Preferrence>
General> Editor> Text Editors check Show line numbers
2007/04/22
path, classpath, jre, jdk
今天總算釐清了一些困擾我很久的東西,所以做個簡單的筆記。
一、安裝單一版本的jdk時,通常會有:
4個java.exe:
1.WINDOWS\system32\java.exe
2.[JRE_location]\bin\java.exe
3.[JDK_location]\bin\java.exe
4.[JDK_location]\jre\bin\java.exe
2個JRE:
1.Public JRE (指[JRE_lcation])
2.Private JRE (指[JDK_location]\jre)
前兩個java.exe使用的是Public JRE,後兩個java.exe使用的是Private JRE。
二、classpath無需設定rt.jar的路徑,因為jdk會預設載入。(參考六)
可以在console mode 輸入java -verbose得之。
(verbose 可以顯示JVM會依序load哪些Class)
不知道是幾版之後才如此。總之,我試了又試,有沒有設rt.jar路徑真的無差別,
很好奇為什麼大家都說要在classpath設定rt.jar,而我在google上卻找不到答案。
也有人提倡最好少設classpath。
三、path用來設定指令的前置位址,如下:
(可以在console mode 輸入set path 或 path以顯示)
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
C:\Program Files\Microsoft SQL Server\90\Tools\binn\;
C:\Program Files\Java\jdk1.6.0\bin;
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin;
所以當我們在console mode 輸入java XXX 時,如果current目錄沒有java這指令時,
便會依序嘗試path下的路徑。
四、jdk目錄下之所以安置了一個jre,原因在於jdk下的工具大都是用java開發的。
如:java.exe , javac.exe jar.exe..等,(這些工具都放在jdk\lib\tools.jar中)
外表雖然是用RPC包裝成.exe檔,但其實它們都需要呼叫JRE的library。
所以JDK下就放了一個專供JDK使用的JRE,
但也可以透過path的設定讓[JDK_location]\jre被一般使用者使用。
五、在console mode使用java 這指令時,它使用的是哪個jre呢?
1.先找自己的目錄下是否有jre.
2.父目錄底下的jre目錄.(jdk\bin下的工具便是如此找到jdk\jre)
3.查詢Windows Registry
(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\)
所以這時path的順序設定將決定採用的是哪一個jre。
case1:
若path的順序是\WINDOWS\system32 在 \[JDK_location]\bin 之前。
java指令便是執行\WINDOWS\system32\java.exe
由於windows下無jre目錄,所以會參考Window Registry下的jre。
(即前述的Public JRE)
case2:
若path 的順序是\[JDK_location]\bin 在\windows\system32 之前。
那麼java指令便是執行C:\[JDK_location]\bin\java.exe
由於jdk下有一個jre目錄,所以java會參考jdk\jre。
(即前述的Private JRE)
最常發生的問題是當path的順序如case1,
java指令找到的jre與javac找到的jre是不同的。
產生的問題待第六點解釋。
六、java找尋class的順序
根據JDK 文件說明, java以下面3種順序找尋class的順序
1.Bootstrap classes
2.Extension classes
3.Users classes
Bootstrap classes指的是java在啟動時載入的class,
這些class主要是rt.jar 和 jre/lib 目錄下的一些class。
(所以rt.jar可以不須加入classpath)
下面列出系統中預設的Bootstrap classes:
jre\lib\rt.jar; jre\lib\i18n.jar;
jre\lib\sunrsasign.jar; jre\lib\jsse.jar;
jre\lib\jce.jar; jre\lib\charsets.jar;
jre\classes
Extension classes 指的是jre/lib/ext 目錄下的jar或zip檔。
third-party 的 library通常會放在這目錄下,如java3d, jogl..等。
當classloader 需要resolve class時,jre會自動來此目錄下找。
如果不同名字的jar,卻包含了相同的class,那麼哪一個class被載入是不一定的。
第五點最後提到的問題,常常跟Extension classes扯上關係。
當我們使用third-party的library時,如果只將jar檔放在Private JRE/lib/ext中,
javac指令因為使用Private JRE,所以能夠找到third-party library,得以順利compile。
但java指令使用的是Public JRE,Public JRE找不到 third-party library,
以致無法順利執行,原因是無法import package。
解決的方法有:
1.將third-party library jar檔 在 private JRE/public JRE 各放一份。
2.設定path時,使用第五點的case2。使java及javac指都優先使用Private JRE。
Eclipse可以很方便使用third -party library,
Project->Properties->Java Build Path->Libraries->Add External JARs
(陶百學長教我的)
User classes便是指我們在classpath設定路徑下的class。
如:若總是使用c:\java\的class,或是需要使用c:\lib\test.jar裡的library,
便可以set classpath =.;c:\java\;c:\lib\test.jar
(.jar檔須將完整路徑名加入classpath, jre才會進入該jar檔裡找尋target class)
user classes尋找的優先序:
(1)若無設定classpath, jre預設找(.)目前目錄是否存在target class.
(2)若有設定classpath, jre只找classpath設定的路徑是否存在target class.
(3)在console mode下使用-cp 或 -classpath, 則jre只找參數後的路徑是否存在target class.
(4)在console mode使用-jar來指定jar檔時, jre只找尋jar中是否存在target class.
reference:
classpath詳解
http://www.phpchina.com/755/viewspace_5055.html
JavaWorld
classPath的討論串
path與classpath
2007/01/03
安裝Java6後,執行Eclipse出現terminated dialog
昨天睡前安裝了Java6,
今天早上起來發現執行Eclipse,出現terminated dialog。
上網找了好久,試了重新安裝eclipse,更改eclipse.ini,
正打算移除java6,結果有人告訴我可以試試移除c:/windows/system32/javaw.exe,
問題便解決了。
我想問題應該是在於我的path是
.;C:\WINDOWS\system32;C:\Program Files\Java\jdk1.6.0\bin;
所以eclipse會先找到c:/windows/system32/javaw.exe,
而c:/windows/system32/javaw.exe用的是public JRE,
但我裝了JDK6之後, 便把舊的JRE移除了,
所以c:/windows/system32/javaw.exe找不到public JRE,
就出現前述的問題了...
移除c:/windows/system32/javaw.exe便可以work的原因,
是因為在c:/windows/system32/ 找不到javaw.exe,
便會去C:\Program Files\Java\jdk1.6.0\bin找javaw.exe,
而此處的javaw.exe用的是private JRE,
所以自然沒有問題...