1. 程式人生 > >·沒有風雨躲得過,沒有坎坷不必走·

·沒有風雨躲得過,沒有坎坷不必走·

第一步:建立專案

開啟Eclipse,新建一個Java專案,名叫TestSWT,手動追加一些必要的目錄後結構如下:

/bin - 這個是class編譯輸出路徑
/dll - 此目錄存放SWT解壓出來的那些dll檔案(簡單應用的話swt-win32-****.dll這一個檔案就夠了)
/lib - 此目錄用來存放swt等開發需要的jar檔案
/src - 此目錄為原始碼目錄
/jar - jar檔案的輸出路徑
/META-INF - 存放可執行JAR需要的MF檔案

這裡我選用的swt包是Eclipse/plugins下面的swt包,一般其名稱類似於org.eclipse.swt.win32.win32.x86_****.jar,
其中的****是版本號,各人的可能不太一樣。

上面說明目錄的時候提到的dll目錄,裡面存放的dll檔案可以直接從 org.eclipse.swt.win32.win32.x86_****.jar這個包裡解壓得到,簡單應用就只把swt- win32-****.dll複製過去,或者都複製過去(一共能解壓出來6個dll)也行,其餘5個都比較小。

第二步:編寫程式碼

然後編寫一個測試用的窗體:

package cn.indoing.test;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MainForm
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Test!!!");
shell.setVisible(true);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();

}
}

在這裡順便說一下,其實本不用把swt-***-****.dll複製到系統碟符的windows/system32下,那個目錄內容的多少影響系統速度(個人感覺,不一定準確),所以我們採用另外一種方式。

在eclipse裡,讓上面的MainForm編輯窗獲得焦點,然後點選右鍵,選擇Run As -> Open Run dialog ... ,選擇右面(X)=Arguments標籤,在下面的VM arguments裡追加-Djava.library.path={$workspace}/TestSWT/dll,這裡的{$workspace} 是你的eclipse的workspace的目錄,不要直接把這個複製過去才好,呵呵。然後點選Run就可以了。

第三步:建立配置檔案

在META-INF目錄下新建一個名為MANIFEST.MF的文字檔案,這個檔案小心點兒,格式要求的很嚴格,一個空格都不能錯,如果Class-Path項有很多jar包,請寫在一行,相鄰的兩個jar包之間用一個半形空格來分割。本例內容為:

Manifest-Version:(空格)1.0
Main-Class:(空格)cn.indoing.test.MainForm
Class-Path:(空格)./lib/org.eclipse.swt.win32.win32.x86_3.3.1.v3346i.jar

第四步:建立批處理檔案

在專案的根目錄下新建一個jar.bat檔案,修改其內容為:

@echo off
cd jar
rmdir lib /s /q
del test.jar /f /q
cd ../bin
jar cvfm ../jar/test.jar ../META-INF/MANIFEST.MF cn/
cd ../jar
mkdir lib
copy ../lib/*.* lib/
copy ../dll/*.* lib/

可以了,編譯好原始碼後,在資源管理器裡找到本專案的目錄,雙擊執行jar.bat即可。
在/jar目錄下會生成一個test.jar和一個lib目錄,雙擊test.jar試試看?

其他說明

jar檔案通常有兩種啟動方式,一種是雙擊執行,一種是DOS提示符下執行,先予以分別說明。

  • 雙擊執行

    這種執行方式是最直接最簡單也是大家特別習慣的執行方式,最終成品釋出估計多數都是這樣執行,但是這種方式不利於開發期的測試和除錯,因為 雙擊模式預設是介面操作模式,所以一些本來打在控制檯的錯誤資訊我們就無法獲得,萬一程式真的在某個地方有問題,從直觀上是根本看不到任何反映的。另一種 情況,也是非常令人頭疼的情況,就是明明在Eclipse跑的好好的,作成Jar檔案雙擊就不好用,然後解壓回去或者回到Eclipse發現還好用,這樣 的情況初學者比較容易常見,原因多數情況是配置的問題,那麼為了迅速的找到問題的原因,就要採用下面的執行方式——DOS提示符執行。

  • DOS提示符下執行

    在DOS提示符下進入Jar包所在目錄,然後執行 java -jar {$yourfilename}.jar。正如上面所說, 在DOS提示符下執行Jar檔案,預設方式是控制檯方式,那麼任何我們以前可能在 Eclipse的Console裡看到的log資訊現在都能看得到,假如真的出現上面提到的第二種情況,那麼一眼就可以看出是否缺少dll檔案還是其他問 題了。

aaa

常見錯誤

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3236 in java.library.path

這個錯誤最初容易出現在Eclipse開發過程,通常是dll檔案的存放位置不對,或者可以說配置引數沒有寫好,解決辦法請先參考上面提到的加執行 引數方法,如果還是不行那麼先把swt-win32-3236.dll放到windows/system32下吧(實在沒辦法再放進去,總往 system32裡新增東西不是好事兒)。如果還是不行——,這是我剛才想到的,那麼要注意一下是不是版本不對,例如提示說swt-win32-3236 找不到,發現dll檔案是有,但是後面卻不是3326,這個現象沒試過,猜測有可能發生。

Invalid or corrupt jarfile test.jar

MANIFEST.MF檔案格式不對,很有可能多了或少了空格,記住每個冒號後面有且只有一個半形空格。

Exception in thread "main" java.lang.NoClassDefFoundError: cn/indoing/test/MainForm2

Main-Class的內容寫錯了,例如本例中明明是MainForm,這裡卻寫成了MainForm2(當然只是舉例子,實際上這樣的事情是不會發生的)。

其他的錯誤情況我還沒想到,如果你參考我的流程來做發現有其他問題,請跟貼告訴我,共同學習。

“畫蛇添足”

按照上面的流程,我們做好了jar檔案,可以通過雙擊執行了,但是有一點可能不是令人十分滿意,那就是釋出的時候還要把lib包一起帶著。那麼能不能作成只有一個jar檔案就夠了呢?

經過測試,可行,不過不敢說自己的方法是最簡潔的,現說明如下:

不知道上面解壓org.eclipse.swt.win32.win32.x86_****.jar時的東西還在不,不在就再解壓一次。裡面有個 org目錄,6個dll和其他幾個說明檔案,我們要做的是用解壓縮軟體(例如7z,winRar,winZip等等)開啟test.jar,注意,是開啟 即可,不用解壓。還是參考本例中的test.jar,請只保留cn目錄和META-INF目錄,其他檔案一概全部刪除,然後用滑鼠點選swt解壓包裡的 org目錄和6個dll檔案到當前test.jar裡,軟體會問你是否加入,確認。然後進入test.jar裡的META-INF資料夾,先把 MANIFEST.MF拖拽出來,用文字編輯器開啟,刪掉classpath那行,儲存後再拖拽回去,OK,一個嶄新的單檔案可執行jar檔案就做好了。

這一套也不太麻煩,不過如果以後想省事兒的話建議把這個但檔案的test.jar留著(我這裡顯示1.74M),以後做別的SWT專案想作成單個兒 的可執行JAR檔案時只要把這裡的cn目錄刪掉,換成你自己的開發目錄,再把MANIFEST.MF弄出來修改一下main-Class就可以了。