博客
关于我
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 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 通过查看mysql 配置参数、状态来优化你的mysql
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
查看>>
MySQL 错误
查看>>
mysql 随机数 rand使用
查看>>
MySQL 面试题汇总
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySQL 高性能优化规范建议
查看>>
mysql 默认事务隔离级别下锁分析
查看>>
Mysql--逻辑架构
查看>>