WIKI文档参照:https://wiki.jenkins-ci.org/display/JENKINS/Defining+a+new+extension+point
片段如下:
Implementing extension points
Implementing an extension point defined in a plugin is no different from implementing an extension point defined in the core. See hudson.Extension for more details.
@Extension
public class Lion extends Animal { ... }
“@Extension”的说明参考:http://javadoc.jenkins-ci.org/?hudson/Extension.html
片段如下:
hudson
Annotation Type Extension
@Retention(value=RUNTIME)
@Target(value={TYPE,FIELD,METHOD})
@Documented
public @interface Extension
Marks a field, a method, or a class for automatic discovery, so that Hudson can locate implementations of ExtensionPoints automatically.
(In contrast, in earlier Hudson, the registration was manual.)
In a simplest case, put this on your class, and Hudson will create an instance of it and register it to the appropriate ExtensionList.
(在Class上添加@Extension注解,是最简单的向Jenkins注册扩展点实现的方式。)
If you'd like Hudson to call a factory method instead of a constructor, put this annotation on your static factory method. Hudson will invoke it and if the method returns a non-null instance, it'll be registered. The return type of the method is used to determine which ExtensionList will get the instance. Finally, you can put this annotation on a static field if the field contains a reference to an instance that you'd like to register.
This is the default way of having your implementations auto-registered to Hudson, but Hudson also supports arbitrary DI containers for hosting your implementations. See ExtensionFinder for more details.
验证扩展点是否注册成功:
示例1: ExtensionList<ItemListener> extList = Jenkins.getInstance() .getExtensionList(ItemListener.class);
示例2: ExtensionList<ItemListener> extList = Jenkins.getInstance() .getExtensionList(SaveableListener.class);
以ItemListerner为例进行了测试:
创建一个helloworld插件框架,在HelloWorldBuilder.java中添加如下内部类:
@Extension public static final class MyProjectRenameListener extends ItemListener { @Override public void onRenamed(Item item, String oldName, String newName) { super.onRenamed(item, oldName, newName); } }
在perform方法中检测扩展点是否已经被注册了:
@Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { // This is where you 'build' the project. // Since this is a dummy, we just say 'hello world' and call that a // build. ExtensionList<ItemListener> extList = Jenkins.getInstance().getExtensionList(ItemListener.class); // This also shows how you can consult the global configuration of the // builder if (getDescriptor().getUseFrench()) listener.getLogger().println("Bonjour, " + name + "!"); else listener.getLogger().println("Hello, " + name + "!"); return true; }
Debug之后,extList的值为:
[com.yihaodian.plugin.jenkins.jobsync.HelloWorldBuilder$MyProjectRenameListener@84c1c3, hudson.diagnosis.OldDataMonitor$2@1cd000a, hudson.model.DisplayNameListener@1bdb13f, hudson.model.Fingerprint$ProjectRenameListener@bfb588, hudson.tasks.BuildTrigger$DescriptorImpl$ItemListenerImpl@270dbf, org.jenkinsci.main.modules.sshd.ItemListenerImpl@1f79b9a]
PS:后面的几章节将会记录我将要开发的一个Jenkins插件的整个开发过程。