【问题标题】:ClassNotFound Exception when using jenkins and maven使用 jenkins 和 maven 时出现 ClassNotFound 异常
【发布时间】:2020-04-05 12:14:54
【问题描述】:

我需要你的帮助。我刚刚习惯了 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```

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

【问题讨论】:

    标签: java maven jenkins continuous-integration java-11


    【解决方案1】:

    普通 jar 不包含依赖项。

    您需要按照此处所述构建可执行 jar:How can I create an executable JAR with dependencies using Maven?

    您可能没有使用 java -jar 从 IntelliJ 启动 jar,而是使用了一些 IntelliJ 机制为您实现了魔力(即类路径)。

    【讨论】:

    • 谢谢,这就是解决方案。现在我可以使用 Jenkins 构建它了 :)
    【解决方案2】:

    我建议升级您的 jaxb 部门:以下在 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>
    

    【讨论】:

      【解决方案3】:

      据我所知,您使用的是 Java 11,这意味着存在模块。
      您是否声明了自己的模块(在源文件夹中创建一个 module-info.java)?
      在 Java 8 以上的大多数情况下,我都看到了 ClassNotFoundException,缺少模块依赖项。这意味着您无法与您尝试做的任何事情进行交互。

      我对 Jenkins 不熟悉,但我认为两者都是
      - 您的项目需要来自 Jenkins

      - Jenkins 尝试通过反射与您项目中的某些内容进行交互(例如,从数据库构建对象)。

      在第一种情况下,在你的 module-info.java 中,你会写
      requires(传递)jenkins-module-you-want-to-add ;
      在第二种情况下,您将编写
      opens your-data-package to jenkins-module-that-needs-access ;

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

      【讨论】:

        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 2017-08-13
        • 2012-09-24
        • 2015-08-20
        • 2011-07-07
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        相关资源
        最近更新 更多