簡體   English   中英

當我用Jenkins用Maven構建Spring Boot應用程序並執行JAR文件時,找不到類定義?

[英]Can not find class define, when I build a Spring Boot application with Maven by Jenkins and execute JAR file?

  • 我想它找不到類路徑。 因為我可以在IDE( IntelliJ IDEA )的本地環境中運行jar文件JAR。 我使用下面的代碼片段來打印類路徑信息。

    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中的“運行”按鈕時,它可以列出所有依賴項類,例如“正確”。

這是類路徑:/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軟件包目錄。 這是不對的。

  • 我閱讀有關清單文件的文檔 它確實包含一個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 。罐

  • 我檢查我的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集線器中提取圖像。 這是我的Jenkinsfile配置。 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中的異常:java.lang.Class.getDeclaredMethods0(本機方法)上的org / springframework / boot / autoconfigure / web / HttpMessageConverters在java.lang.Class.getMethod0(Class.java:3018)在java.lang.Class.privateGetMethodRecursive(Class.java:3048)在java.lang.Class.privateGetDeclaredMethods(Class.java:2701)在sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)處的Class.getMethod(Class.java:1784)在sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)處原因:java.lang.ClassNotFoundException:org java.net.URLClassLoader.findClass(URLClassLoader.java:381)上的.springframework.boot.auto.config.web.HttpMessageConverters,位於sun.misc.Launcher $ AppClassLoader.loadClass上的java.lang.ClassLoader.loadClass(ClassLoader.java:424) (Launcher.java:335),位於java.lang.ClassLoader.loadClass(ClassLoader.java:357)...還有7個[Pipeline]} [Pipe 行] //階段[管道]} $ docker stop --time = 1 693b10dd721c5780761b00eef880b793f6fa2e94afb77e9ffbac9474360f8a5f $ docker rm -f 693b10dd721c5780761b00eef880b793f6fa2e94afb77e9ff [9] PipeP [e] [管道]管道結束錯誤:腳本返回了退出代碼1已完成:失敗

    1https//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

我通過修改delivery.sh來解決它。 我不知道真正的原因,但是可以。 我只是刪除測試階段和交付階段。 我猜這是由於delivery.sh中的“ post”選項引起的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM