知识大全 Eclipse插件开发中的Java项目模型

Posted 路径

篇首语:五陵年少金市东,银鞍白马渡春风。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Eclipse插件开发中的Java项目模型相关的知识,希望对你有一定的参考价值。

Eclipse插件开发中的Java项目模型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Java项目模型

  Eclipse的项目有很多种 包括Java项目 C++项目 C#项目等 每种项目都有自己的特点 我们最常接触到的项目就是Java项目 因此我们重点来讲解一下Java项目模型

  Java模型是用来对与创建 编辑和构建Java程序相关联的对象进行建模的一些类 Java模型类是在re中定义的 这些类实现资源的特定于Java的行为 并进一步将Java资源分解成模型元素

  Java模型的继承结构图如图 所示

>

  图 Java模型的继承结构图

  IJavaElement的子类接口还有IMethod IType等 在这里没有全部列出 Java模型中的类结构比较简单 级次也非常少

  下面介绍一下各个接口的主要方法

  ( ) IJavaElement

  exists 判断元素是否存在 处理Java元素与处理资源对象相似 当使用Java元素时 实际上是在使用某些底层的模型对象的句柄 必须使用exists()来确定元素是否真正存在于工作空间中

  getElementName 返回元素的名称

  getJavaModel 返回其对应的JavaModel 返回值类型是IJavaModel

  getJavaProject 返回元素对应的Java工程 返回值类型是IJavaProject

  getParent 返回父元素 返回值类型是IJavaElement

  getResource 返回元素对应的资源 返回值类型是IResource

  ( ) IClassFile

  此接口代表编译后的class二进制文件

  isClass 判断是否是Java类

  isInterface 判断是否是接口

  ( ) ICompilationUnit

  此接口代表Java源文件

  getAllTypes 返回此文件中定义的所有类型 返回值类型是IType[] 一个Java文件中可以定义多个类型

  getPrimary 返回主类型 返回值类型是ICompilationUnit

  ( ) IJavaModel

  此接口表示根 Java 元素 对应于工作空间 是所有具有 Java 性质的项目的父类 它对于Java项目的作用和IWorkspaceRoot对于IProject的作用相似

  contains 判断是否存在指定的资源

  getJavaProject 返回指定名字的Java项目 返回值类型是IJavaProject

  getJavaProjects 返回所有的Java项目 返回值类型是IJavaProject[]

  getWorkspace 返回所在的工作空间

  ( ) IJavaProject

  此接口表示Java项目

  IJavaElement findElement(IPath path) 返回项目的path路径下的Java元素

  IPackageFragment findPackageFragment(IPath path) 返回项目的path路径下的IPackageFragment

  IPackageFragmentRoot findPackageFragmentRoot(IPath path) 返回项目的path路径下的IPackageFragmentRoot

  findType 根据一个全名取得此元素的类型 此类有数个重载方法 返回值类型为IType

  getAllPackageFragmentRoots 返回所有的IPackageFragmentRoot 返回值类型是IPackageFragmentRoot[]

  getOutputLocation 返回输出路径 返回值类型是IPath

  getRequiredProjectNames 返回依赖项目 返回值类型是字符串数组

  setOutputLocation 设定输出路径

  ( ) IPackageFragment

  此接口表示整个包或者包的一部分

  createCompilationUnit 创建一个ICompilationUnit 返回值类型是ICompilationUnit

  getClassFile 返回指定名称对应的IClassFile 返回值类型是IClassFile

  getClassFiles 返回所有的IClassFile 返回值类型是IClassFile[]

  getCompilationUnit 返回指定名称对应的ICompilationUnit 返回值类型是ICompilationUnit

  getCompilationUnits 返回所有ICompilationUnit 返回值类型是ICompilationUnit[]

  getKind 判断此包是源码包还是普通包 返回值是int型 如等于IPackage FragmentRoot K_SOURCE则是源文件包 如等于IPackageFragmentRoot K_BINARY则为普通包

  hasSubpackages 是否有子包

  ( ) IPackageFragmentRoot

  此接口表示一组包段 并将各段映射至底层资源 它可以是文件夹 JAR或ZIP文件

  createPackageFragment 创建一个IPackageFragment 返回值类型是IPackage Fragment

  getKind 此包段是源码包段还是二进制包段 返回值类型是int 如果等于IPackageFragmentRoot K_SOURCE则是源文件包段 如果等于IPackageFragment Root K_BINARY则为二进制包段

  getPackageFragment 根据包名返回对应的IPackageFragment

  常用工具

  ( ) JavaCore(定义在re包下)

  JavaCore从Plugin继承 它是JDT插件的生命周期管理器 不过对于第三方插件开发人员来说 它的重要性更多地体现在它提供的一些工具类方法中

  IJavaElement create(IFile file) 从文件创建对应的Java元素

  IJavaElement create(IFolder folder) 从文件夹创建对应的Java元素

  IJavaProject create(IProject project) 得到IProject对应的IJavaProject

  IJavaElement create(IResource resource) 从资源创建对应的Java元素

  IJavaModel create(IWorkspaceRoot root) 从工作空间根目录得到对应的IJavaModel

  IClassFile createClassFileFrom(IFile file) 从文件创建对应的IClassFile

  ICompilationUnit createCompilationUnitFrom(IFile file) 从文件创建对应的ICompilationUnit

  ( ) JavaUI(定义在 eclipse jdt ui包下)

  JavaUI中定义了常用的Java插件界面相关的方法

  createPackageDialog 创建一个包选择对话框 返回值是SelectionDialog

  createTypeDialog 创建一个类型选择对话框 返回值是SelectionDialog

  IEditorPart openInEditor(IJavaElement element) 用编辑器打开指定的Java元素并返回编辑器实例

  revealInEditor(IEditorPart part IJavaElement element) 在编辑器中定位元素element

  插件开发中经常会碰到一些常用的技巧 掌握这些技巧可以极大地提高插件的开发效率 并且可以减小插件的体积 下面列出一些常见的技巧

  ( ) 由一个普通项目得到Java项目

  Java项目是一种特殊的项目 需要注意的是IJavaProject并不是从IProject继承的 不能将一个IProject对象强制转换成一个IJavaProject对象 也不能把一个IJavaProject实例赋值给IProject变量

  由IProject项目得到Java项目的方式

  IJavaProject javaPoject = JavaCore create(IProject);

  由IJavaProject得到IProject的方式

  调用IJavaProject的IProject getProject();

  ( )得到工作空间中的所有Java项目

  我们可以首先得到工作空间中的所有项目 然后逐个进行转换 不过这不免麻烦了一些 下面介绍更好的方式 IJavaModel是所有Java项目的根 通过它就可以得到所有的Java项目

  IWorkspaceRoot root = ResourcesPlugin getWorkspace() getRoot(); IJavaModel jModel = JavaCore create(root); IJavaProject jProject[] = jModel getJavaProjects();

  ( ) 打开Java编辑器并显示Java编译单元的特定成员

  代码如下

  void showMethod(IMember member) ICompilationUnit cu = member getCompilationUnit(); IEditorPart javaEditor = JavaUI openInEditor(cu); JavaUI revealInEditor(javaEditor member);

  ( ) 在工程下创建一个wnew包 并创建一个Hello java文件

  ( ) 打开【打开类型】对话框

  以下代码段使用 JavaUI 类来打开【打开类型】对话框

  new ProgressMonitorDialog(parent) SearchEngine createWorkspaceScope()

  用类似方法还可以创建【打开包】和【打开主要类型】对话框

  ( ) 打包指定的文件

  我们写一些工具的时候也许需要把文件打成jar包 然后进行发布到应用服务器等操作 调用JDT提供的类可简化这个操作(用到的打Jar包的类都在 eclipse ui jarpackager下)

  JarPackageData description= new JarPackageData(); IPath location= new Path( C:/cownew jar ); description setJarLocation(location); description setSaveManifest(true); description setManifestMainClass(mainType); description setElements(filestoExport); IJarExportRunnable runnable= description createJarExportRunnable(parentShell); new ProgressMonitorDialog(parentShell) run(true true runnable);

  参数mainType表示Jar包的main类 filestoExport为要打包的文件

  ( ) 自动设置Java项目的构建路径

  有一些插件会将需要的jar包自动设置到构建路径上 比如使用WTP的新建向导新建web项目的时候就会把web开发需要的jar包自动放入项目的构建路径 使用PDE的 将项目转换为插件项目 功能后项目的构建路径中就增加了插件依赖项的库 那么它们是怎么实现的呢?

  Java项目的构建路径有如下几种 源文件夹 二进制库 依赖项目 类路径变量和类路径容器

>

  图 源文件夹

>

  图 构建依赖项目

>

  图 Jar和类文件夹依赖

  每种不同的构建路径都有不同的作用 源文件夹是把源码进行构建的途径 二进制库是导入少量jar包的方式 依赖项目是供多项目分模块开发使用的 使用类路径变量可以避免二进制包的路径依赖 而类路径容器则为大量二进制库的引入提供了方便

  JDT为这些不同的构建路径提供了一个统一的接口 IClassPathEntry 只要调用IJavaProject的setRawClasspath方法就可以为项目设定构建路径

  可以看到setRawClasspath方法需要一个IClasspathEntry数组 数组中的元素就是要设置的每一个构建路径 前面提到的JavaCore类提供了一系列的静态方法来帮助我们生成不同的IClasspathEntry 而无须关注生成的细节 下面来看不同构建路径的添加方式

  ① 源文件夹 使用JavaCore newSourceEntry方法 下面的代码的作用是构造项目MyProject的源文件夹src的类路径条目

  JavaCore newSourceEntry(new Path( /MyProject/src ));

  ② 二进制库IClasspathEntry 使用JavaCore newLibraryEntry 方法 下面的代码就是构造MyProject的类文件lib的类路径条目

  Path( /MyProject/lib ) null null false);

  以下类路径条目具有源代码连接

  设定关联源代码包有利于代码的跟踪调试

  ③ 依赖项目 使用JavaCore newProjectEntry方法 下面的代码就是构造依赖项目MyFramework

  IClassPathEntry prjEntry = JavaCore newProjectEntry(new

  Path( /MyFramework ) true);

  ④ 类路径变量 使用JavaCore newVariableEntry方法 类路径变量对于整个工作空间来说是全局的 并且可以通过 JavaCore 方法 getClasspathVariable 和 setClasspathVariable 来处理

  可能会注册自动的类路径变量初始化方法 当启动工作空间时 通过扩展点 eclipse re classpathVariableInitializer来调用该类路径变量初始化方法

  以下类路径条目指示一个库 该库的位置存放在变量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);

  JavaCore setClasspathVariable( HOME new Path( d:/myInstall ) null);

  ⑤ 类路径容器 通过 JavaCore的getClasspathContainer和setClasspathContainer两个方法来处理类路径容器

  可能会注册一个自动的类路径容器初始化方法 当需要绑定容器时 通过扩展点 re classpathContainerInitializer来被动地调用类路径容器初始化方法

  以下类路径条目指示系统类库容器

  IClassPathEntry varEntry = JavaCore newContainerEntry( new Path( JDKLIB/default ) false); JavaCore setClasspathContainer( new Path( JDKLIB/default ) new IJavaProject[] myProject new IClasspathContainer[] new IClasspathContainer() public IClasspathEntry[] getClasspathEntries() return new IClasspathEntry[] JavaCore newLibraryEntry( new Path( d:/rt jar ) null null false); ; public String getDescription() return Basic JDK library container ; public int getKind() return IClasspathContainer K_SYSTEM; public IPath getPath() return new Path( JDKLIB/basic ); null);

  我们只要调用相应的方法创建我们的类路径条目就可以了 然后把这些条目组成的数组通过setRawClasspath方法设定到项目中 需要注意的是如果我们只把要添加的类路径条目传入 setRawClasspath方法的话 就会替换原有的项目构建路径 这常常是我们不希望的 可以调用IJavaProject的 readRawClasspath方法读取项目已有的设置 把我们要设置的构建路径添加到它的后面 然后再调用setRawClasspath方法设定新的项目构建路径

  在这个例子中 将要实现一个 为项目添加 lucene支持 的功能 用户在项目上右击 选择菜单中的【为项目添加lucene支持】命令以后 插件就会把lucene的jar包和源码包复制到项目的lib目录下 并且将jar包加入构建路径 如图 所示为增加lucene支持前的项目结构

>

  图 增加lucene支持之前的项目结构

  用户在项目上右击 在弹出的快捷菜单中选择【为项目添加lucene支持】命令后的项目结构如图 所示

>

  图 增加lucene支持之后的项目结构

  图 是项目的构建路径

>

  图 增加的lucene包

  首先新建一个插件工程 并将JDT相关的依赖项加入 然后添加一个 eclipse ui popupMenus的扩展点 如果不熟悉怎么添加 可以使用插件向导中的 弹出菜单 向导

  需要注意contribution的配置 如图 所示

>

  图 contribution的配置

  此插件只针对Java项目起作用 因此 objectClass中填入re IJavaProject;adaptable选择true;如果是用向导生成的那么请记住清空nameFilter 下面是核心类ActionAddLucene的实现代码

  System getProperty( file separator / ); JavaCore newLibraryEntry(project getFullPath() project LUCENESRCJAR) getFullPath() null new IClasspathEntry[oldPaths length + ]; LIB + FILESEPARATOR + LUCENEJAR); LIB + FILESEPARATOR + LUCENESRCJAR); IClasspathEntry entry) e getMessage() e));

  下面解释一下代码中的重点部分

  IClasspathEntry[] oldPaths = javaProject readRawClasspath();

  读取项目原有的构建路径条目

  IClasspathEntry luceneLibEntry = JavaCore newLibraryEntry( project getFile(LIB + FILESEPARATOR + LUCENEJAR) getFullPath() project getFile(LIB + FILESEPARATOR + LUCENESRCJAR) getFullPath() null false);

  这一句构建lucene的jar包

  第 个参数是二进制jar包的位置 我们的二进制jar包的位置为项目路径下的lib/lucene src jar

  第 个参数是jar包对应的源码包的位置

  第 个参数为源码包的根路径 因为有的源码jar包的源码根路径不是jar包的根路径 比如simplejta的源码jar包的格式如图 所示

>

  图 Jar包的结构

  对于这种情况就要指定第 个参数为 src lucene的源码包的源码根路径就是jar包的根路径 因此我们设置此参数为null

  第 个参数表示是否导出 我们设置为false

  ( ) URL luceneLib = Activator getDefault() getBundle() getEntry(RESOUCELIB + FILE SEPARATOR + LUCENEJAR);

  我们把 lucene jar lucene src jar 放到我们插件的 resoucelib 目录下 当用户单击【为项目添加lucene支持】的时候要把这两个文件复制到项目的lib目录下 因此需要首先读取插件路径 resoucelib 目录下的这两个jar包

  读取插件路径下的文件时我们使用插件Activator类提供的方法即可 比如如下调用

  就可以读取到插件根目录下的文件 config/my xml 返回类型是 URL

  ( ) copyURLToFile(luceneLib project LIB + FILESEPARATOR + LUCENEJAR);

  Activator getDefault() getBundle() getEntry读取到的文件位置是URL类型的 我们需要把这个URL对应的文件复制到项目的lib下 下面看一下copyURLToFile的主干代码

  URL类有一个openStream可以打开文件的输入流 IFile也有一个接受输入流的create方法用来创建文件 因此我们只需要把url的输入流输出给IFile的create方法即可

  这里我们也可以由url得到其对应的磁盘上的路径 也可以得到IFile对应的磁盘上的路径 然后使用Java IO来进行文件复制操作 但是这样做不仅代码数量变多了 而且由于使用的不是Eclipse的资源管理API 会带来无法自动刷新等问题 因此建议尽量使用Eclipse提供的API来完成此功能

cha138/Article/program/Java/ky/201311/28129

相关参考

知识大全 开发Eclipse插件

开发Eclipse插件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在本文中DavidGall

知识大全 Eclipse经典开发教程插件安装

Eclipse经典开发教程插件安装  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Eclipse

知识大全 Eclipse入门之使用指南及开发Eclipse插件 (2)

Eclipse入门之使用指南及开发Eclipse插件(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 关于Eclipse插件开发之定制向导(图)

关于Eclipse插件开发之定制向导(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Inv

知识大全 Eclipse 3.0 简介和插件开发示例

Eclipse3.0简介和插件开发示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Eclip

知识大全 基于Eclipse开发轻量级Spring插件

基于Eclipse开发轻量级Spring插件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要

知识大全 新Eclipse插件—为Java 、PHP和Rails的应用添加云托管功能

新Eclipse插件—为Java、PHP和Rails的应用添加云托管功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们

知识大全 Eclipse插件开发中实现刷新和重编译介绍

Eclipse插件开发中实现刷新和重编译介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在做

知识大全 JAVA开放源码项目与工具在企业应用开发中的运用

JAVA开放源码项目与工具在企业应用开发中的运用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 将eclipse创建的java转化为web项目

  FinishedNowyourjavaprojecthasbeenconvertedintoawebprojectcha138/Article/program/Java/ky/20131