基础
首先我们需要明白两个概念:
- LaunchConfigurationType
字面上解就是一种运行类型。比如说java类型、Ant类型或者是C++类型。不同的类型就不同的运行方式。
- LaunchConfiguration
具体的某个要运行的对象的一个配置。比如说一个java类要运行就得知道类路劲、信赖库、Main类等;一个Eclipse插件要运行,就得配置有插件领事信息等等;或者是一个Ant文件,需要知道运行哪个Tast等。这些都是存在这个LaunchConfiguration里。
看下图就很好理解了:
图一
上图中,红色部分就是一个一个的LaunchConfigurationType,蓝色部分就是对应于某个LaunchConfigurationType的一个个的LaunchConfiguration。每一个LaunchConfiguration都会有几个Tab在右边,用来填写这些配置信息的。
每一个LaunchConfiguration都需要实现接口:org.eclipse.debug.core.ILaunchConfiguration。这个ILaunchConfiguration是一个“只读”的类。它本身不能够被修改。所以如果你想修改,你就必须引用到一个实现了org.eclipse.debug.core.ILaunchConfigurationWorkingCopy接口的对象,这个接口也实现了ILaunchConfiguration接口,但增加了一些用以修改config内容的方法。Config的内容通常是一个个的name/value对,这些name/value对被称为”attribute”。每个”attribute”的值只能是以下五种类型之一:
· boolean
· int
· java.lang.String
· java.util.List (all elements must be of type java.lang.String)
· java.util.Map (all keys & values must be of type java.lang.String)
UI与非-UI的分离
Eclipse推荐把插件的UI部分与非-UI部分分离。我们可以看到所有自带的运行器都是UI分离的。所以我们实现的时候也应该这样做。
如果实现的是UI部分插件,你需要导入:org.eclipse.debug.ui
如果实现的是非-UI部分的插件,你需要导入:org.eclipse.debug.core
具体实现
下面我们就来做一个具体的实现。按照上面的说法,首先我们得有一个ConfigurationType。这是通过扩展实现的,所以我们需要定义一个扩展点实现:org.eclipse.debug.core.launchConfigurationTypes。这里我定义了一个如下:
<extension
point="org.eclipse.debug.core.launchConfigurationTypes">
<launchConfigurationType
delegate="com.tibco.cdc.liugang.launcher.delegate.LiugangLaunchConfigurationType"
delegateDescription="This is for test"
delegateName="Launcher Test"
id="com.tibco.cdc.liugang.launcher.type"
modes="run,debug"
name="LiugangLauncher">
</launchConfigurationType>
</extension>
还有几项没有设置,可以先不管。这里把关键的几项指出:
1. delegate:这是最关键的。当我们选择了某个configuration后,点运行,调用的就是这个delegate实现类的launch方法。所以我们需要在launch方法里实现我们的运行方式。
2. name:就是LaunchConfigurationType显示的名字,如上面的Eclipse Application,java Application等待。
3. modes:运行模型。Eclipse好像已经默认实现了三种模型:run、debug、profile。一般如果只是运行就填run,要调试就填debug等等。
这样我们就定义了一个configurationType了。我们看一下运行效果:
图二
我们扩展的configurationType已经出来了。
如果我们提供了run和debug模型,那么我们在实现中就是分两种情况运行分别处理了。这个判断也就看launch方法中的mode参数。比较的时候不应该接直用String,还应该使用常量:org.eclipse.debug.core.ILaunchManager
下面我们再看一个delegate的launch方法:
launch(ILaunchConfiguration configuration, String mode,
ILaunch launch, IProgressMonitor monitor)
configuration:一个具体的configuration,存储了要运行对象的配置信息。也可以在这个方法里做运行前的最后修改
mode:上面提到的,如run,debug。
launch:代表的就是一个运行。我们launch方法的职责就是把最终生成的target或者processes给加到launch对象上去。
实际上,Launch方法的最主要的职责就是两个:
1. Construct a command line and pass it to Runtime.exec()
2. Create debug targets/processes and add these to the ILaunch object
添加一个图标
上面运行结果中,我们的type前里没有图标。要增加一个图标也需要进行扩展。因为我们强调了UI分离的概念。所以一般来说需要再写一个UI插件,专门去存放UI相关的东西。具体的就不说了。
这里要扩展的扩展点是:org.eclipse.debug.ui.launchConfigurationTypeImages
记住要导入必要的插件。如下实现:
<extension
point="org.eclipse.debug.ui.launchConfigurationTypeImages">
<launchConfigurationTypeImage
configTypeID="com.tibco.cdc.liugang.launcher.type"
icon="icons/sample.gif"
id="com.tibco.cdc.liugang.launcher.ui.type.icon">
</launchConfigurationTypeImage>
</extension>
基本不用讲了,icon就是要显示的图标的路径;configTypeID就是这个图标要显示的对应的configType,就是上面我们扩展的那个type的ID。运行结果如下:
图三
看我们的图标已经加上了。