设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> 网络编程 >> PHP >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
PHP做Web项目的优缺点
不一样的项目,不一样的…
基于VS.NET的自定项目模…
MVC模式在j2me项目中的应…
MVC模式在j2me项目中的应…
Java开源项目Hibernate …
Java开源项目Cache4j Pe…
CSS重新定义项目符号和编…
利用开源项目Hibernate开…
如何在Web工程项目中使用…
  为项目自动添加构建路径         
为项目自动添加构建路径
 

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来完成功能。
Linux联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-1-3 3:34:25
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持