欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

SpringBootGradlethinjar实践ClassNotFoundException

时间:2023-07-03
编译

这里参考了:原文地址:weiku.co/article/135/
最后一种方式:这里我的项目遇到了一些坑。

buildscript { ext { springBootVersion = '2.1.4.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") }}// gradle 7.0之前的写法,如果使用的7.0之后的版本,可替换为//plugins {// ...// id "io.spring.dependency-management"//}apply plugin: 'java'apply plugin: 'org.springframework.boot'apply plugin: 'io.spring.dependency-management'group 'co.weiku'version '1.0.0'repositories { mavenCentral()}dependencies { compile('org.springframework.boot:spring-boot-starter-web') compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '7.2.2.jre8' compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.1.4.RELEASE' compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.6.2' compile group: 'com.alibaba', name: 'druid', version: '1.1.16' compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.1.4.RELEASE' compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.0.1' compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '2.1.4.RELEASE' compile group: 'org.apache.shiro', name: 'shiro-spring', version: '1.4.0' compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.1.4.RELEASE' compile project(':weiku-framework') compile project(':weiku-common')}// 清除libtask myClearLib(type: Delete) { delete "$buildDir/libs/lib"}// 拷贝libtask myCopyLib(type: Copy) { from configurations.runtime into "$buildDir/libs/lib"}bootJar { //mainClassName = 'co.weiku.WeikuApplication' // 指定jar包名称 baseName = 'weiku-web' // 指定jar包版本名称 version = '1.0.0' // 指定classifier名称 classifier = 'boot' //以上名称指定完成后生成的jar包名称为weiku-web-1.0.0-boot.jar。可以不使用classifier // 排除所有的依赖jar包。包括多模块项目中引用其他项目生成的jar。 excludes = ["*.jar"] // lib目录的清除和复制任务 dependsOn myClearLib dependsOn myCopyLib // 指定依赖包的路径,运行时不再需要指定 java.ext.dir 或 loader.path 参数。 manifest { attributes "Manifest-Version": 1.0, 'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ') }}

运行bootJar,生成了lib文件夹和jar文件。项目启动成功但是查看日志发现有ClassNotFoundException。
查看报错位置发现是

Class<?> clazz = Class.forName(className);// 替换为Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);

OK,解决!

部署

直接将jar包和生成的lib文件夹放到同级目录下,运行jar包即可。
这里需要注意的是:

如果没有依赖的改动(包括新增、升级、删除)之外,只需要发布jar包就可以了。多模块项目如果涉及到其他模块代码的更改也是需要将lib中的jar替换掉。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。