1 、 Eclipse 插件开发的路径获取问题
在开发 Eclipse 插件或者 Eclipse RCP 程序时,可能需要访问一些资源或者从配置文件中读取一些配置信息,有这么几种路径可能会被用到:
1) 插件工程的某个相对路径;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import java.io.*;
//...
URL url = FileLocator.find(%Bundle%, %relative path to the bundle%, %override map%);
try {
url = FileLocator.toFileURL(url);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File file = new File(url.getFile());
这段代码的作用是,取得插件中某个文件的 Bundle 对象,其中 %Bundle% 是当前插件的 Bundle 对象。如果你开发的插件叫 TestPlugin ,并且使用了自动生成代码的话,就可以用 TestPlugin.getDefault().getBundle(); 来获得这个 Bundle 对象。 %relative path% 是一个相对于当前插件的相对路径,类型是 IPath ,如用 "./res/data/abc.txt" 生成的 Path 对象。如果你在这里写了一个 绝对路径 "/res/data/abc.txt" ,然后把它交给 FileLocator ,那么路径中所谓的根目录也是指当前开发的插件的根目录。注:在 Java 的路径中写 / ,或者 / 在 Windows 环境下是无所谓的,但如果想写 / ,在写字符串时要写作 "//" 。
使用 FileLocator.find 获得的 URL 的形式是 bundleentry://%bundle_id%/%relative path string% ,这样是没法直接生成文件的,所以,需用 toFileURL 获得一个绝对的文件路径。 ( 请注意 relative path 是 IPath 类型,而 relative path string 是 String 类型)
还有一种方法是:
URL baseurl = TestPlugin.getDefault().getBundle().getEntry("/");
这样 做可以得到插件的绝对路径,然后
URL url = new URL(baseurl, %relative path string%);
此时得到的仍然是形如 bundleentry://%bundle_id%/%reative path string% 的 URL 。如果需绝对路径,还是要向上面那样转化。对于某些 Eclipse 的模块, bundleentry 协议的 URL 是可以直接使用的。
如 果你想打开的是一个图片的话,那么问题简单了很多。类 AbstractUIPlugin 里提供了直接的静态方法
public static ImageDescriptor imageDescriptorFromPlugin(String pluginId, String imageFilePath);
调 用它就可以随意打开图像了。
2) 插件被部署后的 Plugin jar 文件中的相对路径;
对 于 1 和 2 ,实际上是一样的,只不过如果希望能够通过 2 能够正确访问资源,必须在插件配置里将资源打包到部署后的插件中,具体的操作方法是双击 Plugin.xml 或者 menifest.mf ,在打开的编辑器的 Build 页里编辑 Binary Build 和 Source Build 。把需要打包的资源前打勾即可。
3) 在程序中直接书写的相对路径
File file = new File("./res/data/abc.txt");
Eclipse 则会把 eclipse.exe 所在的路 径作为前缀接到上面的相对路径中。如果这时写一个绝对路径 "/res/data/abc.txt", Eclipse 会将 eclipse.exe 所在的分区的盘符( Windows 环境下)作为前缀接到路径上。除非你修改 Eclipse 本身,这种写法一般是 没有意义的。
4) Eclipse 环境的 Workspace 路径
org.eclipse.core.resources 方法来访问
IWorkspaceRoot r = ResourcesPlugin.getWorkspace().getRoot();
IProject p = (IProject)r.findMember("Test");
在使用这个插件之前,务必保证在插件的依赖项 配置中申明要使用插件 org.eclipse.core.resources ,然后 ResourcesPlugin 等类和接口才能使用。例子代码中第一句 获得了目标 Eclipse 中的 Workspace 的根,然后第二句用名字去查找 Workspace 中名为“ Test ”的工程。但是,如果你仅仅想得到 Workspace 的路径字符串,而不是 Workspace 对象或者 Project 对象的话,可以直接使用
Platform.getInstanceLocation().getURL().getPath();
实 际上 getInstanceLocation 返回的是目标 Eclipse 的“ Data Area ”,一般来讲它和 Workspace 是等价的。
5) State Location 配置区的位置
所谓的 State Location 指的是一个插件在 Eclipse 的“ Configuration Area ”中的放置一些偏好设置的地方。一般来讲,一个插件本体存在于 Eclipse 安装路径下的 Plugins 目录中。如果插件希望让用户可以获得基于 Workspace 的设置(例如,换一个 Workspace 就可以换一种设置,就是说让设置和 Workspace 绑定起来)就需要用到 Configuration Area 。如果编写了插件 TestPlugin ,那么 Configuration Area 的默认位置在 Workspace 的 .meta 目录中。而插件默认的 State Location 就是 .meta 目录中的 .plugins/org.eclipse.pde.core/TestPlugin 目录。获得这个路径的方法 是:
TestPlugin.getDefault().getStateLocation().makeAbsolute().toFile().getAbsolutePath();
2 、插件的首选项保存配置的路径
首选项配置文件主要是用来保存插件的一些配置信息的文件,在 Eclipse 开发环境中,这个路径为:
工作空间 /.metadata/.plugins/org.eclipse.pde.core/cn.com.sigmasoft.atest.product/.settings 。
部署后的路径为:
根目录 /configaration/settings