使用jenkins和maven时出现ClassNotFound异常



我需要你的帮助。我刚刚习惯Java,已经完成了我私人项目中的第一个里程碑。现在我想利用这个里程碑作为一个机会来处理詹金斯和CI。

然而,我在Jenkins中通过Maven运行程序时遇到了问题。Maven在处理Jenkins管道时总是向我抛出ClassNotFound异常。但是当我在IntelliJ中本地启动程序时,它运行起来没有问题。

据我所见,他找不到我用来使用JAXB解析XML的POJO。

为什么当我使用Jenkins构建时它没有找到一个类,而当我在本地工作时它却找到了所有的东西,POM是一样的。

这是我的POM:

<groupId>groupId</groupId>
<artifactId>rss_backend</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>dev.morphia.morphia</groupId>
<artifactId>core</artifactId>
<version>1.5.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>projects.rss_backend.MainApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

这就是我在使用jenkins/maven时遇到的错误:

The following command runs and outputs the execution of your Java
application (which Jenkins built using Maven) to the Jenkins UI.
+ java -jar target/rss_backend-1.0-SNAPSHOT.jar
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at projects.rss_backend.MainApp.main(MainApp.java:20)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more```

你知道我做错了什么吗?或者我该如何解决这个问题?

普通jar不包含依赖项。

您需要构建一个可执行jar,如下所述:如何使用Maven创建一个具有依赖关系的可执行jar?

可能您不是用java -jar从IntelliJ启动jar的,而是用一些IntelliJ机制为您提供了魔法(即类路径(。

我建议升级您的jaxb-deps:以下在JDK11+中对我有效:

<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.4.0-b180830.0438</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.4.0-b180830.0438</version>
</dependency>

据我所见,您使用的是Java 11,这意味着存在模块
您是否声明了自己的模块(在源文件夹中创建一个module-info.java(
Java 8以上的大多数情况下,我都看到了ClassNotFoundException,其中缺少模块依赖项。这意味着你不能与任何你想做的事情互动

我不熟悉Jenkins,但我认为要么
-你的项目需要Jenkins的东西
,要么
-Jenkins试图通过反射与你的项目中的东西交互(例如,从数据库构建对象(。

在第一种情况下,在你的module-info.java中,你会写
requires(可传递(jenkins模块,你想添加
在第二种情况下,您将
打开您的数据包到jenkins模块,该模块需要访问

在我看来,这是您收到的ClassNotFoundException最有可能的来源
不管怎样,maven也有可能是你问题的根源。

相关内容

最新更新