首页 > 解决方案 > 使用 jenkins 和 maven 时出现 ClassNotFound 异常

问题描述

我需要你的帮助。我刚刚习惯了 Java,并且已经完成了我在私人项目中的第一个里程碑。现在我想利用这个里程碑作为与 Jenkins 和 CI 打交道的机会。

但是,我在 Jenkins 中通过 Maven 运行程序时遇到了问题。在处理 Jenkins 管道时,Maven 总是向我抛出 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```

您是否知道我做错了什么或如何解决问题?

标签: javamavenjenkinscontinuous-integrationjava-11

解决方案


普通 jar 不包含依赖项。

您需要按照此处所述构建可执行 jar:如何使用 Maven 创建具有依赖项的可执行 JAR?

可能您并没有使用 IntelliJ 启动 jar,java -jar而是使用了一些 IntelliJ 机制为您创造了魔法(即类路径)。


推荐阅读