Showing posts with label eclipse. Show all posts
Showing posts with label eclipse. Show all posts

2008/07/29

Fat-jar -- 把全部的jar打包成一個可以執行的jar

在寫java程式時,常常需要引用外部的library。
傳統只要把這些外部的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


  1. 找配對的右括號(block寫太長時,很好用):在左括號的後方按 ctrl+shift+p,便會自動跳到右括號後方。

  2. 每次回來寫程式,都忘了哪些code是需要implement or enhancement,這時候可以用//TODO 來標記,之後便可利用Tasks Panel列出Todo list,方便maintain程式。

  3. ctrl+shift+上下鍵,可以一次跳一個member or function (Mac: command + shift +上下鍵)

  4. ctrl+上下鍵 跟滑鼠中間滾輪差不多

  5. ctrl+左右鍵 游標一次跳一個word (Mac: alt +左右鍵)

  6. ctrl+ alt + r 可以更改變數名字 (Mac: 我習慣把它改成 command + r )

  7. ctrl + k 找下一個選取字串 (Mac: command + K)

  8. ctrl + shfit + 左右鍵 可以快速選取變數 or statement (Mac: alt + shift + 左右鍵)

  9. alt + 左右鍵 可以返回前一個游標處 (Mac: command + [ ])

  10. alt + / word completion (Mac: 我習慣把word completion 改成 ctrl + . | content assist改成command + .)

  11. ctrl + / comment (Mac: command + /)

  12. ctrl + shift + / comment block 

  13. ctrl + shift + \ uncomment block

  14. ctrl + l jump to the designated line (Mac: command + L )

  15. ctrl + F6 or ctrl + E Next editor 就是常常習慣用的switch tabs,我習慣把它改成ctrl + tab (Mac: ctrl + fn + 上下鍵,我習慣用BetterTouchTool把它mapping 到three fingers swipe)

  16. F3 jump to declaration (Mac: fn + F3)

  17. ctrl + alt + H open call hierarchy (Mac: ctrl + alt + H, 我習慣改成command + alt + H)

  18. F4 open hierarchy and outline view

  19. ctrl + O quick outline (Mac: command + O )

  20. ctrl +1 參考eclipse 提供的修改意見(有紅色或黃色底波線highligh的variables) (Mac: command + 1)

  21. ctrl + shift + L open hotkey menu (Mac: command + shift + L)

  22. alt + shift + S show the source menu (等於在variable上按右鍵)

  23. syso alt+ / template for System.out.println();

  24. ctrl + shift + X 將選取的英文改成大寫 (Mac: command + shift + X)

  25. ctrl + shift + Y 將選取的英文改成小寫 (Mac: command + shift + Y)

  26. Mac: command + shift + R Search File in project

  27. ctrl + D delete current line (Mac: command + D)

  28. ctrl + Q Jump to last edit point

  29. 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)
  30. 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,


所以自然沒有問題...