为项目自动添加构建路径

来源:互联网 发布:现在淘宝客好做吗 编辑:程序博客网 时间:2024/05/18 15:56

  有一些插件会自动将需要的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

  {

  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来完成功能。

0 0
原创粉丝点击