天天看點

《Eclipse從入門到精通》常見問題解答 附錄 B  讀者提問精選(第二次印刷) 附錄C  讀者提問精選(第三次印刷) 

問:為什麼我的 Swt-Designer 安裝總是不成功?

答:将安裝步驟要點簡述如下:

( 1 )下載下傳

筆者于 2005 年 8 月重新去 http://www.swt-designer.com/ 網站下載下傳了用于 eclipse3.0.1 的 Swt-Designer 。現在它已經更新到了 4.1.0 GA 2005.07.09 ,本書中使用的是 2.1.0 GA 2004.08.19 。不過兩個版本的安裝和使用方法基本相同。

( 2 )安裝

将下載下傳 Swt-Designer 得到的 ZIP 包解壓,然後将解壓後得到的“ features 、 plugins 、 designer-delete.bat ”複制到 eclipse 的安裝目錄下。這時因為 eclipse 的安裝目錄已經存在 features 、 plugins 目錄,故而會彈出一個提示框問你是否覆寫目錄,回答“是”。

如果還沒出現第 48 頁的“圖 6.2 ”所示界面,把 eclipse 下的 configuration 目錄删除( eclipse 在其中緩存了一些檔案),再啟動 eclipse 。注意:對于 Eclipse3.1 版,必須保留 configuration 目錄下的 config.ini 檔案。

( 3 ) link 式的安裝

如果你選擇第 2 章介紹的 link 式插件安裝方法,則必須注意一點: Swt-Designer 的 ZIP 包解壓後, features 、 plugins 并沒有被包含在一個 eclipse 目錄下, WEB 篇的 lomboz 插件安裝也有同樣的問題。正确的目錄結構請參考第 421 頁的“圖 23.12”,在此頁第八行已經有“注意”的提示,但還是有不少讀者忽略了這一要點。

問:用 Swt-Designer 向導建立一個 swt 項目時,并沒有自動生成 src 目錄下的包“ package com.swtdesigner.ResourceManager ”和類檔案 resourcemanager.java ,如第 48 頁的圖 6.4 ,請問怎麼辦?

答:本書所用 Swt-Designer 是 2.1.0 GA 版,如果你用 4.1.0 GA 版,則此新版本不會自動生成 src 目錄下的包和類檔案。其實這個自動生成的類檔案,并沒有太大用處,筆者在開發時常常把它删除掉。如果你想看一下此檔案的代碼,在随書CD光牒裡有它的源檔案。

問:在公司無法注冊激活 SWT Designer ,提示“ Transaction failed:Internal Server Error ”。

答:很可能是公司網絡做了限制的原因,比如把 SWT Designer 激活時的響應端口給封掉了。可以嘗試以下解決方法:

( 1 )通過一台可以上網的電腦(比如家裡的)将 SWT Designer 注冊好,然後把協定檔案 C:\Documents and Settings\ [UserName]\Instantiations.license 從你家裡複制到公司電腦上。

( 2 )書中關于 SWT Designer 的内容隻占很少(僅第 6 章),第 7 章之後的 SWT/JFace 例程是完全可以脫離 SWT Designer 而運作的。 SWT Designer 僅僅是一個界面輔助設計工具,它對 SWT 程式設計不是必須的。你可以參照随書CD光牒裡的視訊,不必用 SWT Designer 項目建立向導就能将CD光牒上的項目安裝起來,并順利運作書中的所有 SWT/JFace 例程。

問:按照書上注冊好了,但還是出現了“ Activation is complete.Thank you. ”  

答:此句英文意思是“已完成激活”,也就是說你已經注冊成功了。

問:執行 “cvs 送出 ” 指令時,伺服器報告錯誤,怎麼辦?錯誤資訊如下:

myproject: cvs server: C:\WINDOWS\TEMP\cvs6C.tmp: No such file or directory

myproject: cvs [server aborted]: error diffing HelloWorld.java

答:這是由于 CVS 使用者對 “C:\WINDOWS\TEMP\” 沒有權限造成的,解決方法有如下三種:

( 1 )通過 CVSNT 控制台“ Advanced ”頁籤下的“ Temporary ”,重新換一個此 CVS 使用者具有讀寫權限的目錄。

( 2 )用 Windows 管理工具把“ C:\WINDOWS\TEMP\ ”的讀寫權限賦予此 CVS 使用者。

( 3 )将此 CVS 使用者設成 WINDOWS 的超級使用者。

問:第 33 頁有一個指令“ cvs -d c:\cvsfile passwd -a giles ”。我的系統是 windows 2000 ,使用者名為 i love you ,密碼為 12345678 。請問就我的情況,上面這個 cvs 指令應該怎麼樣寫才正确。

答:如果此使用者名沒有空格,則指令如下: cvs -d c:\cvsfile passwd -a iloveyou ,回車後再輸入兩次 12345678 。如果此使用者名中有空格,則可以用雙引号把使用者名引起來,指令如下: cvs -d c:\cvsfile passwd -a "i love you" 。如果想更穩妥一些,建議在安裝好 CVS 後,建立一個新的 windows 使用者來給 cvs 用,注意:這并不要求你事先用此新 windows 使用者來登入 windows 。

問:我下載下傳的 JDK 是 1.4.2_08 版,書中所用是 1.4.2_06 版,可以嗎?

答:完全可以。本書對 JDK 版不敏感,隻要是 1.4.2 以上就行。理論上對 1.5 版 JDK 也支援,但本書不推薦。

問:請問 Eclipse3.1 的多國語言包有嗎?

答: Eclipse 還沒有釋出 3.1 版的多國語言包。備注:筆者 2005 年 9 月 8 日做的檢查。

問:我按照書中導入 JFace 的方法導入了 swt.jar ,編譯沒有任何問題,但是運作 SWT 程式時還是出現下面的異常,這是怎麼回事?

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

at java.lang.ClassLoader.loadLibrary(Unknown Source)

  另外我有一個關于 SWT/JFace 的疑惑:在 eclipse 環境下寫的程式如果用了 SWT/JFace 包中的類,在 eclipse 下運作當然沒問題,但是如果拿到一個隻有 jdk 的環境下運作, jdk 中沒有它所需要的 SWT/JFace 中的類,它還能運作嗎?

回答:第一個問題參考書第 49 頁的“導入 SWT 的原生庫”。第二個問題參考第 21 章的“項目的打包與發行”,關鍵在第 274 頁的第二行。

問:我在運作程式時出了 java.lang.NoClassDefFoundError 異常,怎麼辦?異常資訊如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/osgi/framework/InvalidSyntaxException

答: NoClassDefFoundError 異常是因為找不到所需類引起的,對于 SWT 程式,則根本原因是沒有配置好 SWT 類庫。很多讀者以為把 swt.jar 加入庫引用, Eclipse 界面上沒有錯誤就行了,但 SWT 程式在運作時還需要一些其他 JAR 包來支援,如上面提示的 osgi JAR 包。解決方法如下:

( 1 )參考第 26 頁的中間段落有對庫引用的解釋。

( 2 )參考第 48 頁底部的“注意”。

( 3 )參考随書CD光牒的 " 第二篇   SWT_JFace 篇 (6-16 章 )\myswt" 目錄下的 SWT 項目的庫引用 ".classpath" 檔案,通過它你可以知道 SWT 項目所需要 JAR 包。

問:在練習第 53 、 55 頁的例子時,我導入了 SWT 的原生庫,但在調試過程還是出現了錯誤。錯誤資訊如下:“ Fatal exception occurred.Program will exit ” 。

答:參考第 48 頁或第 211 頁的方法,先建立一個完整的 SWT 項目。注意:僅導入 SWT 的原生庫是不夠的,還要設定對 SWT 及其相關庫的庫引用等。

問:在書中第 50 頁建立“ Application Window ”時,無法完成,提示如下: This wizard is  not supported in free version of the product . Swing Object construction is only available in the professional edition.

答:從出錯提示“ Swing Object  ……”中的 Swing ,可知你用錯了一個 wizard 。 Swt-Designer free 版的隻支援 SWT 不支援 Swing ,本書的内容是關于 SWT 的,和 Swing 無關。

問:為什麼我寫了一個繼承自 Shell 類的程式( public class PuzzleFrame extends Shell )總是出錯呢,出錯資訊為: Exception in thread "main" org.eclipse.swt.SWTException: Subclassing not allowed:

答: Shell 是可以被繼承的,但 Shell 的父類 Decorations 有一個 checkSubclass () 函數,當其子類不符合此方法的檢查規則時,就會抛出異常。是以不是簡單繼承 Shell 就行了的,還要做一些比較複雜的工作。此外,軟體設計原則告訴我們:“聚合優于繼承”,如果可以不通過繼承 Shell 來達到使用它的目标,那就盡量采用簡單的方式吧,至少筆者在項目開發中,從未通過繼承的方式來使用過 Shell 。

問: Display.syncExec() 與 Display.asyncExec() 的差別,兩者有什麼不同?

答: syncExec() 和 asyncExec() 方法是外部線程調用本地線程的橋接方法。 syncExec 是必須等待調用結束後才可以進行到後面的流程,而 asyncExec 是調用的線程無需等待就可以進行後面的流程。

問: MessageDialog.openInfomation ,我想調整這個視窗的大小

答:不妨改用 MessageBox 類,參考第 195 頁。

問:書上有查找和打開編輯器的方法,但有沒有得到一個編輯器對象 EditorPart 的方法?然後對這個對象可以進行操作,例如傳一個參數。

答:

( 1 )第 231 頁的第五行的 editor ,它就是一個編輯器( EditorPart )對象。

( 2 )關于給編輯器傳參數,這裡介紹一種間接的方法:給 EditorInput 對象增加一個屬性字段,而通過 EditorPart 類中的 init 方法(第 228 頁第一行),就能得到傳入的 EditorInput 對象,進而取出 EditorInput 對象所攜帶的資料。這樣資料參數用EditorInpurt 做中間載體,就傳給了 EditorPart 編輯器。

問:如果我的程式不是插件,而且傳統應用程式。第 18.8 節所講制作幫助的方法,對于我來說就無效了,請問我該如何來制作幫助呢?

答:給傳統應用程式制作幫助比較麻煩,建議你看看 Eclipse 中最新的 RCP 開發, RCP 它結合了插件和傳統應用程式的優點:實際上是插件的開發方式,表面上看起來卻象一個完完全全的傳統應用程式。

問:第 300 頁的程式出現以下錯誤:

java.lang.NoClassDefFoundError: org/aspectj/lang/Signature 

at java.lang.Class.forName0(Native Method) 

at java.lang.Class.forName(Unknown Source)

答:錯用了連接配接包 mysql-connector-java-3.1.10-bin-g.jar ,應該用 mysql-connector-java-3.0.17-ga-bin.jar

問:第 24 章說到把 j2src 的檔案輸出到 "hello\WEB-INF\classes" 下,把随書CD光牒上第 22 章的 sms\src 目錄下的檔案拷到相應目錄就行了?我發現CD光牒的 "hello\WEB-INF\classes" 目錄下并沒有任何檔案,我有點迷惑 *.class 檔案到底應該放在哪裡?

答:如果照第 433 頁的“圖 24.1 ”所示做好了設定,則 eclipse 會自動将源檔案編譯成 *.class 檔案,并輸出到“ hello\Web-INF\classes" 目錄下。是以随書CD光牒上沒有必要在 "hello\Web-INF\classes " 目錄下保留着 *.class 檔案。

問:我想在 Eclipse 中加入 Struts ,看到第 25 章說把 lib 下的 *.jar 複制到 hello/WEB-INF/lib 目錄下。我沒有看過本書的任何一章,不知道這個 hello/Web-INF/lib 的絕對路徑是多少?

答:參閱第 425 頁的“圖 23.20 ”,絕對路徑是 c:/elcipse/workspace/hello/Web-INF/lib 。另:本書 WEB 篇的每章都有前後承接關系,建議從第 23 章看起。

問:在搭建 J2EE 開發平台中,是否要安裝 J2EEsdk ?

答:不需要安裝。

問:我看有的書講 Hibernate 的安裝,并沒有提到要使用 Tomcat 等伺服器,不知是什麼原因?

答: Hibernate 并不是隻能用于 B/S 結構的 WEB 開發,對于 C/S 結構的應用程式也一樣可以用。也就是說, Tomcat 等 WEB 伺服器和 Hiberate 沒有必然的依賴關系。

問:第 450 頁的 LogonAction.java 與CD光牒上的代碼不一緻

回:此項目的代碼按照開發進度,打成了不同的 CVS 版本(參考第 416 頁倒數第二段的說明)。CD光牒代碼上顯示的都是 CVS 上的最終版本,當然和書上的之前版本的代碼不同了。建議你先将CD光牒“ cvsfile ”目錄安裝到你的 CVS 上(安裝參見CD光牒所帶視訊),這樣就能從 CVS 上檢出前一個版本的代碼了。

問: JSP 程式連接配接 MySQL 資料庫出錯,出錯資訊如下:

HTTP Status 500 - 

……(省略)

root cause 

Unable to find a javac compiler; 

com.sun.tools.javac.Main is not on the classpath. 

Perhaps JAVA_HOME does not point to the JDK 

org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory.getCompiler(CompilerAdapterFactory.java:106)

答:從出錯資訊中的“ Perhaps JAVA_HOME does not point to the JDK  ”,可知原因是找不到 JDK ,是以 JSP 無法編譯。估計是你在安裝 Tomcat 時步驟有誤,檢查一下第 419 的“圖 23.7 ”這一步。如果還不行,那就設定一個指向 JDK 目錄的Windows 環境變量 JAVA_HOME 。

問:我按第 23 章成功安裝了 Tomcat5.0.28 和 lomboz ,但建立了一個 J2EE 項目後,怎麼不能在項目中啟動 Tomcat 了,控制台的錯誤資訊如下:

2005-8-3 10:17:18 org.apache.coyote.http11.Http11Protocol init 

嚴重 : Error initializing endpoint 

java.net.BindException: Address already in use: JVM_Bind:8081 

2005-8-3 10:17:18 org.apache.catalina.startup.Catalina load

答:注意到異常資訊中的“ Address already in use: JVM_Bind:8081 ”,得知 8081 端口已經被其他程式占用了。可能是你啟動了兩次 Tomcat ,或者是 8081 端口被其他 WEB 軟體占用了。

問:安裝Oralce後,Eclipse無法啟動,總報找不到jre的錯誤。

答:Eclipse隻有一個依賴,就是JRE(JAVA運作時環境)。Oralce自帶了一個jre1.3,是以可能會對我們裝JDK的jre1.4型成沖突,Eclipse不知道要定位哪一個jre。解決方法有如下三種:

(1)在windows環境變量裡,建立變量JAVA_HOME= C:\jdk,并把Path變量中c:\jdk\bin的位置提到前面

(2)運作Eclipse時加上參數:eclipse -vm c:\jdk\jre\bin\javaw

(3)将c:\jdk的jre目錄複制到C:\eclipse3.0.1\eclipse目錄下

問:我安裝的是最新版本eclipse3.1.1,按照書上的操作方法把多國語言包安裝後,已經實作大部分菜單漢化,但是還有一些菜單沒有漢化。然後我又把configuration檔案夾删除掉,重新打開eclipse卻出現錯誤,Eclipse無法啟動了。

(1)學習本書建議使用eclipse3.0.1版。

(2)eclipse3.1.1的語言包已經分成了兩個,你可能隻安裝了一個,是以漢化不完整。

(3)eclipse3.1.1不能删除configuaration目錄,裡面的config.ini必須保留。也可以在運作eclipse時加一個clean參數,如:eclipse.exe -clean

問:我在自己的電腦安裝了CVSNT,我也可以用Eclipse連上它,但我的同僚卻連不進來。為什麼?

答:連不上CVS的原因有很多種,你的情況很可能是Windows XP防火牆的原因,你關掉防火牆再試試吧。

問:行了,我把XP的防火牆關掉後,我同僚可以連進來了。不過,不用防火牆,那電腦就容易中毒,有更好的解決方法嗎?

答:防火牆是防黑客的,不是防病毒的。解決方法還是有的,你可以在防火牆的設定裡,把CVS服務的端口号打開。具體操作如下:控制台->進階->設定(T)...->服務->添加(D)...,打開"服務設定"視窗後,"服務描述"填"cvsnt服務";"計算機名稱"填你的計算名或IP;服務的外部内部端口号填2401。

問:用Canvas顯示圖檔,如果圖檔大,怎麼使用滾動條?

答:new Canvas(shell, SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL);

問:在運作Java應用程式時,可以連上資料庫。但當運作插件時(即"運作時工作台")卻連不上資料庫了,不知為何?

答:有可能是插件沒有找到mysql的jar連接配接包的原因。注意P299最後一段的說明。

問:我在"連接配接MySQL的測試程式"時出現了下面的錯誤,會不會是版本沖突的錯誤:

java.sql.BatchUpdateException: Syntax error or access violation message from server: "Unknown table engine 'lnnoDB'"

答:不是版本的錯誤,是你寫的"lnnoDB"有問題,它的第一個字母應該是字母I(大小寫不區分),不是數字1,也不是字母L。以後實踐時最好複制随書CD光牒上的代碼,以確定正确。

問:如何在RCP程式啟動時打開預設的Edit,該在那裡加代碼?

答:WorkbenchWindowAdvisor的繼承類,改寫它的postWindowOpen方法

問:在Text上加了addVerifyListener後,就不能将字元複制到text中了。請問有什麼好的方法既可以實作對輸入的校驗,又可以實作對複制的資料進行校驗。

答:你想将字元以複制的方式輸入到Text中,那麼就不要用addVerifyListener這種在輸入時就做實時檢查的方式。可以選擇在最後送出時,再去校驗資料的方式。

問:我想将浏覽器嵌入到Ecplise,請問怎麼做?

答:用org.eclipse.swt.browser.Browser類。

問:有的可視化元件在SWT Desiger找不到,ScrolledComposite。但是寫程式可以用它,就是沒法像button按扭直接拖放,是不是要自己定制一個這樣的元件用?

答:SWT Desiger中隻包含了一些常用的元件,如書中所強調,一定要學會脫離SWT Desiger這類UI設計工具自己手工寫界面代碼。

問:我在導入随書CD光牒中的項目後,在運作時提示:"類路徑引用的歸檔 D:/Eclipse/eclipse/language/eclipse/plugins/org.eclipse.core.runtime.nl1_3.0.1/nl1.jar 不存在。"請問是怎麼回事?如何運作CD光牒中的執行個體?

答:出這個錯誤,可能是因為

(1)你沒用和本書相同版本的Eclipse,或者Eclipse安裝目錄和本書的不一樣

(2)你沒有裝Eclipse語言包,或者Eclipse語言包安裝目錄和本書的不一樣

解決方法:把Eclipse的建構路徑中的對org.eclipse.core.runtime.nl1_3.0.1/nl1.jar重新指定到實際的位置就可以了(建構路徑在哪裡,請參考本書P444圖25.1)