博客
关于我
gradle系列--打包
阅读量:513 次
发布时间:2019-03-07

本文共 6420 字,大约阅读时间需要 21 分钟。

SpringBoot打包实例

代码

以Gradle创建SpringBoot项目。

项目结构

build.gradle

plugins {    id 'org.springframework.boot' version '2.3.1.RELEASE'    id 'io.spring.dependency-management' version '1.0.9.RELEASE'    id 'java'}group = 'com.example'version = '0.0.1-SNAPSHOT'sourceCompatibility = '1.8'repositories {    mavenCentral()}dependencies {    implementation 'org.springframework.boot:spring-boot-starter-web'    testImplementation('org.springframework.boot:spring-boot-starter-test') {        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'    }}test {    useJUnitPlatform()}

settings.gradle

rootProject.name = 'test_springboot_gradle'

gradle命令

启动函数

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        System.out.println("[DemoApplication.main]: 10");        SpringApplication.run(DemoApplication.class, args);    }}

测试

点击Tasks=> build=> bootjar或者Tasks=> build=> build

点击bootjar:生成jar,路径:项目路径/build/libs(如下图所示)

 点击build

其生成的可运行jar是一模一样的。只不过build多生成了reports和test-results目录。

执行java -jar test_springboot_gradle-0.0.1-SNAPSHOT.jar

[DemoApplication.main]: 10  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::        (v2.3.1.RELEASE)2020-08-21 16:02:08.132  INFO 61424 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on DESKTOP-LOU6VCO with PID 61424 (E:\work\Idea_proj\demo\test_springboot_gradle\build\libs\test_springboot_gradle-0.0.1-SNAPSHOT.jar started by 27165 in E:\work\Idea_proj\demo\test_springboot_gradle\build\libs)2020-08-2......

点击Tasks=> build=> jar

先Tasks=> build=> clean,后Tasks=> build=> jar。发现虽然生成build文件夹,但没有jar包

控制台输出

23:43:54: Executing task 'jar'...> Task :compileJava> Task :processResources> Task :classes> Task :jar SKIPPEDBUILD SUCCESSFUL in 1s2 actionable tasks: 2 executed23:43:56: Task execution finished 'jar'.

 发现jar被跳过了。解决方法:在build.gradle中添加这个

jar{    enabled = true}

此时会生成jar文件。 

 执行java -jar test_springboot_gradle-0.0.1-SNAPSHOT.jar

test_springboot_gradle-0.0.1-SNAPSHOT.jar中没有主清单属性

SpringBoot打包详解

bootjar对比jar

bootjar命令生成的test_springboot_gradle-0.0.1-SNAPSHOT.jar结构 

jar命令生成的test_springboot_gradle-0.0.1-SNAPSHOT.jar结构 

bootjar与jar的区别

        bootjar生成的包可以直接使用java -jar xxx.jar运行,但jar生成的包不能运行,只能被引用。

bootjar与jar的来源

        这两个命令是'org.springframework.boot'插件的,引入此插件即可。Idea用gradle生成的springboot项目的build.gradle的插件如下:

plugins {    id 'org.springframework.boot' version '2.3.1.RELEASE'    id 'io.spring.dependency-management' version '1.0.9.RELEASE'    id 'java'}

gradle命令如下:

若去掉此插件:

plugins {//    id 'org.springframework.boot' version '2.3.1.RELEASE'    id 'io.spring.dependency-management' version '1.0.9.RELEASE'    id 'java'}

则如下图所示

常用操作

修改bootjar命令生成的包名与版本

bootjar{    baseName = 'my'            //最终生成my.jar    //archiveName = 'my.jar'   //这样写也可以    version  = '0.0.1'}

手写gradle打包任务

其他网址

法1:修改 task jar来生成fatjar

存在风险。有时会有依赖覆盖或者某个文件没拷贝的情况。不推荐

task makeJar(type: Jar) {    delete 'build/mylib/test.jar'    baseName = 'test'                       //最终生成test.jar    //archiveName = 'test.jar'              //这样写也可以    from('build/classes/java')              //需要打jar的目录    from('XXX')                             //需包含的其他目录    exclude('dir1/', 'file1')               //不打包指定的文件夹/文件    //exclude {    //    it.name.startsWith('R$');    //}    //destinationDir = file('build/mylib')    //生成的jar存放的位置}makeJar.dependsOn(build)

最后执行gradlew makeJar即可。 

法2:copy任务

task makeJar(type: Copy) {     delete 'build/libs/test.jar'     from( 'build/intermediates/bundles/release ')      into( 'build/libs')      include('classes.jar')      rename('classes.jar', 'test.jar')  }makeJar.dependsOn(build)

法3:shadow 插件生成 fatjar

maven的 maven-shade-plugin  的 gradle 版本。

apply plugin: 'com.github.johnrengelman.shadow'sourceCompatibility = 1.8buildscript {    repositories {        maven {            url "https://plugins.gradle.org/m2/"        }    }    dependencies {        classpath "com.github.jengelman.gradle.plugins:shadow:1.2.3"    }}shadowJar {    baseName = 'hello'    classifier = null    version = null    zip64 true    manifest {        attributes 'Main-Class': 'com.example.Main'    }}

使用方法 :gradle shadowJar ,在 build/libs 里生成文件。 

手动打包实例 

build.gradle示例

apply plugin: 'java'apply plugin: 'idea'version = '1.0' repositories {    mavenCentral()}project.ext {    springVersion = '4.0.4.RELEASE'    minaVersion = '2.0.13'}dependencies {    compile('com.alibaba:dubbo:2.4.9') {        exclude group: 'org.springframework', module: 'spring'    }    compile( "org.apache.zookeeper:zookeeper:3.3.6") {        exclude group: 'javax.jms', module: 'jms'        exclude group: 'com.sun.jmx', module: 'jmxri'        exclude group: 'com.sun.jdmk', module: 'jmxtools'    }    compile( "com.github.sgroschupf:zkclient:0.1") {        exclude group: 'javax.jms', module: 'jms'        exclude group: 'com.sun.jmx', module: 'jmxri'        exclude group: 'com.sun.jdmk', module: 'jmxtools'    }    compile "org.springframework:spring-webmvc:$springVersion",            "org.springframework:spring-web:$springVersion",            ...            "net.sf.json-lib:json-lib:2.2.1:jdk15",            fileTree(dir: 'lib', include: '*.jar')} jar {    String someString = ''    configurations.runtime.each {someString = someString + " lib\\"+it.name}    manifest {        attributes 'Main-Class': 'com.each.dubboMainEnd'        attributes 'Class-Path': someString    }} //清除上次的编译过的文件task clearPj(type:Delete){    delete 'build','target'} task copyJar(type:Copy){    from configurations.runtime    into ('build/libs/lib') } //把JAR复制到目标目录task release(type: Copy,dependsOn: [build,copyJar]) {//    from  'conf'//    into ('build/libs/eachend/conf') // 目标位置}

说明

apply plugin: 'idea'                     用于把项目构建成idea项目

apply plugin: 'java'                     用于添加Java插件,以及一些内置任务,打包jar就要用到这里的插件。 

jar{...}                                         添加项目所需要的依赖包

        首先这定义了一个someString用来存放依赖包的信息,通过configurations.runtime拿到所有的运行时的依赖jar包,然后.each遍历他,通过it.name获取到每个的jar包的name,赋值。
        manifest即是编译完成后生成jar包中的MANIFEST.MF配置信息

task copyJar(type:Copy){...}      建立函数copyJar 用于把依赖的jar复制到对应的目录下。

release(...){...}                            打包的时候的执行的函数

        dependsOn[build,copyJar]这里会让执行relese函数的时候先执行build(系统自带的函数) 和copyJar

最后通过gradle release命令进行打包

转载地址:http://hftjz.baihongyu.com/

你可能感兴趣的文章
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>