亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

為項目自動添加構建路徑

2019-11-18 13:40:19
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲丝袜在线视频| 欧美激情综合亚洲一二区| 色在人av网站天堂精品| 国产视频丨精品|在线观看| 欧美电影在线观看网站| 成人免费视频xnxx.com| 国产亚洲精品一区二555| 91产国在线观看动作片喷水| 在线播放国产一区二区三区| 尤物yw午夜国产精品视频明星| 日本韩国欧美精品大片卡二| 91久久嫩草影院一区二区| 成人免费视频在线观看超级碰| 久久久久久久久久亚洲| 一区二区三区视频免费在线观看| 亚洲综合大片69999| 亚洲激情电影中文字幕| 久久精品国产电影| 日韩av免费观影| 日韩一区二区三区在线播放| 亚洲久久久久久久久久久| 欧美日韩亚洲一区二区| 中文字幕日韩欧美在线视频| 成年无码av片在线| 国产小视频91| 国内偷自视频区视频综合| 亚洲国产精品久久| 中文字幕精品—区二区| 国产精品日韩欧美| 久久久久亚洲精品成人网小说| 久久久久久免费精品| 欧美人与性动交a欧美精品| 色悠久久久久综合先锋影音下载| 一本色道久久综合狠狠躁篇的优点| 久久久久久欧美| 欧美亚洲第一页| 91成品人片a无限观看| 久久手机免费视频| 成人性生交大片免费看视频直播| 日韩欧美极品在线观看| 成人久久精品视频| 欧美性生交xxxxx久久久| 成人乱色短篇合集| 欧美高清视频免费观看| 亚洲综合在线小说| 亚洲精品av在线| 欧美性猛交xxxx黑人| 国产欧美一区二区三区在线| 亚洲欧美制服综合另类| 亚洲综合日韩在线| 欧美日韩国产成人在线观看| 精品国产一区av| 在线一区二区日韩| 欧美又大粗又爽又黄大片视频| 成人激情视频小说免费下载| 亚洲女性裸体视频| 国产一区二中文字幕在线看| www.日本久久久久com.| 欧美日韩亚洲91| 久久免费视频在线| 韩国视频理论视频久久| 国产精品尤物福利片在线观看| 日韩av在线网站| 91人成网站www| 成人精品视频在线| 福利一区福利二区微拍刺激| 一区二区欧美在线| 91在线观看免费高清完整版在线观看| 久久夜精品va视频免费观看| 日韩少妇与小伙激情| 亚洲欧美日本伦理| 国产精品视频网| 国产男女猛烈无遮挡91| 国产精品精品视频一区二区三区| 国产日韩欧美在线看| 中文字幕亚洲欧美一区二区三区| 国产欧美日韩最新| 在线播放国产精品| 亚洲人av在线影院| 亚洲电影av在线| 精品久久久中文| 久久精品国产免费观看| 成人精品aaaa网站| 国产精品久久网| 久久人人爽人人爽爽久久| 8090理伦午夜在线电影| 国产69精品久久久久9| 午夜精品久久久久久久99黑人| 97视频国产在线| 久久久久久久一| 欧美放荡办公室videos4k| 欧美精品九九久久| 亚洲精品福利资源站| 国产精品美女av| 亚洲男人7777| 26uuu另类亚洲欧美日本一| 亚洲iv一区二区三区| 亚洲最大福利视频| 亚洲人午夜色婷婷| 国产日韩中文在线| 国产精品久久视频| 国产精品久久久久久久久粉嫩av| 亚洲欧美综合图区| 国产精品白嫩初高中害羞小美女| 国产精品成人免费电影| 亚洲第一男人天堂| 日韩国产高清视频在线| 成人高h视频在线| 成人信息集中地欧美| 亚洲一区二区三区视频播放| 精品一区精品二区| 91免费电影网站| 最近2019年日本中文免费字幕| 日韩av网站在线| 欧美日韩一区二区免费在线观看| 免费av在线一区| 5252色成人免费视频| 在线日韩欧美视频| 国产91精品久| 国产精品自产拍在线观看中文| 日韩精品在线视频观看| 精品国产精品自拍| 国产精品自产拍在线观| 精品国产一区二区三区久久| 日本高清视频精品| 国产成人短视频| 国产日韩欧美日韩| 国产91精品久久久| 国产精品678| 国产一区二区动漫| 久久久久久亚洲| 国产999在线| 亚洲第一在线视频| 亚洲天堂一区二区三区| 精品国产欧美一区二区三区成人| 欧美国产第一页| 国产精品99一区| 亚洲黄色免费三级| 国产成一区二区| 国产精品高潮粉嫩av| 成人看片人aa| 欧美日韩中文字幕综合视频| 精品爽片免费看久久| 国产精品精品一区二区三区午夜版| 国产精品自产拍在线观| 秋霞午夜一区二区| 日韩av一区二区在线观看| 国产人妖伪娘一区91| 欧美日韩亚洲视频一区| 亚洲激情视频在线观看| 欧美在线激情视频| 夜夜狂射影院欧美极品| 欧美孕妇毛茸茸xxxx| 日韩精品极品视频免费观看| 国产精品久久av| 亚洲午夜精品久久久久久久久久久久| 欧美激情一区二区三级高清视频| 清纯唯美日韩制服另类| 欧美成人在线免费| 欧美尤物巨大精品爽| 欧美另类xxx| 98精品在线视频| 97色伦亚洲国产| 成人激情电影一区二区|