Eclipse插件開發(fā)中的Java項目模型(總12頁_第1頁
Eclipse插件開發(fā)中的Java項目模型(總12頁_第2頁
Eclipse插件開發(fā)中的Java項目模型(總12頁_第3頁
Eclipse插件開發(fā)中的Java項目模型(總12頁_第4頁
Eclipse插件開發(fā)中的Java項目模型(總12頁_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Eclipse插件開發(fā)中的Java項目模型Eclipse插件開發(fā)中的Java項目模型是比較重要的內(nèi)容,也是我們最長接觸到的。本文將詳細的為大家講解Java項目模型。AD: Java項目模型 Eclipse的項目有很多種,包括Java項目、C+項目、C#項目等,每種項目都有自己的特點。我們最常接觸到的項目就是Java項目,因此我們重點來講解一下Java項目模型。Java模型是用來對與創(chuàng)建、編輯和構(gòu)建Java程序相關(guān)聯(lián)的對象進行建模的一些類。Java模型類是在org.eclipse.jdt.core中定義的。這些類實現(xiàn)資源的特定于Java的行為,并進一步將Java資源分解成模型元素。Java模型的

2、繼承結(jié)構(gòu)圖如圖3.13所示。圖3.13 Java模型的繼承結(jié)構(gòu)圖IJavaElement的子類接口還有IMethod、IType等,在這里沒有全部列出。Java模型中的類結(jié)構(gòu)比較簡單,級次也非常少。下面介紹一下各個接口的主要方法。(1) IJavaElementexists:判斷元素是否存在。處理Java元素與處理資源對象相似。當使用Java元素時,實際上是在使用某些底層的模型對象的句柄。必須使用exists()來確定元素是否真正存在于工作空間中。getElementName:返回元素的名稱。getJavaModel:返回其對應(yīng)的JavaModel,返回值類型是IJavaModel。getJa

3、vaProject:返回元素對應(yīng)的Java工程,返回值類型是IJavaProject。getParent:返回父元素,返回值類型是IJavaElement。getResource:返回元素對應(yīng)的資源,返回值類型是IResource。(2) IClassFile 此接口代表編譯后的class二進制文件。isClass:判斷是否是Java類。isInterface:判斷是否是接口。(3) ICompilationUnit 此接口代表Java源文件。getAllTypes:返回此文件中定義的所有類型,返回值類型是IType。一個Java文件中可以定義多個類型。getPrimary:返回主類型,返回值

4、類型是ICompilationUnit。(4) IJavaModel 此接口表示根 Java 元素,對應(yīng)于工作空間。是所有具有 Java 性質(zhì)的項目的父類。它對于Java項目的作用和IWorkspaceRoot對于IProject的作用相似。contains:判斷是否存在指定的資源。getJavaProject:返回指定名字的Java項目,返回值類型是IJavaProject。getJavaProjects:返回所有的Java項目,返回值類型是IJavaProject。getWorkspace:返回所在的工作空間。(5) IJavaProject 此接口表示Java項目。IJavaElemen

5、t findElement(IPath path):返回項目的path路徑下的Java元素。IPackageFragment findPackageFragment(IPath path):返回項目的path路徑下的IPackageFragment。IPackageFragmentRoot findPackageFragmentRoot(IPath path):返回項目的path路徑下的IPackageFragmentRoot。findType:根據(jù)一個全名取得此元素的類型,此類有數(shù)個重載方法,返回值類型為IType。getAllPackageFragmentRoots:返回所有的IPacka

6、geFragmentRoot,返回值類型是IPackageFragmentRoot。getOutputLocation:返回輸出路徑,返回值類型是IPath。getRequiredProjectNames:返回依賴項目,返回值類型是字符串數(shù)組。setOutputLocation:設(shè)定輸出路徑。(6) IPackageFragment 此接口表示整個包或者包的一部分。createCompilationUnit:創(chuàng)建一個ICompilationUnit,返回值類型是ICompilationUnit。getClassFile:返回指定名稱對應(yīng)的IClassFile,返回值類型是IClassFile。

7、getClassFiles:返回所有的IClassFile,返回值類型是IClassFile。getCompilationUnit:返回指定名稱對應(yīng)的ICompilationUnit,返回值類型是ICompilationUnit。getCompilationUnits:返回所有ICompilationUnit,返回值類型是ICompilationUnit。getKind:判斷此包是源碼包還是普通包,返回值是int型,如等于IPackage- FragmentRoot.K_SOURCE則是源文件包,如等于IPackageFragmentRoot.K_BINARY則為普通包。hasSubpacka

8、ges:是否有子包。(7) IPackageFragmentRoot 此接口表示一組包段,并將各段映射至底層資源,它可以是文件夾、JAR或ZIP文件。createPackageFragment:創(chuàng)建一個IPackageFragment,返回值類型是IPackage- Fragment。getKind:此包段是源碼包段還是二進制包段,返回值類型是int,如果等于IPackageFragmentRoot.K_SOURCE則是源文件包段,如果等于IPackageFragment- Root.K_BINARY則為二進制包段。getPackageFragment:根據(jù)包名返回對應(yīng)的IPackageFra

9、gment。常用工具類(1) JavaCore(定義在org.eclipse.jdt.core包下)JavaCore從Plugin繼承,它是JDT插件的生命周期管理器。不過對于第三方插件開發(fā)人員來說,它的重要性更多地體現(xiàn)在它提供的一些工具類方法中。IJavaElement create(IFile file):從文件創(chuàng)建對應(yīng)的Java元素。IJavaElement create(IFolder folder):從文件夾創(chuàng)建對應(yīng)的Java元素。IJavaProject create(IProject project):得到IProject對應(yīng)的IJavaProject。IJavaElement

10、create(IResource resource):從資源創(chuàng)建對應(yīng)的Java元素。IJavaModel create(IWorkspaceRoot root):從工作空間根目錄得到對應(yīng)的IJavaModel。IClassFile createClassFileFrom(IFile file):從文件創(chuàng)建對應(yīng)的IClassFile。ICompilationUnit createCompilationUnitFrom(IFile file):從文件創(chuàng)建對應(yīng)的ICompilationUnit。style=LINE-HEIGHT: 17.5pt; TEXT-INDENT: 21pt(2) JavaU

11、I(定義在org.eclipse.jdt.ui包下)JavaUI中定義了常用的Java插件界面相關(guān)的方法。createPackageDialog:創(chuàng)建一個包選擇對話框,返回值是SelectionDialog。createTypeDialog:創(chuàng)建一個類型選擇對話框,返回值是SelectionDialog。IEditorPart openInEditor(IJavaElement element):用編輯器打開指定的Java元素并返回編輯器實例。revealInEditor(IEditorPart part, IJavaElement element):在編輯器中定位元素element。插件開發(fā)

12、中經(jīng)常會碰到一些常用的技巧,掌握這些技巧可以極大地提高插件的開發(fā)效率,并且可以減小插件的體積。下面列出一些常見的技巧。(1) 由一個普通項目得到Java項目Java項目是一種特殊的項目,需要注意的是IJavaProject并不是從IProject繼承的。不能將一個IProject對象強制轉(zhuǎn)換成一個IJavaProject對象,也不能把一個IJavaProject實例賦值給IProject變量。由IProject項目得到Java項目的方式:IJavaProject javaPoject = JavaCore.create(IProject); 由IJavaProject得到IProject的方式

13、:調(diào)用IJavaProject的IProject getProject();(2)得到工作空間中的所有Java項目我們可以首先得到工作空間中的所有項目,然后逐個進行轉(zhuǎn)換。不過這不免麻煩了一些,下面介紹更好的方式。IJavaModel是所有Java項目的根,通過它就可以得到所有的Java項目:1. IWorkspaceRootroot=ResourcesPlugin.getWorkspace().getRoot(); 2. IJavaModeljModel=JavaCore.create(root); 3. IJavaProjectjProject=jModel.getJavaProjects(

14、);(3) 打開Java編輯器并顯示Java編譯單元的特定成員代碼如下:1. voidshowMethod(IMembermember) 2. ICompilationUnitcu=member.getCompilationUnit(); 3. IEditorPartjavaEditor=JavaUI.openInEditor(cu); 4. JavaUI.revealInEditor(javaEditor,member); 5. (4) 在工程下創(chuàng)建一個com.cownew包,并創(chuàng)建一個Hello.java文件(5) 打開【打開類型】對話框以下代碼段使用 JavaUI 類來打開【打開類型】對

15、話框:1. newProgressMonitorDialog(parent), 2. SearchEngine.createWorkspaceScope(),用類似方法還可以創(chuàng)建【打開包】和【打開主要類型】對話框。(6) 打包指定的文件我們寫一些工具的時候也許需要把文件打成jar包,然后進行發(fā)布到應(yīng)用服務(wù)器等操作,調(diào)用JDT提供的類可簡化這個操作(用到的打Jar包的類都在org.eclipse.ui.jarpackager下):1. JarPackageDatadescription=newJarPackageData(); 2. IPathlocation=newPath(C:/cownew

16、.jar); 3. description.setJarLocation(location); 4. description.setSaveManifest(true); 5. description.setManifestMainClass(mainType); 6. description.setElements(filestoExport); 7. IJarExportRunnablerunnable= 8. description.createJarExportRunnable(parentShell); 9. newProgressMonitorDialog(parentShell)

17、.run(true,true,runnable);參數(shù)mainType表示Jar包的main類,filestoExport為要打包的文件。(7) 自動設(shè)置Java項目的構(gòu)建路徑有一些插件會將需要的jar包自動設(shè)置到構(gòu)建路徑上,比如使用WTP的新建向?qū)陆╳eb項目的時候就會把web開發(fā)需要的jar包自動放入項目的構(gòu)建路徑,使用PDE的“將項目轉(zhuǎn)換為插件項目”功能后項目的構(gòu)建路徑中就增加了插件依賴項的庫。那么它們是怎么實現(xiàn)的呢?Java項目的構(gòu)建路徑有如下幾種:源文件夾、二進制庫、依賴項目、類路徑變量和類路徑容器。圖3.14 源文件夾圖3.15 構(gòu)建依賴項目圖3.16 Jar和類文件夾依賴每種不

18、同的構(gòu)建路徑都有不同的作用:源文件夾是把源碼進行構(gòu)建的途徑,二進制庫是導入少量jar包的方式,依賴項目是供多項目分模塊開發(fā)使用的,使用類路徑變量可以避免二進制包的路徑依賴,而類路徑容器則為大量二進制庫的引入提供了方便。JDT為這些不同的構(gòu)建路徑提供了一個統(tǒng)一的接口:IClassPathEntry,只要調(diào)用IJavaProject的setRawClasspath方法就可以為項目設(shè)定構(gòu)建路徑。可以看到setRawClasspath方法需要一個IClasspathEntry數(shù)組,數(shù)組中的元素就是要設(shè)置的每一個構(gòu)建路徑。前面提到的JavaCore類提供了一系列的靜態(tài)方法來幫助我們生成不同的IClass

19、pathEntry,而無須關(guān)注生成的細節(jié)。下面來看不同構(gòu)建路徑的添加方式。 源文件夾。使用JavaCore.newSourceEntry方法。下面的代碼的作用是構(gòu)造項目MyProject的源文件夾src的類路徑條目:JavaCore.newSourceEntry(new Path(/MyProject/src); 二進制庫IClasspathEntry。使用JavaCore.newLibraryEntry 方法。下面的代碼就是構(gòu)造MyProject的類文件lib的類路徑條目: Path(/MyProject/lib),null, null,false); 以下類路徑條目具有源代碼連接:設(shè)定關(guān)聯(lián)

20、源代碼包有利于代碼的跟蹤調(diào)試。 依賴項目。使用JavaCore.newProjectEntry方法。下面的代碼就是構(gòu)造依賴項目MyFramework:IClassPathEntry prjEntry = JavaCore.newProjectEntry(new Path(/MyFramework), true); 類路徑變量。使用JavaCore.newVariableEntry方法。類路徑變量對于整個工作空間來說是全局的,并且可以通過 JavaCore 方法 getClasspathVariable 和 setClasspathVariable 來處理。可能會注冊自動的類路徑變量初始化方法,

21、當啟動工作空間時,通過擴展點 org.eclipse. jdt.core.classpathVariableInitializer來調(diào)用該類路徑變量初始化方法。以下類路徑條目指示一個庫,該庫的位置存放在變量HOME中。使用變量SRC_HOME和SRC_ROOT來定義源代碼連接: IClassPathEntry varEntry = JavaCore.newVariableEntry( new Path(HOME/foo.jar), /庫路徑 new Path(SRC_HOME/foo_src.zip), /源碼歸檔路徑 new Path(SRC_ROOT), /源碼歸檔根路徑 true); J

22、avaCore.setClasspathVariable(HOME, new Path(d:/myInstall), null); 類路徑容器。通過 JavaCore的getClasspathContainer和setClasspathContainer兩個方法來處理類路徑容器。可能會注冊一個自動的類路徑容器初始化方法,當需要綁定容器時,通過擴展點 org.eclipse.jdt.core.classpathContainerInitializer來被動地調(diào)用類路徑容器初始化方法。以下類路徑條目指示系統(tǒng)類庫容器:1. IClassPathEntryvarEntry=JavaCore.newCo

23、ntainerEntry( 2. newPath(JDKLIB/default),false); 3. JavaCore.setClasspathContainer( 4. newPath(JDKLIB/default), 5. newIJavaProjectmyProject, 6. newIClasspathContainer 7. newIClasspathContainer() 8. publicIClasspathEntrygetClasspathEntries() 9. returnnewIClasspathEntry 10. JavaCore.newLibraryEntry( 1

24、1. newPath(d:/rt.jar),null,null,false); 12. ; 13. 14. publicStringgetDescription() 15. returnBasicJDKlibrarycontainer; 16. publicintgetKind()returnIClasspathContainer.K_SYSTEM; 17. publicIPathgetPath()returnnewPath(JDKLIB/basic); 18. 19. , 20. null);我們只要調(diào)用相應(yīng)的方法創(chuàng)建我們的類路徑條目就可以了,然后把這些條目組成的數(shù)組通過setRawClas

25、spath方法設(shè)定到項目中。需要注意的是如果我們只把要添加的類路徑條目傳入 setRawClasspath方法的話,就會替換原有的項目構(gòu)建路徑,這常常是我們不希望的??梢哉{(diào)用IJavaProject的 readRawClasspath方法讀取項目已有的設(shè)置,把我們要設(shè)置的構(gòu)建路徑添加到它的后面,然后再調(diào)用setRawClasspath方法設(shè)定新的項目構(gòu)建路徑。在這個例子中,將要實現(xiàn)一個“為項目添加 lucene支持”的功能,用戶在項目上右擊,選擇菜單中的【為項目添加lucene支持】命令以后,插件就會把lucene的jar包和源碼包復制到項目的lib目錄下,并且將jar包加入構(gòu)建路徑。如圖3.

26、17所示為增加lucene支持前的項目結(jié)構(gòu)。圖3.17 增加lucene支持之前的項目結(jié)構(gòu)用戶在項目上右擊,在彈出的快捷菜單中選擇【為項目添加lucene支持】命令后的項目結(jié)構(gòu)如圖3.18所示。圖3.18 增加lucene支持之后的項目結(jié)構(gòu)圖3.19是項目的構(gòu)建路徑。圖3.19 增加的lucene包首先新建一個插件工程,并將JDT相關(guān)的依賴項加入。然后添加一個org.eclipse.ui.popupMenus的擴展點,如果不熟悉怎么添加,可以使用插件向?qū)е械摹皬棾霾藛巍毕驅(qū)?。需要注意contribution的配置,如圖3.20所示。圖3.20 contribution的配置此插件只針對Java

27、項目起作用,因此 objectClass中填入org.eclipse.jdt.core.IJavaProject;adaptable選擇true;如果是用向?qū)傻哪敲凑堄涀∏蹇課ameFilter。下面是核心類ActionAddLucene的實現(xiàn)代碼:1. System.getProperty(file.separator,/); 2. JavaCore.newLibraryEntry(project 3. .getFullPath(),project 4. LUCENESRCJAR).getFullPath(),null, 5. newIClasspathEntryoldPaths.len

28、gth+1; 6. LIB+FILESEPARATOR+LUCENEJAR); 7. LIB+FILESEPARATOR+LUCENESRCJAR); 8. IClasspathEntryentry) 9. e.getMessage(),e);下面解釋一下代碼中的重點部分。1. IClasspathEntryoldPaths=javaProject.readRawClasspath();讀取項目原有的構(gòu)建路徑條目。1. IClasspathEntryluceneLibEntry=JavaCore.newLibraryEntry( 2. project.getFile(LIB+FILESEPAR

29、ATOR+LUCENEJAR).getFullPath(), 3. project.getFile(LIB+FILESEPARATOR+LUCENESRCJAR).getFullPath(), 4. null,false);這一句構(gòu)建lucene的jar包。第1個參數(shù)是二進制jar包的位置,我們的二進制jar包的位置為項目路徑下的lib/lucene-1.4.3-src.jar。第2個參數(shù)是jar包對應(yīng)的源碼包的位置。第3個參數(shù)為源碼包的根路徑,因為有的源碼jar包的源碼根路徑不是jar包的根路徑,比如simplejta的源碼jar包的格式如圖3.21所示。圖3.21 Jar包的結(jié)構(gòu)對于這種情況就要指定第2個參數(shù)為“sr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論