eclipse 插件編寫(1)

来源:http://www.cnblogs.com/haifeng1990/archive/2016/02/16/5192804.html
-Advertisement-
Play Games

由於項目開發進程中有一些重覆性的代碼進行編寫,沒有任何業務邏輯,粘貼複製又很麻煩且容易出錯,故想起做一個eclipse插件來滿足一下自己的工作需要,同時記錄一下,以供以後參考與共同學習。本文主要講解一步一步開發eclipse插件的過程,沒有對每一步進行詳細的講解,如需查看詳細介紹請自行百度、Goog...


由於項目開發進程中有一些重覆性的代碼進行編寫,沒有任何業務邏輯,粘貼複製又很麻煩且容易出錯,故想起做一個eclipse插件來滿足一下自己的工作需要,同時記錄一下,以供以後參考與共同學習。本文主要講解一步一步開發eclipse插件的過程,沒有對每一步進行詳細的講解,如需查看詳細介紹請自行百度、Google。

參考網站:

http://www.ibm.com/developerworks/cn/java/os-ecplug/

開發環境:window7、jdk1.6、eclipse4.4

1、新建eclipse插件 File > New > Project

QQ截圖20160216092153

選擇 Plug-in Project ,新建一個eclipse插件工程,填入工程名稱 TestPlugin,使用預設路徑、預設項目設置,選擇插件運行在eclipse的版本。

image

點擊下一步進入插件項目的詳細設置頁面,

image

ID: 插件的ID

Version: 插件版本號

Name: 插件名稱

Vendor: 插件的作者信息

Execution Environment: 插件的執行環境

option中的 Generate an activator, a Java class that controls the plug-in's life cycle ,下麵緊跟著有一個 Activator的輸入框,這兒選中後代表生成一個啟動器,這個java類用來控制插件的聲明周期,這個啟動器類似java的main方法,Activator後面輸入框內的內容代表要生成啟動器的java類名稱

進入下一步後有一些模板可以選擇,為了方便選擇Hello,World實例項目。

image

image

點擊完成,項目新建成功。目錄如下:

image

src : 項目源代碼目錄

icons:項目圖片資源目錄

META-INF/MANIFEST.MF: 項目基本配置信息,版本、名稱、啟動器等

build.properties: 項目的編譯配置信息,包括,源代碼路徑、輸出路徑、

plugin.xml:插件的操作配置信息,包含彈出菜單及點擊菜單後對應的操作執行類等,

2、代碼分析

MANIFEST.MF:

包含了版本、名稱、啟動器類、必須載入的插件、運行環境等

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestPlugin
Bundle-SymbolicName: TestPlugin;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: testplugin.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
對應的在通過Plug-in Manifest Editor中打開如下:
image
 
build.properties
文件包含了源文件路徑、編譯輸出路徑及編譯包含的目錄等
source.. = src/
output.. = bin/
bin.includes = plugin.xml,\
               META-INF/,\
               .,\
               icons/

對應的在通過Plug-in Manifest Editor中打開如下:

image

 

plugin.xml

相對來講 plugin.xml 是內容最多也最容易更改的地方,包含了插件的操作集合,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.actionSets">
      <actionSet
            label="Sample Action Set"
            visible="true"
            id="TestPlugin.actionSet">
         <menu
               label="Sample &amp;Menu"
               id="sampleMenu">
            <separator
                  name="sampleGroup">
            </separator>
         </menu>
         <action
               label="&amp;Sample Action"
               icon="icons/sample.gif"
               class="testplugin.actions.SampleAction"
               tooltip="Hello, Eclipse world"
               menubarPath="sampleMenu/sampleGroup"
               toolbarPath="sampleGroup"
               id="testplugin.actions.SampleAction">
         </action>
      </actionSet>
   </extension>
</plugin>

extension: 代表一個擴展點, point=org.eclipse.ui.actionSets 代表改擴展點用來添加菜單、工具欄按鈕

actionSet : 一組工具集

menu: 菜單

action: 菜單項,這裡的action中有一個屬性class=”testplugin.actions.SampleAction”代表在點擊該菜單項時將觸發此action類的run方法。

 
SimpleAction:

SimpleAction 為自動生成的一個類,裡面包含了一個簡單的實現hello world的程式代碼,如下:

package testplugin.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.jface.dialogs.MessageDialog;
/**
 * Our sample action implements workbench action delegate.
 * The action proxy will be created by the workbench and
 * shown in the UI. When the user tries to use the action,
 * this delegate will be created and execution will be 
 * delegated to it.
 * @see IWorkbenchWindowActionDelegate
 */
public class SampleAction implements IWorkbenchWindowActionDelegate {
	private IWorkbenchWindow window;
	/**
	 * The constructor.
	 */
	public SampleAction() {
	}
	/**
	 * The action has been activated. The argument of the
	 * method represents the 'real' action sitting
	 * in the workbench UI.
	 * @see IWorkbenchWindowActionDelegate#run
	 */
	public void run(IAction action) {
		MessageDialog.openInformation(
			window.getShell(),
			"TestPlugin",
			"Hello, Eclipse world");
	}
	/**
	 * Selection in the workbench has been changed. We 
	 * can change the state of the 'real' action here
	 * if we want, but this can only happen after 
	 * the delegate has been created.
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	public void selectionChanged(IAction action, ISelection selection) {
	}
	/**
	 * We can use this method to dispose of any system
	 * resources we previously allocated.
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	public void dispose() {
	}
	/**
	 * We will cache window object in order to
	 * be able to provide parent shell for the message dialog.
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}
}
在點擊工具欄的按鈕時會自動調用此類的run方法,該方法彈出一個提示框,提示Hello, Eclipse world;
 
Activator:

此類為插件的啟動類,控制插件的生命周期,內容如下:

package testplugin;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
/**
 * The activator class controls the plug-in life cycle
 */
public class Activator extends AbstractUIPlugin {
	// The plug-in ID
	public static final String PLUGIN_ID = "TestPlugin"; //$NON-NLS-1$
	// The shared instance
	private static Activator plugin;
	/**
	 * The constructor
	 */
	public Activator() {
	}
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
	 */
	public void start(BundleContext context) throws Exception {
		super.start(context);
		plugin = this;
	}
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
	 */
	public void stop(BundleContext context) throws Exception {
		plugin = null;
		super.stop(context);
	}
	/**
	 * Returns the shared instance
	 *
	 * @return the shared instance
	 */
	public static Activator getDefault() {
		return plugin;
	}
	/**
	 * Returns an image descriptor for the image file at the given
	 * plug-in relative path
	 *
	 * @param path the path
	 * @return the image descriptor
	 */
	public static ImageDescriptor getImageDescriptor(String path) {
		return imageDescriptorFromPlugin(PLUGIN_ID, path);
	}
}
 

3、運行一下,看看效果

首先在項目名稱上點擊右鍵 > Run as > Eclipse Application 會新打開一個eclipse視窗,在裡面可以看到剛剛新建的插件,如圖:

image

把滑鼠移入插件圖標的上面會出現提示文字,點擊查看效果:

image

 

 

最簡單的插件就這樣了,後面會在裡面添加一些其他的功能,以完成一個代碼生成器的基本功能,由於剛接觸eclipse插件,文中如有不正確的地方敬請指正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、函數的定義 用戶函數的定義從function 關鍵字開始,如下 function foo($var) { echo $var; } 1、詞法分析 在Zend/zend_language_scanner.l中我們找到如下所示的代碼: <ST_IN_SCRIPTING>"function" { re
  • 首先上一張出現問題的圖片: 出現這個問題一般是你的jdk和eclipse不是同一位的,比如你的jdk是32位的但是eclipse下載的是64位的就會導致這種問題。 解決方案:把兩者都換為32或者64位的即可。 如何查看自己的jdk版本?大家可以下載到自己設備運行(註意:一定要以管理員許可權運行),網址
  • 最近碰到一些 SSL 的小問題,特記錄下。 我們有個 Java 實現的 SSL TCP 服務端,為客戶端(PC、Android 和 iOS)提供 SSL 接入連接服務。最近有用戶反饋其手機上 App 不能正常連接登錄,別人手機上都可以。經過單獨回訪調查該用戶使用的手機操作系統是 Android 6.
  • 一、什麼是CocoaPods CocoaPods是iOS項目的依賴管理工具,該項目源碼在Github上管理。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得我們可以節省設置和第三方開源庫的時間。 在使用CocoaPods之前,開發項目需要用到第三方開源庫的時候,我們需要 1...
  • 問題沒有解決,屬於菜鳥級別的孩子~~~~ 求助啊,求助!!!!!! 報告如下: Warning:An unhandled exception occurred. Please report the problemusing the error reporting dialog or via emai
  • php的函數包括用戶定義的函數、內部函數(print_r count...)、匿名函數、變數函數($func = 'print_r'; $func(array('a','b'));) PHP內核源碼中將函數分為以下類型 #define ZEND_INTERNAL_FUNCTION 1 #define
  • 大型網站的優化技術:1,SEO,優化一種,2,頁面靜態化3,memcache(記憶體緩存)4,伺服器集群技術 總的目標:提高網站的訪問速度,SEO目的:提高網站的排名,(解決的是速度)SEO: google 的優化,百度的優化: 今天先從頁面靜態化來講:先講幾個概念:1,靜態網址純粹的html文檔ht
  • 一.BeanFactory BeanFactory是Spring IOC容器的鼻祖,是IOC容器的基礎介面,所有的容器都是從它這裡繼承實現而來。可見其地位。BeanFactory提供了最基本的IOC容器的功能,即所有的容器至少需要實現的標準。 BeanFactory體繫結構是典型的工廠方法模式,即什
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...