注册
 找回密码
 注册
江西广告网
查看: 353|回复: 0
打印 上一主题 下一主题

为项目自动添加构建路径

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2008-12-30 11:15:18 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
CowNew 开源团队网站 www.cownew.com 论坛 http://www.cownew.com/newpeng/ 转载请保留此信息 有一些插件会自动将需要的jar包自动设置到构建路径上,比如使用WTP的新建向导新建web项目的时候就会把web开发需要的jar包自动放入项目的构建路径,使用PDE的“将项目转换为插件项目”功能后项目的构建路径中就增加了插件依赖项的库。我这里来演示一下其实现: 在这个例子中,我们想要做一个“为项目添加lucene支持”的功能,用户在项目上点击右键,选择菜单中的“为项目添加lucene支持”以后,插件把lucene的jar包和源码包拷贝到项目的lib目录下,并且将jar包加入构建路径。如下图: 这是增加lucene支持前的项目结构: 用户在项目上点击右键,选择菜单中的“为项目添加lucene支持”后的项目结构 这是工程构建路径 ①新建一个插件工程,并将JDT相关的依赖项加入。 ②添加一个“org.eclipse.ui.popupMenus”的扩展点,如果不熟悉怎么添加,可以使用插件向导中的“弹出菜单”向导。 需要注意contribution的配置, 此插件只针对Java项目才起作用,因此“objectClass”中填入“org.eclipse.jdt.core.IJavaProject”; adaptable选择“true”(后边讲解为什么); 如果是用向导生成的那么请记得清空“nameFilter”。 ③下面是核心类ActionAddLucene 的实现代码 public class ActionAddLucene implements IObjectActionDelegate { private static final String FILESEPARATOR = System.getProperty("file.separator","/"); private static final String LUCENESRCJAR = "lucene-1.4.3-src.jar"; private static final String LUCENEJAR = "lucene-1.4.3.jar"; private static final String LIB = "lib"; private static final String RESOUCELIB = "resoucelib"; private IStructuredSelection structSelection; public ActionAddLucene() { super(); } public void setActivePart(IAction action, IWorkbenchPart targetPart) { } public void run(IAction action) { Object selectObj = structSelection.getFirstElement(); if (selectObj instanceof IProject) { IProject project = (IProject) selectObj; IJavaProject javaProject = JavaCore.create(project); IClasspathEntry[] oldPaths = javaProject.readRawClasspath(); IClasspathEntry luceneLibEntry = JavaCore.newLibraryEntry(project .getFile(LIB FILESEPARATOR LUCENEJAR).getFullPath(), project .getFile(LIB FILESEPARATOR LUCENESRCJAR).getFullPath(), null, false); if(classPathExists(oldPaths,luceneLibEntry)) { return; } URL luceneLib = Activator.getDefault().getBundle().getEntry( RESOUCELIB FILESEPARATOR LUCENEJAR); URL luceneSrc = Activator.getDefault().getBundle().getEntry( RESOUCELIB FILESEPARATOR LUCENESRCJAR); IClasspathEntry[] newPaths = new IClasspathEntry[oldPaths.length 1]; System.arraycopy(oldPaths, 0, newPaths, 0, oldPaths.length); IFolder libFolder = project.getFolder(LIB); if (!libFolder.exists()) { try { libFolder.create(true, true, null); } catch (CoreException e) { handleException(e); } } copyURLToFile(luceneLib, project, LIB FILESEPARATOR LUCENEJAR); copyURLToFile(luceneSrc, project, LIB FILESEPARATOR LUCENESRCJAR); newPaths[oldPaths.length] = luceneLibEntry; try { javaProject.setRawClasspath(newPaths, null); } catch (JavaModelException e) { handleException(e); } } } private static boolean classPathExists(IClasspathEntry[] entrys,IClasspathEntry entry) { for(int i=0,n=entrys.length;i<n;i ) { if(entrys[i].getPath().equals(entry.getPath())) { return true; } } return false; } private static void handleException(Exception e) { Activator.getDefault().getLog().log( new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, e .getMessage(), e)); } private static void copyURLToFile(URL url, IProject project, String destFileName) { InputStream inStream = null; try { inStream = url.openStream(); IFile file = project.getFile(destFileName); if (!file.exists()) { file.create(inStream, true, null); } } catch (IOException e) { handleException(e); } catch (CoreException e) { handleException(e); } finally { try { if (inStream != null) inStream.close(); } catch (IOException e) { handleException(e); } } } public void selectionChanged(IAction action, ISelection selection) { structSelection = (IStructuredSelection) selection; } } 下面解释一下代码中的重点部分: ①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-1.4.3-src.jar; 第二个参数是jar包对应的源码包的位置; 第三个参数为源码包的根路径,lucene的源码包的源码根路径就是jar包的根路径,因此我们置此参数为null; 第四个参数表示是否导出,我们置为false; ③URL luceneLib = Activator.getDefault().getBundle().getEntry(RESOUCELIB FILESEPARATOR LUCENEJAR); 我们把“lucene-1.4.3.jar”、“lucene-1.4.3-src.jar”放到我们插件的“resoucelib”目录下,当用户点击“为项目添加lucene支持”的时候我们要把这两个文件拷贝到项目的lib目录下,因此我们需要首先读取插件路径“resoucelib”目录下的这两个jar包。 读取插件路径下的文件我们使用插件Activator类提供的方法即可,比如: Activator.getDefault().getBundle().getEntry(“config/my.xml”) 就可以读取到插件根目录下的文件“config/my.xml”,返回类型是java.net.URL。 ④copyURLToFile(luceneLib, project, LIB FILESEPARATOR LUCENEJAR); Activator.getDefault().getBundle().getEntry读取到的文件位置是URL类型的,我们需要把这个URL对应的文件拷贝到项目的"lib"下。下面看一下copyURLToFile的主干代码: inStream = url.openStream(); IFile file = project.getFile(destFileName); if (!file.exists()) { file.create(inStream, true, null); } URL类有一个openStream可以打开文件的输入流,IFile也有一个接受输入流的create方法用来创建文件,因此我们只需要把url的输入流输出给IFile的create方法即可。 这里我们也可以由url得到其对应的磁盘上的路径,也可以得到IFile对应的磁盘上的路径,然后使用Java IO来进行文件复制操作。但是这样做不仅代码数量变多了,而且由于不是使用的Eclipse的资源管理API,会带来无法自动刷新等问题,因此建议读者尽量使用Eclipse提供的API来完成功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表