【发布时间】: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