Gradle application building sharing (pure dry information)
本篇文章给大家分享的是关于gradle 应用构建,但是由于这篇文章所说的内容不会涉及到基础知识,所以你需要去看一些 gradle/groovy 的基本知识
阅读本文你需要一些 gradle/groovy 的基本知识,本文所讲的内容全是利用各种插件去让自身的应用构建发布更简单,不会涉及到基础知识
在 2016 年时我写过一个示例《springboot+gradle+vue+webpack 组合使用》,经过了1年多我发现很多童鞋需要这方面的资源,我觉得应该把我们平时在使用 gradle 方式方法分享给大家。
Gradle 是什么
Gradle 是构建工具
Gradle 特点
Build Anything构建任何应用Automate Everything自动化一切Deliver Faster提供更快的构建
上面的三项全是官方解释对于第1点没有任何疑问,gradle 可以构建任何应用。所以下面我都是围绕第在2点上,利用 gradle 如何轻松实现让项目自动化,让你的项目打包、构建、发布更轻松。
本文不会将 gradle 与其它任何构建工具进行比较,因为这没有任何意义,每一种技术或者都有自身的应用场景,如果不适合自身所在的场景再优秀也是没有任何意义的
场景1 - gradle 集成 node 构建应用
-
首先你需要在项目中增加 node 插件 gradle-node-plugin
plugins { id "com.moowork.node" version "1.2.0" } -
配置 node 任务参数
node { version = "8.9.4" yarnVersion = "1.3.2" download = true }versionnode 的版本yarnVersionyarn 的版本,这里强烈推荐大家使用 yarn 而不是 npmdownload这里设置为true你本地无需单独安装 node,在构建时会自动安装对应版本的 node,虽然对于开发人员来说,你在开发过程中一定会独立安装 node,但是这里配置为自动下载还是会带来 N 多的好处,比如多个应用构建时无需担心 node 版本冲不一致而带来版本冲突,其次是在使用 CI 像(jenkins)时你无需在 CI 服务器单独(手动)安装 node -
构建任务
task buildAdmin(type: YarnTask, dependsOn: yarn) { group = "node" args = ["run", "build"] } task copyAdminFiles(type: Copy, dependsOn: buildAdmin) { group = "node" from "dist/dist" include "**/**" into "${project.buildDir}/resources/main/public-web-resources" } jar.dependsOn copyAdminFiles将
copyAdminFiles任务绑定在jar命令上,这样你在运行gradle build命令进行打包时会自动进行node构建前端的相关资源并且将构建后的资源拷贝至 gradle 构建的 resources 目录,命令运行成功后你将会在 jar 文件的根目录中发现public-web-resources目录,这样就完成了前后端一体构建。这种方式只适合,你静态资源文件是通过
java访问并且在一起部署的场景,如果你的静态资源是独立部署的这种做法可能对你没有任何意义
场景2 - gradle 集成 ssh 插件
-
插件依赖添加 gradle-ssh-plugin
plugins { id 'org.hidetake.ssh' version '2.9.0' } -
服务器配置
remotes { webServer { host = '192.168.1.101' user = 'webserver' identity = file('id_rsa') } }remotes 服务器信息配置,关于 gradle-ssh-plugin 更详细的配置可以参考官方文档
-
部署任务配置
task deploy { doLast { ssh.run { session(remotes.webServer) { put from: 'example.war', into: '/webapps' execute 'sudo service tomcat restart' } } } }使用
gradlew deploy命令运行任务,将会把example.war上传至服务器/webapps目录,并且重启你的服务器 tomcat
你可以根据自己的部署需要编写各种 task,轻松实现一键部署,并且这种方式是完全跨平台的,不管你的开发环境是 windows、mac、linux 都是使用相同的命令部署
PS:在开发测试环境使用这种方式部署我只能说不要太好用
场景3 - gradle 集成 docker 构建
-
插件依赖添加 gradle-docker-plugin
buildscript { dependencies { classpath "com.bmuschko:gradle-docker-plugin:3.2.1" } } apply plugin: "com.bmuschko.docker-remote-api" -
编写构建任务
task copyDockerJar(type: Copy, dependsOn: build) { group = "docker" from jar.archivePath.path into "${project.buildDir}/docker" rename { String fileName -> fileName.replace("-${project.version}", "") } }将 jar 文件拷贝至
build/docker目录为后面构建镜像做准备task createDockerfile(type: com.bmuschko.gradle.docker.tasks.image.Dockerfile, dependsOn: copyDockerJar) { group = "docker" def jarName = "${project.name}.jar".toString() destFile = project.file("${project.buildDir}/docker/Dockerfile") from "openjdk:8u151-jdk-alpine3.7" maintainer "Kevin Zou <kevinz>" copyFile(jarName, "/app/$jarName".toString()) workingDir("/app") volume("/app/logs") runCommand("apk add --no-cache tzdata") environmentVariable("TZ", "Asia/Shanghai") // 默认时区设置为东8区 environmentVariable([ JVM_OPTS : "-Xms1g -Xmx1g -XX:MetaspaceSize=128m", JAVA_OPTS: "-server -XX:+UseG1GC \$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -Xloggc:logs/gc.log" ]) environmentVariable("DUIC_OPTS", "\$JAVA_OPTS -Dreactor.trace.operatorStacktrace=true -Dspring.profiles.active=prod") exposePort(7777) defaultCommand("sh", "-c", "java \$DUIC_OPTS -jar $jarName") }</kevinz>生成 dockerfile
FROM openjdk:8u151-jdk-alpine3.7 MAINTAINER Kevin Zou <kevinz> COPY duic.jar /app/duic.jar WORKDIR /app VOLUME ["/app/logs"] RUN apk add --no-cache tzdata ENV TZ Asia/Shanghai ENV JVM_OPTS="-Xms1g -Xmx1g -XX:MetaspaceSize=128m" JAVA_OPTS="-server -XX:+UseG1GC $JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/ -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -Xloggc:logs/gc.log" ENV DUIC_OPTS $JAVA_OPTS -Dreactor.trace.operatorStacktrace=true -Dspring.profiles.active=prod EXPOSE 7777 CMD ["sh", "-c", "java $DUIC_OPTS -jar duic.jar"]</kevinz>
task buildImage(type: com.bmuschko.gradle.docker.tasks.image.DockerBuildImage, dependsOn: createDockerfile) { group = "docker" inputDir = createDockerfile.destFile.parentFile tags = ["zhudyos/${project.name}:${project.version}".toString(), "zhudyos/${project.name}:latest".toString()] }使用
gradlew buildImage即会构建 2 个 tag 镜像,关于 gradle-docker-plugin 更加详细的用法请参考官方文档
场景4 - gradle release 插件应用
-
插件依赖添加 gradle-release
plugins { id "net.researchgate.release" version "2.6.0" } 使用
在 master 分支中运行命令gradlew release即会自动创建 tag
该插件使用较简单,不需要修改任何参数运行命令后按照流程走即可,唯一要注意的是如果你是多项目记得运行修改成gradlew :release这样是在 root 项目中运行打 tag
下图是使用命令后git提交记录![]()
场景5 - travis 中使用 gradle 构建
.travis.yml
sudo: required language: java jdk: openjdk8 services: - mongodb - docker before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ cache: directories: - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ - .gradle/ - node_modules/ before_install: - chmod +x gradlew script: - ./gradlew clean buildImage after_success: - if [ ! -z "$TRAVIS_TAG" ]; then docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; docker push zhudyos/duic; ./gradlew copyRelease; fi deploy: provider: releases api_key: secure: yXSciOem61T73TLenFyAGbgYi2CTg5QUoj1AstAAupCYURatOvFBeJGwE04ZIdAgIKO1LRPqrhG0M40pg5uzwAR+qcJ1yQHKE4xqqSsRiksZZKGMPx4G7HxPr43/wOGKGd87WLEKGe7NaDRdlQm53WXpes8aYqN9L8H0rf6Ftf1sTtG2j+W6u8TJu0GDI5rQ4dC1kX6oOVoMqXynFV1X3KJ6hQFJyDZRA3I9DStElvSnAL7UtzGqPZBqXlNcjewe/V/7jP60Z3gcAH83zZU/rGPrLrckhxpDCFt6prDIhv/mBhgvROP1mif0B+jHolfprIHUvtrDSYj8FkmWVmoSyjF8R3PyzVfYqhSuRAvYtmUZtRa4BjOzxMPZRpucJYPv2/yXs7PPhkFxglxBI4CmC1c4ZFbMeTUWZrld/ZhaszQ/30sfVU4sh/cZEcJd8ZS8/W7QHI6jPWh4t9Ip+kMAsaVKy9aXDnNXV5e5Xeoh9BH6vICCT6J827jfp7OJ0m912T56Ui9jPmEBq1qUp3pwYk4tYolsyYr7oykKbjiJ/D9TjsXx39qju8dSI1fb2dnkX+flIqDmDbqlNI8fr2lkoAPQXRB36WWEFEGVHv+ymX5jZQxlrewliuCt1t28m8b3Doycf6kfNw0yvrcTPvOs00s7EpGoH3E8NZluWo5aSyM= file_glob: true file: build/releases/* skip_cleanup: true on: repo: zhudyos/duic tags: true
在 travis 中主要集成有几项
script构建 docker 镜像
after_success如果构建的是 tag 则将镜像推送至 docker hub
deploy如果构建的是 tag 则将 jar 包自动提交至 github releases
本文主要是与大家分享 gradle 的相关插件作用,你可以使用这些插件去完成什么样的事情,具体关于插件的使用方法,还请多参考官方的文档资料,每个插件我都配上了官方地址
项目:https://github.com/zhudyos/duic 几乎使用到了上面所有的插件,大家可以参考该项目
懂得偷懒的人才会进步,但懒惰并不会使你进步
相关推荐:
The above is the detailed content of Gradle application building sharing (pure dry information). For more information, please follow other related articles on the PHP Chinese website!
How do I use Maven or Gradle for advanced Java project management, build automation, and dependency resolution?Mar 17, 2025 pm 05:46 PMThe article discusses using Maven and Gradle for Java project management, build automation, and dependency resolution, comparing their approaches and optimization strategies.
How do I create and use custom Java libraries (JAR files) with proper versioning and dependency management?Mar 17, 2025 pm 05:45 PMThe article discusses creating and using custom Java libraries (JAR files) with proper versioning and dependency management, using tools like Maven and Gradle.
How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache?Mar 17, 2025 pm 05:44 PMThe article discusses implementing multi-level caching in Java using Caffeine and Guava Cache to enhance application performance. It covers setup, integration, and performance benefits, along with configuration and eviction policy management best pra
How can I use JPA (Java Persistence API) for object-relational mapping with advanced features like caching and lazy loading?Mar 17, 2025 pm 05:43 PMThe article discusses using JPA for object-relational mapping with advanced features like caching and lazy loading. It covers setup, entity mapping, and best practices for optimizing performance while highlighting potential pitfalls.[159 characters]
How does Java's classloading mechanism work, including different classloaders and their delegation models?Mar 17, 2025 pm 05:35 PMJava's classloading involves loading, linking, and initializing classes using a hierarchical system with Bootstrap, Extension, and Application classloaders. The parent delegation model ensures core classes are loaded first, affecting custom class loa


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 Linux new version
SublimeText3 Linux latest version

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.








