使用 jenkins 和 maven 时出现 ClassNotFound 异常

ClassNotFound Exception when using jenkins and maven

我需要你的帮助。我刚刚习惯 Java 并完成了我私人项目中的第一个里程碑。现在我想以这个里程碑为契机来处理 Jenkins 和 CI.

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

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

为什么当我使用 Jenkins 构建时它找不到 class 但当我在本地工作时找到所有内容,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:How can I create an executable JAR with dependencies using Maven?

可能您没有使用 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,这意味着模块存在。
您是否声明了自己的模块(在您的源文件夹中创建一个模块-info.java)?
在 Java 8 以上的大多数情况下,我看到了 ClassNotFoundException,缺少模块依赖项。这意味着您无法与您正在尝试做的任何事情互动。

我不熟悉 Jenkins,但我认为
- 你的项目需要来自 Jenkins
的东西 或
- Jenkins 尝试通过反射与项目中的某些内容进行交互(例如,从数据库构建对象)。

第一种情况,在你的模块-info.java中,你会写
需要(传递)jenkins-module-you-want-to-add ;
在第二种情况下你会写
opens your-data-package to jenkins-module-that-needs-访问 ;

我认为这是您收到的 ClassNotFoundException 最有可能的来源。
无论如何,maven 也有可能是你问题的根源。