可选的依赖关系

默认情况下,依赖项是必须的——如果任何依赖项不可用,那么插件将被禁用,不能使用。

然而,这只是默认值。可以将对其他插件的依赖声明为可选的。这样,即使一些可选的依赖项不可用,插件也会继续加载和执行。

要声明可选的依赖项,请添加<可选/ >标记到插件中的已声明依赖项pom.xml.

< >的依赖关系< >的依赖< groupId >org.jvnet.hudson.plugins.< artifactId >javanet-uploader.1.5> < /版本<可选>真正的可选> < /

如果在插件a中使用不可用的可选依赖项中的任何类noclassdeffounderror将抛出。处理这些错误仍然是您的责任(尽管Jenkins本身会进行一些处理)。必威国际有限公司如果您的特定扩展加载失败LinkageError.由于缺少依赖项,它将正常禁用即可继续,然后继续执行实例化其他扩展。

通过更改,您可以将扩展标记为可选扩展名@延期注释@Extension(可选= TRUE)jenk必威国际有限公司ins在读取它时不会记录任何类加载错误。

@延期(可选=真正的公共静止的班级YourDescriptor.延伸描述符 {@Override.公共细绳getDisplayName(){返回yourdisplayname.;}}

要确定是否安装了可选依赖项,可以使用Jenkins.getPlugin(String)方法。必威国际有限公司

如果(必威国际有限公司Jenkins.getInstance () .getPlugin (javanet-uploader.) ! =){//在“Javanet-Uploader”插件中使用类}

插件状态和行为

地位 getPlugin(“依赖”)!= null getPlugin(“infficeee”).getWrapper()。isEnabled() 从你的插件加载类

未安装

错误的

NPE.

失败

安装没有重启

真正的

真正的

成功

安装在插件前没有重新启动

真正的

真正的

成功

安装了

真正的

真正的

成功

卸载-没有重新启动

真正的

真正的

成功

Disabled -未重启

真正的

错误的

成功

禁用

错误的

NPE.

失败

代码导致类加载

当您的插件可选地取决于另一个插件时,只有在安装了插件时,只需访问其他插件中的类。

在大多数情况下,您可以通过测试在执行访问可选地加载插件类的代码之前安装插件。

但是,有些情况下,您的课程会在类实例化或通过反射呼叫时加载其他类。例如,描述符#呼叫#getmethod(“getdescriptor”)并且经常会导致这些案件。

例子

可选依赖的例子“>
         </div>
        </div>
        <div class=
  • DefineEt-Plugin和Capender-Plug依赖于基站插件。

  • 代理插件可选地取决于依赖插件。

  • 派生 - 插件中派生的类扩展了基本插件中的类基础。

包含在公共方法声明中

  • 将加载公共方法声明中的类。

  • 当实例化SomeClass或有人调用时,下列任何一个公共方法声明都会导致Derived被加载SomeClass#getmethod.等等。如果未安装依赖插件,则会导致noclassdeffounderror尽管dosomething1()dosomething2.永远不会被执行。

公共班级SomeClass{//它们也导致即使没有执行而导致的加载。公共派生的dosomething1(){// 做点什么...}公共无效dosomething2(派生arg0){// 做点什么...}}
  • 最好不要在方法声明中使用来自可选插件的类。

    • 在某些情况下,甚至非公共(受保护或私有)方法声明也会导致类加载。

向上转型

  • 如果在基类上有CodeS upcasting,则将加载派生类。

  • 以下代码原因导致派生加载时SomeClass实例化,或者有人打电话SomeClass#getmethod.等等。如果未安装依赖插件,则会导致noclassdeffounderror尽管做点什么()永远不会被执行。

公共班级SomeClass{公共无效dosomething(){派生的d = getdrived();基础B =(基础)D;//这导致即使没有执行也会导致加载。...}}
  • 以下代码也导致加载衍生的

公共班级SomeClass{公共无效dosomething(){派生的d = getdrived();dosomethingimpl(d);//这导致即使没有执行也会导致加载。...}私人的无效dosomethingimpl(base b){// 做点什么}}

上行转换不导致类装入

  • 靠近目的不会导致类装入。以下代码不会导致加载衍生的

公共班级SomeClass{公共无效dosomething(){派生的d = getdrived();目的B =(目的)d;//这导致即使没有执行也会导致加载。...}}
  • 仅在编译时仅考虑通用类型,并在执行时忽略。以下代码不会导致加载衍生的

公共班级SomeClass{公共无效doSomething () {集合<派生> dlist = getDerivedList();BASE B =(基础)dlist.get(0.);}}