Eclipse插件开发首选项篇

  • 介绍

若是你的插件须要保存一些数据(参数),好比要设置一些ip地址等等。这时候,就要用到Eclipse提供的首选项这个扩展点。java

咱们这里的首选项的数据类型只包括Java中的基本数据类型。node

  • 扩展点

下面这个扩展点是用来初始化首选项值的:web

[codesyntax lang="xml"]tomcat

<extension point="org.eclipse.core.runtime.preferences">
<initializer
    class="org.suren.littlebird.preferences.PreferenceInitializer">
</initializer>
</extension>

[/codesyntax]app

  • 初始化

[codesyntax lang="java"]eclipse

package org.suren.littlebird.preferences;

import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;

import org.suren.littlebird.Activator;

/**
 * http://surenpi.com
 * @author suren
 * @since 2015-2-2
 */
public class PreferenceInitializer extends AbstractPreferenceInitializer
{

	public void initializeDefaultPreferences()
	{
		IPreferenceStore store = Activator.getDefault().getPreferenceStore();
		store.setDefault(PreferenceConstants.P_OSGI_PORT, 9789);
		store.setDefault(PreferenceConstants.P_OSGI_FILTER, "com");

		store.setDefault(PreferenceConstants.P_BUNDLE_DIR, "/opt/gridview/bundles/application");
		store.setDefault(PreferenceConstants.P_BUNDLE_WEB_RUNDIR,
				"/opt/gridview/runner/web");

		store.setDefault(PreferenceConstants.P_SSH_PORT, 22);
		store.setDefault(PreferenceConstants.P_SSH_USER, "root");
		store.setDefault(PreferenceConstants.P_SSH_PASSWD, "");

		store.setDefault(PreferenceConstants.P_LOGGER_BRIDGE_PORT, 7896);
		store.setDefault(PreferenceConstants.P_LOGGER_LAYOUT, "%d{yyyy-MM-dd HH:mm:ss} [%p]-[ %l] %m %n");
		store.setDefault(PreferenceConstants.P_LOGGER_NO_BRIDGE_HIDDEN, true);
		store.setDefault(PreferenceConstants.P_LOGGER_FILTER, "");
	}

}

[/codesyntax]ide

  • 获取值

[codesyntax lang="java"]工具

IPreferenceStore store = Activator.getDefault().getPreferenceStore();
String filter = store.getString(PreferenceConstants.P_OSGI_FILTER);

[/codesyntax]ui

这里的Activator固然就是本插件中的启动类了。可是,这只能获取到本插件内部的首选项值,那怎么才能获取到其余插件的值呢?例如,您写一个插件要或者到LittleBird的首选项配置,怎么办呢?请看下面的代码片断:spa

[codesyntax lang="java"]

String node = "org.suren.littlebird";
IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
System.out.println(pref.get("logger_filter", "--"));

[/codesyntax]

上面的代码您要是看明白了的话,就会有一个疑问——node是从哪里来的呢,还有后面的key值?

我给您推荐一个比较暴力的办法,就是直接用Java的反编译工具把对应的插件jar文件给翻译过来,而后找到对应的初始化类。

另外也有一个温柔的办法,从您的Eclipse工做空间目录下面找(.metadata\.plugins\org.eclipse.core.runtime\.settings)。

  • 做用域

相似变量同样,首选项也有本身的做用域,例如:有的配置项是要做用在整个工做空间上,有的是要做用在某个工程上等。而首选项做用域的不一样和在操做系统中保存的位置紧密相关。下面是Eclipse平台对做用域的定义:

  1. 实例,按照工做空间或者平台实例来存储
  2. 配置,根据Eclipse的按照位置来存储,多个实例之间共享
  3. 缺省项,根据某个插件的定义来存储,通常都写死在插件内部

这里既然提到了首选项有“做用域”,那么咱们怎么才能获取到指定做用域下的值呢?这是个值得注意的问题。

Eclipse平台提供了三种做用域对应的实现类,如此便简单了,只要调用对应的实现类来或者值就ok了。

[codesyntax lang="java"]

private void print(String node, boolean export)
{
	try
	{
		IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
		System.out.println(Arrays.toString(pref.keys()));
		for(String key : pref.keys())
		{
			System.out.println(key + "===========" + pref.get(key, "--"));
		}
		if(export)
		{
			export(node, pref);
		}
		
		pref = ConfigurationScope.INSTANCE.getNode(node);
		System.out.println(Arrays.toString(pref.keys()));
		for(String key : pref.keys())
		{
			System.out.println(key + "===========" + pref.get(key, "--"));
		}
		if(export)
		{
			export(node, pref);
		}
		
		pref = InstanceScope.INSTANCE.getNode(node);
		System.out.println(Arrays.toString(pref.keys()));
		for(String key : pref.keys())
		{
			System.out.println(key + "===========" + pref.get(key, "--"));
		}
		if(export)
		{
			export(node, pref);
		}
	}
	catch(Exception e)
	{
		e.printStackTrace();
	}
}

private void export(String node)
{
	IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
	
	export(node, pref);
}

private void export(String node, IEclipsePreferences pref)
{
	try {
		OutputStream output = new FileOutputStream(new File("d:/suren/", node)){

			@Override
			public void write(int b) throws IOException {
				System.out.println("1");
				super.write(b);
			}};
		PreferencesService.getDefault().exportPreferences(pref,
				output, null);
		
		output.close();
	} catch (FileNotFoundException | CoreException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

[/codesyntax]

从上面的代码能够看出来,一个插件全部的配置项是以上三个做用域里的值的集合。另外,默认值实际上是不须要导出的。

  • 有关Eclipse的配置

Eclipse的配置其实就是首选项,做用域在workspace上的配置信息固然是在workspace目录中的.metadata中保存,全局性的配置(第一次启动时)那就应该是在Eclipse的安装根目录(configuration)中了。

configuration\.settings\org.eclipse.ui.ide.prefs这个文件描述了Eclipse在启动时寻找workspace的信息

下面介绍workspace级别的配置信息:

默认的根目录为workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings

org.eclipse.m2e.core.prefs 为m2e插件的配置

org.eclipse.jdt.launching.prefs 为Eclipse中使用的JDK的配置

org.eclipse.wst.server.core.prefs 为Server的配置

org.eclipse.jst.server.tomcat.core.prefs 为Tomcat的配置

  • 参考

http://blog.csdn.net/andywangcn/article/details/8026300



查看原文:http://surenpi.com/2015/07/24/eclipse%e6%8f%92%e4%bb%b6%e5%bc%80%e5%8f%91%e9%a6%96%e9%80%89%e9%a1%b9%e7%af%87/