【发布时间】: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-web 和myproject-lib 导入和使用类,而不会出现IntelliJ 错误。另外,当我compile 和package 使用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.jar、myproject-lib-0.0.1-SNAPSHOT.jar 和myproject-web-1.0-SNAPSHOT.jar。
是什么导致了这个错误,我该如何解决?
【问题讨论】:
标签: java maven jenkins jenkins-plugins