小菜毛毛技術(shù)分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

          #

               摘要: 8.4.2  建立AIDL服務的步驟(2) 在編寫上面代碼時應注意如下兩點: 使用bindService方法來綁定AIDL服務。其中需要使用Intent對象指定AIDL服務的ID,也就是<action>標簽中android:name屬性的值。 在綁定時需要一個ServiceConnection對象。創(chuàng)建ServiceConnection對象的過程中如果綁定成功,系統(tǒng)會調(diào)...  閱讀全文
          posted @ 2010-11-19 16:58 小菜毛毛 閱讀(569) | 評論 (0)編輯 收藏

               摘要: http://book.51cto.com/art/201006/207070.htm 建立AIDL服務的步驟(1) 建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下: (1)在Eclipse Android工程的Java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似于Java代碼,但會稍有不同。詳細介紹見實例52的內(nèi)容。 (2)如果aidl文件的內(nèi)容是正確的,ADT...  閱讀全文
          posted @ 2010-11-19 16:56 小菜毛毛 閱讀(1152) | 評論 (0)編輯 收藏

               摘要: http://blog.chinaunix.net/u3/90876/showart_2200991.html 在Android中, 每個應用程序都可以有自己的進程. 在寫UI應用的時候, 經(jīng)常要用到Service. 在不同的進程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進程內(nèi)存共享. 因此傳遞對象, 只能把對象拆分成操作系統(tǒng)能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,...  閱讀全文
          posted @ 2010-11-19 15:41 小菜毛毛 閱讀(4091) | 評論 (0)編輯 收藏

          http://zenz.ourcafe.mobi/archives/216

          在有APKTool之前,Android軟件的漢化是一件非常痛苦的事情。例如漢化狂人的漢化工具,那都是直接修改二進制文件的,首先 是尋找需要修改的字符串苦難(當然漢化狂人已經(jīng)做得不錯了),然后修改的字符串長度還要注意中文長度不能長過原來的文字……個中郁悶就不細說了。

          APKTool可以說是一個革命性的工具,有了APKTool之后,可以說,俺拽軟件的漢化工作到了一個前所未有的簡單程度。
          閑話不說,我們用漢化實例來證明APKTool的方便簡單,在動手之前,需要去 APKTool 的網(wǎng)站把工具下載下來。當然也可以下載我已經(jīng)打包的 APKTool.zip(Windows下使用)。

          確保你的電腦已經(jīng)安裝了JDK1.6(JRE1.6也可以),而且安裝了一個優(yōu)秀的編輯軟件(推薦UltraEdit),把APKTool解壓到隨便哪個你認為操作起來方便的目錄。如果都好了,我們動手吧:

          第一步,把需要漢化的文件(以漢化ColorNote為例)放到APKTool所在目錄,然后命令行進入APKTool目錄,執(zhí)行下面的命令:

          apktool  d  ColorNote.apk  ColorNote

          這句命令的意思是,對ColorNote.apk這個程序進行反編譯,獲得的文件放在當前目錄下的ColorNote目錄中。正常反編譯的話,能看到下面的提示:

          I: Baksmaling…
          I: Decoding resource table…
          I: Decoding resources…
          I: Copying assets and libs…

          反編譯完成,會在APKTool的目錄下面,出現(xiàn)一個名叫ColorNote的目錄,進去看看,是這個樣子的!

          用UltraEdit打開這個AndroidManifest.xml看看?哈哈,是純文本文件呀!在打開res目錄中的values中隨便一個文 件看看?也是純文本文件?。∫簿褪钦f,只要一個UltraEdit,我們就可以輕輕松松進行漢化了(就把需要的字符串轉(zhuǎn)換成中文就可以了,也不用考慮長度 了?。┲劣谝獫h化哪些內(nèi)容,這個大家自己研究吧,不用我詳細說,也沒有辦法詳細說的吧?(事實上,除了XML的文本資源文件外,老外寫的很多程序,字符串 都是hard coding在執(zhí)行代碼里面的,APKTool反編譯會得到smali偽代碼,有些在XML資源里面找不到的字符串,去看看smali的代碼吧。)

          中間的翻譯過程我們跳過去,例如我們已經(jīng)翻譯好了,就在APKTool目錄下執(zhí)行下面的命令行:

          apktool b ColorNote

          這條命令是告訴APKTool,把這個ColorNote目錄里的東西編譯打包成APK程序

          I: Checking whether sources has changed…

          I: Smaling…

          I: Checking whether resources has changed…

          I: Building resources…

          I: Building apk file…

          生成的APK程序在哪里呢?在ColorNote\Dist目錄里面,名字是out.apk

          我們把這個out.apk文件簽名之后安裝看看?哈哈!完美中文漢化的俺拽程序來了!(當然,這要看漢化者的功力了。)

          Popularity: 76%

          posted @ 2010-11-19 09:51 小菜毛毛 閱讀(403) | 評論 (0)編輯 收藏

          http://www.cn-java.com/www1/?action-viewnews-itemid-3054
          ... set CATALINA_HOME=C:\Tomcat4.1.29 set CLASSPATH=%JAVA_HOME%\lib\tools.jar set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar ... 如果你的安裝路徑(installation paths)和上面使用的不同,你需要更正它們,然后關(guān)閉和重啟Tomcat以使它們生效。這樣,你就有為運行SOAP作好了準備。但是現(xiàn)在,我要忘記有 關(guān)的技術(shù)部分,來學一點理論知識。 SOAP意思是簡單對象訪問協(xié)議(Simple Object Access Protocol)。的確如它的名字一樣,SOAP是很簡單的。它是一個基于XML的協(xié)議,允許程序組件和應用程序彼此使用一種標準的Internet協(xié) 議--HTTP來通訊。SOAP是一種獨立的平臺,它不依賴程序語言,它是簡單的,彈性的,很容易擴展的。目前,應用程序能夠彼此使用一種基于DCOM和 CORBA技術(shù)的遠程過程調(diào)用(RPC)來進行相互通訊,但HTTP不被設(shè)計為這個目的。RPC在Internet上應用是非常困難的,它們會出現(xiàn)許多兼 容性和安全性的問題,因為防火墻和代理服務器通常都會阻斷(block)這些類型的流量。應用程序之間最好的通訊方式是通過HTTP協(xié)議,因為HTTP是 支持所有Internet瀏覽器和服務器的?;谶@個目的,SOAP協(xié)議被創(chuàng)建出來。 那么,它們是如何運作的呢?比如,一個應用程序(A)需要和另一個應用程序(B)在SOAP的幫助下進行彼此通訊。它們將使用下面的框架圖來完成這個 過程: 這個SOAP信封(SOAP envelope)是一個包含以下內(nèi)容的XML文檔: 正如你看到的,它是非常簡單的。它看起來確實就象一個普通的信封或者你的email。你想看看它們是如何動作的嗎?下面跟我們一起來吧。其實我們有很多方 法是不用SOAP來在創(chuàng)建和運行我們自己的“Hello World”應用程序的,但是因為我們要保持它的簡單性,我會給你一個它運作方式的框架圖(scheme)。 我們的“Hello World”范例會包含一個SOAP Service。我們的SOAP Client將發(fā)送它們的名字到該SOAP Service,并試圖得到一些答復或響應。這個SOAP Service需要部署到一個SOAP Admin的工具,以至重定位所有請求的SOAP(Proxy) RPC Router能夠知道它們應該使用哪種服務來運作??偠灾?,這個是以下面的方式來運作的: 現(xiàn)在,我們來一步步的看看到底發(fā)生了什么。在Step 1里,HelloWorldClient將連接一個SOAP RPC Router,請求我們的SOAP Service并將包含我們名字的一個字符串傳遞給它。該SOAP RPC Router會檢查是否它已經(jīng)部署了這個SOAP Service。如果它被發(fā)現(xiàn)是被部署的,那么它將傳遞數(shù)據(jù)到這個SOAP Service并調(diào)用特定的方法,這個是Step 2。然后SOAP Service方法會被執(zhí)行,將返回某個字符串值(該值就是SOAP Client的答復或者響應)(Step 3)。在Step4中,SOAP RPC Router將僅僅只是重定向這個數(shù)據(jù)到SOAP Client。所有在Step1和Step4里傳輸?shù)臄?shù)據(jù)是通過SOAP Envelope來完成的。正如你所看到的,算法是相當簡單的,因此我們只準備關(guān)心實際的代碼。 首先,我們要創(chuàng)建一個SOAP Service。下面是它的代碼,請不要忘記將它放入HelloWorld/ 目錄中(必須被包含在你的CLASSPATH中): 1: // SOAPService.java 2: package HelloWorld; 3: public class SOAPService { 4: public String sayHi(String x) { 5: return("Hello my friend, " + x + "! Glad to see you!"); 6: } 7: } 添加任何注釋也是很容易的。要編譯它,只需要用下列命令: javac SOAPService.java 第二步,一旦我們準備好了SOAP Service,我們需要用SOAP Service Manager來部署它。這個可以通過很多方式來實現(xiàn),但是為了能讓初學SOAP的讀者更容易理解SOAP,我提供了一個最容易的方式。我們假設(shè)你的 Web Server(Tomcat或其他)已經(jīng)正常運行,并且你已經(jīng)正確安裝了SOAP。那么當瀏覽器訪問http://localhost:8080 /soap/,你會看見Apache SOAP的歡迎頁面。點擊Run the admin client ,然后 Deploy。你會得到一個屏幕顯示,在那里你需要填入ID,Scope,Method,Provider Type和JAVA Provider的信息到表單域中。你能忽略其他所有的表單域,除非你真的需要它們的信息。我們的“HelloWorld”例子不需要它們,所以,我們填 的下面的值: ID: urn:HelloWorld_SOAPService Scope: Application Methods: sayHi Provider Type: java Java Provider - Provider Class: HelloWorld.SOAPService Java Provider - Static? No 一些注釋:ID是我們要從SOAP Client標識我們的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java類的名字。 現(xiàn)在,點擊Deploy 按鈕,那么你的服務會被部署。再次強調(diào),請注意正確設(shè)置CLASSPATH環(huán)境變量。然后,你的HelloWorld.SOAPService類能夠被找 到,并且所有必需的jar包也能被找到。這是個幾乎每個人都會犯的普通錯誤?,F(xiàn)在,你能夠點擊 List ,將會看見你的服務已經(jīng)被部署進來。恭喜! 最后,讓我們來創(chuàng)建一個SOAP Client。代碼看起來有點復雜,但是在現(xiàn)實中不會只有這么點長。 1: // HelloWorldClient.java 2: import java.io.*; 3: import java.net.*; 4: import java.util.*; 5: import org.apache.soap.*; 6: import org.apache.soap.rpc.*; 7: public class HelloWorldClient { 8: public static void main(String[] arg) throws Exception { 9: Call c = null; 10: URL url = null; 11: Vector params = null; 12: Response rep = null; 13: String ourName = "Superman"; 14: String ourUrn = "urn:HelloWorld_SOAPService"; 15: String ourMethod = "sayHi"; 16: url = new URL("http://localhost:8080/soap/servlet/ rpcrouter"); 17: System.out.println("Passing to our deployed "+ourUrn+" our name ("+ourName+"): "); 18: c = new Call(); 19: c.setTargetObjectURI(ourUrn); 20: c.setMethodName(ourMethod); 21: c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); 22: params = new Vector(); 23: params.addElement(new Parameter("ourName", String.class, ourName, null)); 24: c.setParams(params); 25: System.out.print("and its answer is: "); 26: rep = c.invoke(url, ""); 27: if (rep.generatedFault()) { 28: Fault fault = rep.getFault(); 29: System.out.println("\nCall failed!"); 30: System.out.println("Code = " + fault.getFaultCode()); 31: System.out.println("String = " + fault.getFaultString()); 32: } else { 33: Parameter result = rep.getReturnValue(); 34: System.out.print(result.getValue()); 35: System.out.println(); 36: } 37: } 38:} 下面我要做一些解釋。在第13行,我們設(shè)置了我們的名字,這個名字將會傳遞給SOAP Service。在第14行,我們設(shè)置了我們將要調(diào)用的服務的ID(service ID),和第15行里設(shè)置的服務方法(service method)。有了這個ID,服務能夠被部署到SOAP服務管理器(SOAP Service Manager)中。我們沒有設(shè)置任何其他值,僅僅只用剛才那些基礎(chǔ)值就可以正常運作了。你能從SOAP的官方文檔上得到相關(guān)信息,該文檔來自SOAP包 中,它們的解釋超出了本文的范圍。 用以下方式編譯這個SOAP Client: javac HelloWorldClient.java 為了圓滿完成它,讓我們檢查一下針對我們的測試,是否所有事情都準備就緒。Tomcat正在運行,所有的環(huán)境變量都正確,SOAP Service被編譯和部署,SOAP Client被成功編譯。OK,讓我們運行它,你將看到這個屏幕: 正如你所看到的,我們的SOAP Client使用SOAP協(xié)議成功發(fā)送它的名字和接收了一個答復。正如前面所說的,SOAP Service發(fā)送和接收的是SOAP envelope。這個是SOAP envelope的源代碼。 被發(fā)送到SOAP Service的SOAP Envelope <?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/ soap/envelope/" xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/ soap/encoding/"> <ourName xsi:type="xsd:string">Superman</ourName> </ns1:sayHi> </SOAP-ENV:Body> </SOAP-ENV:Envelope>: 從SOAP Service接收的SOAP Envelope <?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/ soap/envelope/" xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap. org/soap/encoding/"> <return xsi:type="xsd:string">Hello my friend, Superman! Glad to see you!</return> </ns1:sayHiResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 要理解SOAP Envelope中的所有標簽的含義,我建議你花一點時間閱讀 http://www.w3.org/2001/06/soap-envelope 命名空間規(guī)范。 我希望本文能夠在你理解SOAP技術(shù)上有一定幫助。這個技術(shù)是簡單的,有趣的,強大的,彈性的。它被用在許多Web
          posted @ 2010-11-18 10:22 小菜毛毛 閱讀(891) | 評論 (0)編輯 收藏

          做客戶端有必要對soap做基本的了解,開發(fā)手機的程序員可能對web service不是太了解。
          soap簡單說是基于xml的,建立在http協(xié)議上的協(xié)議,用來調(diào)用web server提供的service。
          這里轉(zhuǎn)載一個對soap的簡單原理,希望對大家有幫助

          什么是Web Services
            
            從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調(diào)用的API。也就是說,可以利用編程的方法通過Web來調(diào)用這個應用程序。
            
            對Web service 更精確的解釋: Web services是建立可互操作的分布式應用程序的新平臺。Web service平臺是一套標準,它定義了應用程序如何在Web上實現(xiàn)互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service ,只要我們可以通過Web service標準對這些服務進行查詢和訪問。
            
            不管你的Web service是用什么工具,什么語言寫出來的,只要你用SOAP協(xié)議通過HTTP來調(diào)用它,總體結(jié)構(gòu)都一致。通常,你用你自己喜歡的語言(如VB 6或者VB.NET)來構(gòu)建你的Web service,然后用SOAP Toolkit或者.NET的內(nèi)建支持來把它暴露給Web客戶。于是,任何語言,任何平臺上的客戶都可以閱讀其WSDL文檔,以調(diào)用這個Web service。客戶根據(jù)WSDL描述文檔,會生成一個SOAP請求消息。Web service都是放在Web服務器 (如IIS) 后面的,客戶生成的SOAP請求會被嵌入在一個HTTP POST請求中,發(fā)送到Web服務器來。Web服務器再把這些請求轉(zhuǎn)發(fā)給Web service請求處理器。請求處理器的作用在于,解析收到的SOAP請求,調(diào)用Web service,然后再生成相應的SOAP應答。Web服務器得到SOAP應答后,會再通過HTTP應答的方式把它送回到客戶端。

          iGoogle 發(fā)表于 2010-10-24 17:00

          基本概念
            
            SOAP
            
            XML和XSD
            
            WSDL(Web Services Description Language)
            
            WSML(Web Services Meta Language)
            
            什么時候使用Web Services
            
            Web service是創(chuàng)建可互操作的分布式應用程序的新平臺。Web service 的主要目標是跨平臺的可互操作性。為了達到這一目標,Web service 是完全基于XML、XSD等獨立于平臺、獨立于軟件供應商的標準的。
            
            Web service在應用程序跨平臺和跨網(wǎng)絡進行通信的時候是非常有用的。Web service適用于應用程序集成、B2B集成、代碼和數(shù)據(jù)重用,以及通過Web進行客戶端和服務器的通信的場合。
            
            當然,Web service也不是萬能的,你不能到處濫用Web service。在有些情況下,Web service 會降低應用程序的性能,而不會帶來任何好處。例如,一臺機器或一個局域網(wǎng)里面運行的同構(gòu)應用程序就不應該用Web service 進行通信。
            
            如何調(diào)用Web Services
            
            客戶端:取得服務端的服務描述文件WSDL,解析該文件的內(nèi)容,了解服務端的服務信息,以及調(diào)用方式。根據(jù)需要,生成恰當?shù)腟OAP請求消息(指定調(diào)用的方法,已經(jīng)調(diào)用的參數(shù)),發(fā)往服務端。等待服務端返回的SOAP回應消息,解析得到返回值。


            服務端:生成服務描述文件,以供客戶端獲取。接收客戶端發(fā)來的SOAP請求消息,解析其中的方法調(diào)用和參數(shù)格式。根據(jù)WSDL和WSML的描述,調(diào)用相應的COM對象來完成指定功能,并把返回值放入SOAP回應消息返回給用戶。
            
            高層接口
            
            使用高層接口,不需要知道SOAP和XML的任何信息,就可以生成和使用一個WebService。Soap Toolkit 2.0通過提供兩個COM對象――SoapClient和SoapServer,來完成這些功能。
            
            在客戶端,只需要生成一個SoapClient實例,并用WSDL作為參數(shù)來調(diào)用其中的mssoapinit方法。SoapClient對象會自動解析 WSDL文件,并在內(nèi)部生成所有Web Service的方法和參數(shù)信息。之后,你就可以像調(diào)用IDispatch接口里的方法一樣,調(diào)用里面所有的方法。在VB或是腳本語言里,你甚至可以直接在SoapClient對象名后面直接加上.方法(參數(shù)…)進行調(diào)用。
            
            低層接口
            
            要使用低層接口,你必須對SOAP和XML有所了解。你可以對SOAP的處理過程進行控制,特別是要做特殊處理的時候。
            
            在客戶端,首先要創(chuàng)建一個HttpConnector對象,負責HTTP連接。設(shè)定Connector的一些頭部信息,比如EndPoinURL和 SoapAction等。如果網(wǎng)絡連接需要使用代理服務器,那也要在這里設(shè)定相關(guān)的信息。接著創(chuàng)建SoapSerializer對象,用于生成Soap消息。按照WSDL里定義,把所有參數(shù)按順序序列化,得到一個完整的SOAP請求消息。該Soap消息,作為Payload通過HttpConnector 被發(fā)送到服務端。最后,生成一個
          posted @ 2010-11-15 16:57 小菜毛毛 閱讀(12111) | 評論 (0)編輯 收藏

               摘要: Activity Android中,Activity是所有程序的根本,所有程序的流程都運行在Activity之中,Activity具有自己的生命周期(見http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系統(tǒng)控制生命周期,程序無法改變,但可以用onSaveInstanceState保存其狀態(tài))。 對于Activity,關(guān)...  閱讀全文
          posted @ 2010-11-15 14:13 小菜毛毛 閱讀(452) | 評論 (0)編輯 收藏

          手機上的應用程序,別人的界面設(shè)計的很漂亮,很想知道別人的怎么設(shè)計的,我應該怎么做呢?
          在沒有遇到這個工具前 我是通過破解別人的程序去查看他的設(shè)計的。
          那天無意中在 tools這個文件夾下發(fā)現(xiàn)這個文件 hierarchyviewer.bat,Google一下發(fā)現(xiàn)幫你分析應用程序UI布局。
          現(xiàn)在我們開始使用它吧:
          第一步,雙擊(廢話),出現(xiàn)一個灰色的界面,大家不要急,這是因為它沒有發(fā)現(xiàn)運行的android程序呢
          第二步:啟動android程序,(或者連接android手機),你會發(fā)現(xiàn)在 Hierarchy Viewer 的 Devices里有 emulator-5554(這個是我的模擬器),然后選擇 start servier
          如圖


          選擇 MainActivity,點擊Load view Hierarchy
          如圖


          你還可以通過左下角的按鈕交換到界面視圖



          這就是你手機上看到的效果,看到藍色的細線沒有?你可以拖動他,右邊會顯示他的顏色的坐標
          你也可以把這些東西導出來,怎么樣 好用吧
          posted @ 2010-11-15 13:31 小菜毛毛 閱讀(359) | 評論 (1)編輯 收藏

               摘要: 轉(zhuǎn)載自:http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 在android開發(fā)中ListView是比較常用的組件,它以列表的形式展示具體內(nèi)容,并且能夠根據(jù)數(shù)據(jù)的長度自適應顯示。抽空把對ListView的使用做了整理,并寫了個小例子,如下圖。    列表的顯示需要三個元素: 1.ListVeiw ...  閱讀全文
          posted @ 2010-11-14 16:28 小菜毛毛 閱讀(2049) | 評論 (0)編輯 收藏

          javac -classpath的使用: 

          javac:如果當前你要編譯的java文件中引用了其它的類(比如說:繼承),但該引用類的.class文件不在當前目錄下,這種情況下就需要在javac命令后面加上-classpath參數(shù),通過使用以下三種類型的方法 來指導編譯器在編譯的時候去指定的路徑下查找引用類。 

          (1).絕對路徑:javac -classpath c:\junit3.8.1\junit.jar   Xxx.java 
          (2).相對路徑:javac -classpath ..\junit3.8.1\Junit.javr  Xxx.java 
          (3).系統(tǒng)變量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系統(tǒng)變量CLASSPATH的值進行查找,這里假設(shè)Junit.jar的路徑就包含在CLASSPATH系統(tǒng)變量中) 

          javac 絕對路徑的使用: 

          javac:假設(shè)你要編譯的類文件名叫:HelloWorld.java,其完全路徑為:D:\java\HelloWorld.java。但你所在的當前目錄是:C:\Documents and Settings\peng>。如果想在這里執(zhí)行編譯,會有什么結(jié)果呢? 

          (1).C:\Documents and Settings\peng> javac HelloWorld.java 這時編譯器會給出如下的錯誤提示信息: 
          error: cannot read: HelloWorld.java 
          這是因為默認情況下javac是在當前目錄下查找類文件,很明顯這個路徑不是我們存放類文件的地方,所以就會報錯了 
                  
          (2).C:\Documents and Settings\peng>javac D:\java\HelloWorld.java 
          這時編譯成功。 
          所以,只要你執(zhí)行javac命令的目錄不是類文件存放的目錄,你就必須在javac命令中顯式地指定類文件的路徑。 

          java -classpath的使用: 

          java:假設(shè)我們的CLASSPATH設(shè)置為:D:\peng\java\pro ,在該目錄下有三個文件:HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。這三個文件的類聲明分別如下: 

          HelloWorld.java :public class HelloWorld 
          HelloWorldExtendsHelloWorld.java :public class HelloWorldExtendsHelloWorld extends HelloWorld 
          HelloWorldExtendsTestCase.java:public class HelloWorldExtendsTestCase extends junit.framework.TestCase 

                假設(shè)我們已經(jīng)按照上面關(guān)于javac -classpath和javac 絕對路徑的使用,順利地完成了三個文件地編譯?,F(xiàn)在我們在C:\Documents and Settings\peng>目錄下執(zhí)行這三個.class文件 

          (1).C:\Documents and Settings\peng>java  HelloWorld 
                Hello World 

          可以看到執(zhí)行成功。為什么我們在 C:\Documents and Settings\peng>執(zhí)行命令,JVM能夠找到D:\peng\java\pro\HelloWorld.class文件呢?這是因為我們配置了系統(tǒng)變量CLASSPATH,并且指向了目錄:D:\peng\java\pro 。所以JVM會默認去該目錄下加載類文件,而不需要指定.class文件的絕對路徑了。 
                   
          (2).C:\Documents and Settings\peng>java HelloWorldExtendsHelloWorld 
                 Hello World 

          可以看到執(zhí)行成功了。HelloWorldExtendsHelloWorld繼承了HelloWorld類,所以在執(zhí)行時JVM會先查找在CLASSPATH下是否存在一個HelloWorld.class文件,因為我們已經(jīng)成功編譯了HelloWorld 類了,所以可以成功執(zhí)行HelloWorldExtendsHelloWorld.class 
            
          (3).C:\Documents and Settings\peng>java HelloWorldExtendsTestCase 
               Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase 

          可以看到程序拋出異常了,提示找不到junit.framework.TestCase文件。為什么同樣在:\peng\java\pro 下,HelloWorldExtendsHelloWorld.class就可以成功執(zhí)行,而這個就不行了呢?這是因為:            junit.framework.TestCase.class文件并不存在于當前目錄下,所以為了能夠讓程序成功運行,我們必須通過指定CLASSPATH的方式,讓JVM可以找到junit.framework.TestCase這個類,如(4): 

          (4). C:\Documents and Settings\peng>java -classpath %CLASSPATH% HelloWorldExtendsTestCase 
                Hello World 

          總結(jié): 

          (1).何時需要使用-classpath:當你要編譯或執(zhí)行的類引用了其它的類,但被引用類的.class文件不在當前目錄下時,就需要通過-classpath來引入類 
          (2).何時需要指定路徑:當你要編譯的類所在的目錄和你執(zhí)行javac命令的目錄不是同一個目錄時,就需要指定源文件的路徑(CLASSPATH是用來指定.class路徑的,不是用來指定.java文件的路徑的) 

          [轉(zhuǎn)自: 
          http://blog.csdn.net/pengpenglin/ 
          http://www.aygfsteel.com/pengpenglin/ 
          ] 
          posted @ 2010-10-19 22:32 小菜毛毛 閱讀(10741) | 評論 (0)編輯 收藏

          僅列出標題
          共17頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 孟连| 柞水县| 宁国市| 同心县| 福州市| 晴隆县| 交口县| 大英县| 富川| 固阳县| 博湖县| 武定县| 容城县| 吉林省| 克什克腾旗| 丰县| 建德市| 定州市| 托克逊县| 和田市| 潮安县| 虎林市| 永济市| 桑日县| 涡阳县| 临泽县| 潍坊市| 正宁县| 额尔古纳市| 无为县| 蒲城县| 南皮县| 成武县| 安多县| 泰来县| 宜都市| 临沭县| 梓潼县| 新宁县| 丘北县| 新兴县|