Skip to content

Gradle项目含依赖打包

今天打包Gradle项目时,得到的包是无依赖版本的,这不符合要求,于是找了一下解决方案。找到一个方案说是用shadow插件,如下:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // 添加您的项目依赖项
    // ...
}

jar {
    manifest {
        attributes 'Main-Class': 'com.example.main'
    }
}

shadowJar {
    mergeServiceFiles()
}

我试了下,确实可以,但是项目跑不起来,报错JCE cannot authenticate the provider BC.

查了一下,发现原因在于:有些被依赖的jar包是会被验证签名的(比如某些加密算法的依赖包,为了安全所以需要签名以防假冒)。

我的项目正好用到了密码相关的包,所以会去验证签名。但把打出来的jar包解压发现shadow这个插件会将依赖包解压,对其中源码进行进一步处理,签名失效,所以报了错。

于是更换了打包方式,只需要添加spring的插件,交给spring打包即可:

plugins {
    id 'java'
    id "org.springframework.boot" version "2.5.2" // 在这里添加插件!!!
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    // 添加您的项目依赖项
    // ...
}

shadowJar {
    mergeServiceFiles()
}