Spring Boot Gradle thin jar 实践 ClassNotFoundException

本文介绍了在Gradle 7.0之前版本的配置方法,包括引入Spring Boot插件、设置依赖和构建任务。在遇到运行时ClassNotFoundException的问题后,通过修改加载类的方式解决了问题。最后,分享了项目的部署方法,强调了没有依赖变动时只需发布jar包的场景。
摘要由CSDN通过智能技术生成

编译

这里参考了:原文地址: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')
}

// 清除lib
task myClearLib(type: Delete) {
    delete "$buildDir/libs/lib"
}

// 拷贝lib
task 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替换掉。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值