Gradle 实战 - Fat 包 -ApiHug准备-工具篇-009

  🤗 ApiHug × {Postman|Swagger|Api...} = 快↑ 准√ 省↓

  1. GitHub - apihug/apihug.com: All abou the Apihug   
  2. apihug.com: 有爱,有温度,有质量,有信任
  3. ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace

ApiHug 整个工具链基于 Gradle, 使用 ApiHug 准备工作最先需要学习的就是 gradle. 工欲善其事,必先利其器

开箱即用,是对开发友好同理心最好表现

Spring  Boot 提供整个工具链能够将开发者尽快带入角色, ApiHug 也是, 在 IDEA 分钟级开启新项目。 

ApiHug101-001开启篇

fat jar (也叫 uber-jar) 一个自包含JAR也就是 classes + dependencies 集合体, 可以直接运行的 application。 注意这个有别于 spring boot

下面我们用另种方式, 一个是纯jar 自带的方法, 一个是用shadow 插件。

#初始化

gradle init (7.0+ 版本), 初始化一个最最简单的项目:


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

dependencies {

   implementation 'org.slf4j:slf4j-api:1.7.36'
   implementation 'org.slf4j:slf4j-simple:1.7.36'
   
   compileOnly 'it.unimi.dsi:fastutil:8.2.1' // this must not be in the jar


   // Use JUnit Jupiter for testing.
   testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1'

   // This dependency is used by the application.
   //implementation 'com.google.guava:guava:30.1.1-jre'
}



tasks.named('test') {
   useJUnitPlatform()
}


注意 slf4j 是 implementation, 而另外一个是 compileOnly

#Java 插件里的 Jar 任务

默认的 java 插件自带 jar 任务 java plugin - tasksopen in new window


jar {
    manifest {
        attributes "Main-Class": "com.dearxue.fatjar.Application"
    }

    from {
        configurations.compileClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
    }
}

默认情况下jar 是不带依赖打包的, 我们定制两个:

  1. manifest 里的 Main-Class, 也就是我们的入口函数
  2. 包含依赖包

#独立一个任务

task customFatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'com.dearxue.fatjar.Application'
    
    baseName = 'all-in-one-jar'
    from { configurations.compileClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) } }
    with jar
    duplicatesStrategy = 'include'
}

定制一个 customFatJar 以和默认的 jar 任务区分。

#使用 shadow

shadow pluginopen in new window


Shadow tasks
------------
knows - Do you know who knows?
shadowJar - Create a combined JAR of project and runtime dependencies


shadowJar {
   archiveBaseName.set('shadow')
   archiveClassifier.set('')
   archiveVersion.set('')
}

#结论

这几种方式操作下来我们可以看到编译的结果 build/libs


+---libs
|       all-in-one-jar.jar
|       gradle-fat-jar.jar
|       shadow.jar

2022/07/22  16:33        37,362,395 all-in-one-jar.jar
2022/07/22  16:32        18,683,286 gradle-fat-jar.jar
2022/07/22  16:31            56,212 shadow.jar

直接运行:


\build\libs>java -jar shadow.jar
[main] INFO com.dearxue.fatjar.Application - Hello at dearxue!
never changed  dearxue

咱们自己build 出来的比shadow 要大点点, 因为我们没有区分 implementation vs compileOnly 导致 it.unimi.dsi:fastutil:8.2.1 也被包含在最终的jar 包里面。

项目变得复杂后, 还是依赖专业的 shadow pluginopen in new window 来解决问题, 包括冲突,还有依赖的选择等等。

项目地址 gradle-fat-jar

我们

api-hug-contact

  • 35
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值