【问题标题】:Can not find class define, when I build a Spring Boot application with Maven by Jenkins and execute JAR file?当我通过 Jenkins 使用 Maven 构建 Spring Boot 应用程序并执行 JAR 文件时,找不到类定义?
【发布时间】:2018-11-18 05:40:46
【问题描述】:
  • 我想它找不到类路径。因为我可以在IDE的本地环境中运行jar文件JAR(IntelliJ IDEA)。我使用下面的代码 sn-ps 打印类路径信息。

    ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); if (urls == null || urls.length == 0) { System.out.println("Is this a empty classpath?"); } for(URL url: urls){ System.out.println("This is classpath:" + url.getFile()); }

当我在 IntelliJ IDEA 中点击 Run 按钮时,它可以列出所有依赖类,例如,是的。

这是类路径:/Users/admin/.m2/repository/org/springframework/boot/spring-boot-starter/1.5.10.RELEASE/spring-boot-starter-1.5.10.RELEASE.jar 这是类路径:/Users/admin/.m2/repository/org/springframework/boot/spring-boot/1.5.10.RELEASE/spring-boot-1.5.10.RELEASE.jar

但是当我在本地运行它时,它只会打印一条消息。这只是我的 JAR 包目录。错了。

  • 我阅读了the documentation 关于清单文件的信息。它确实包含一个 JAR 文件。它的位置是 main/resources 目录。但它没有目录前缀。它由 IntelliJ IDEA 自动生成。然后我解压缩 JAR 包以检查 META-INF/MANIFEST.MF 文件。它还包含 Main-Class 键。

    清单版本:1.0 类路径:spring-data-rest-core-2.6.10.RELEASE.jar mapstruct-1.1.0.F inal.jar logback-core-1.1.11.jar javax.transaction-api-1.2.jar

  • 我检查了我的 pom.xml 文件。它具有 maven-jar-plugin 配置。我注释掉了classpathPrefix 和classpathLayoutType。我认为这似乎没有用。

    <plugin> <!-- Build an executable JAR --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <!--<classpathPrefix>lib/</classpathPrefix>--> <mainClass>com.hzlf.LetFunGoApplication</mainClass> <!--<classpathPrefix>/Users/admin/.m2/repository</classpathPrefix>--> <!--<classpathLayoutType>repository</classpathLayoutType>--> </manifest> </archive> </configuration> </plugin>

    我怀疑这个 maven-jar-plugin 的配置有误。它的 classPathPrefix 是一个相对路径。如何正确编写关于存储库的内容?我的本地 Maven 主目录是 /Users/admin/.m2/。在我的 Docker 容器中,它是 /root/.m2

  • 我在我的项目中使用 Jenkinsfile 从 Docker 中心拉取图像。这是我的 Jenkins 文件配置。在deliver.sh文件中,只是为了运行JAR包。

    pipeline { agent { docker { image 'maven:3-alpine' args '-v $HOME/.m2:/root/.m2' } } stages { stage('build') { steps { sh 'mvn --version' sh 'mvn clean package' } } stage('Test') { steps { sh 'mvn test' } post { always { junit 'target/surefire-reports/*.xml' } } } stage('Deliver') { steps { sh './jenkins/scripts/deliver.sh' } } } } 这是错误信息。让我困惑了很久。

    错误:发生 JNI 错误,请检查您的安装并重试 线程“主”java.lang.NoClassDefFoundError 中的异常:org/springframework/boot/autoconfigure/web/HttpMessageConverters 在 java.lang.Class.getDeclaredMethods0(本机方法) 在 java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 在 java.lang.Class.privateGetMethodRecursive(Class.java:3048) 在 java.lang.Class.getMethod0(Class.java:3018) 在 java.lang.Class.getMethod(Class.java:1784) 在 sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) 在 sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) 引起:java.lang.ClassNotFoundException:org.springframework.boot.autoconfigure.web.HttpMessageConverters 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 更多 [管道] } [管道] // 阶段 [管道] } $ docker stop --time=1 693b10dd721c5780761b00eef880b793f6fa2e94afb77e9ffbac9474360f8a5f $ docker rm -f 693b10dd721c5780761b00eef880b793f6fa2e94afb77e9ffbac9474360f8a5f [管道] // withDockerContainer [管道] } [管道] // withEnv [管道] } [管道] // 节点 [管道] 管道结束 错误:脚本返回退出代码 1 完成:失败

    1: https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html [2]:https://i.stack.imgur.com/CaMnb.png [3]:https://i.stack.imgur.com/kbVvJ.png

【问题讨论】:

  • 如果你使用的是 spring boot 有一个插件 spring-boot-maven-plugin 可以处理所有的东西来创建一个可执行的 jar 文件...没有必要定义 maven-jar-plugin等等...只需使用 spring-boot-maven-plugin...spring boot 文档中的更多详细信息...
  • 我在 pom.xml 中使用了 spring-boot-maven-plugin 并将 'fork' 键设置为 'true' 值。
  • 你为什么要这么做?问题是什么?如果您没有充分的理由,请保持默认值...
  • 解决它。我的错。 jenkins 文件的配置错误。它应该删除“发布”项目。

标签: java maven docker jenkins classpath


【解决方案1】:

我通过修改我的 Deliver.sh 来解决它。我不知道真正的原因,但它有效。我只是删除了测试阶段和交付阶段。我猜它是由于 Deliver.sh 中的“发布”选项造成的。

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v $HOME/.m2:/root/.m2'
        }
    }
    stages {
        stage('build') {
            steps {
                sh 'mvn --version'
                sh 'mvn clean package'
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2020-03-26
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多