【问题标题】:Jenkins plugin causes ClassNotFoundException for bundled dependencyJenkins 插件导致捆绑依赖的 ClassNotFoundException
【发布时间】:2022-07-22 20:21:28
【问题描述】:

我有一个 Maven 项目,其结构如下:

myproject-root
└─myproject-jenkins
└─myproject-web
└─myproject-lib

myproject-root 是一个简单的聚合器,包含<packaging>pom</packaging>modules 标记中声明的其他三个模块。

myproject-lib 是一个小型库,包含在 git 子模块中。

myproject-jenkins 是主模块,应该是 Jenkins 的插件。 pom.xml 包含以下内容:

...
<parent>
    <groupId>org.jenkins-ci.plugins</groupId>
    <artifactId>plugin</artifactId>
    <version>4.32</version>
    <relativePath />
</parent>
...
<packaging>hpi</packaging>
...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.jenkins.tools.bom</groupId>
            <artifactId>bom-2.277.x</artifactId>
            <version>961.vf0c9f6f59827</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
...
<dependencies>
    <dependency>
        <groupId>myproject</groupId>
        <artifactId>myproject-lib</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>myproject</groupId>
        <artifactId>myproject-web</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
...

myproject-web 是一个模块,应该是可以从 Jenkins 插件启动的 Web API。 pom.xml 包含以下内容:

...
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.2</version>
    <relativePath/>
</parent>
...
<groupId>myproject</groupId>
<artifactId>myproject-web</artifactId>
<version>1.0-SNAPSHOT</version>
...
<dependencies>
    <dependency>
        <groupId>myproject</groupId>
        <artifactId>myproject-lib</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
     </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.6.2</version>
        </plugin>
    </plugins>
</build>
...

myproject-jenkins 模块中,我可以从myproject-webmyproject-lib 导入和使用类,而不会出现IntelliJ 错误。另外,当我compilepackage 使用Maven 的myproject-root 模块时,构建成功。正如预期的那样,package 任务创建了一个.hpi 文件,我可以将其作为插件安装到 Jenkins 中而不会出现任何问题。

但是,一旦执行了使用 myproject-web 模块中的类的类,我就会在运行时得到该类的 ClassNotFoundException。但是,如果我只使用来自myproject-lib 的类,它就可以正常工作。

java.lang.ClassNotFoundException: ….myproject.web.Application
    at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1402)
    at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1357)
    at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1112)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
Caused: java.lang.NoClassDefFoundError: …/web/Application
    at …/jenkins.RunWeb.doUseApplication(RunWeb.java:47)
    at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:398)
Caused: java.lang.reflect.InvocationTargetException
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:402)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:410)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:208)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:141)
    at org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:558)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:59)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
    at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:475)
    …

据我所知,这是由于类加载器试图动态加载类,但在类路径中找不到它。

当我检查.hpi 文件中的文件时,我可以在WEB-INF/lib 目录中看到myproject-jenkins.jarmyproject-lib-0.0.1-SNAPSHOT.jarmyproject-web-1.0-SNAPSHOT.jar

是什么导致了这个错误,我该如何解决?

【问题讨论】:

    标签: java maven jenkins jenkins-plugins


    【解决方案1】:

    您找到解决方案了吗? 我遇到了同样的错误。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2015-12-03
    • 2015-10-04
    相关资源
    最近更新 更多