Gradle学习教程之部署上传项目详解

前言

Gradle,这是一个基于 JVM 的富有突破性构建工具。Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目。

原先在公司做项目时,写了一个简单的基于gradle部署项目的脚本,今天翻出来记录一下,下面话不多说了,来一起看看详细的介绍吧。

方法如下: 

一、build.gradle

buildscript {
 ext {
 env = System.getProperty("env") ?: "test"
 jvmArgs = "-server -Xms128m -Xmx128m -XX:NewRatio=4 -XX:SurvivorRatio=16 -XX:MaxTenuringThreshold=15 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+DoEscapeAnalysis -XX:-HeapDumpOnOutOfMemoryError"
 if (env == "prod") {
 jvmArgs = "-server -Xms2g -Xmx2g -XX:NewRatio=4 -XX:SurvivorRatio=16 -XX:MaxTenuringThreshold=15 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+DoEscapeAnalysis -XX:-HeapDumpOnOutOfMemoryError"
 }
 userHome = System.getProperty("user.home")
 osName = System.getProperty("os.name")
 }

 repositories {
 jcenter()
 }
 dependencies {
 classpath 'org.hidetake:gradle-ssh-plugin:2.7.0'
 classpath 'co.tomlee.gradle.plugins:gradle-thrift-plugin:0.0.6'
 }
}

allprojects {
 apply plugin: 'idea'
 apply plugin: 'eclipse'
 apply plugin: 'org.hidetake.ssh'
 group = 'com.mwee.information.core'
 version = '1.0-SNAPSHOT'
 ssh.settings {
 timeoutSec = 60
 knownHosts = allowAnyHosts
 }
 defaultTasks 'clean', 'copyPartDependencies'

 //排除Log4j依赖
 configurations {
 compile.exclude module: 'slf4j-log4j12'
 compile.exclude module: 'org.apache.logging.log4j'
 compile.exclude module: 'log4j'
 all*.exclude group: 'org.apache.logging.log4j'
 all*.exclude group: 'log4j'
 }

}

subprojects {
 apply plugin: 'java'
 sourceCompatibility = 1.8
 targetCompatibility = 1.8
 repositories {
 mavenLocal()
 maven { url "http://114.80.88.52:9001/nexus/content/groups/public/" }
 }
 sourceSets {
 main {
 java {
 srcDirs = ['src/main/java']
 }
 resources {
 srcDirs = ["src/main/resources", "src/main/profile/$env"]
 }
 }
 }
 dependencies {
 compile("org.codehaus.groovy:groovy-all:2.2.1")
 compile 'org.codehaus.groovy:groovy-backports-compat23:2.4.5'
 compile("org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE")
 compile("org.apache.commons:commons-lang3:3.4")
 compile("org.apache.commons:commons-collections4:4.1")
 compile "org.apache.commons:commons-pool2:2.4.2"
 compile group: 'com.alibaba', name: 'fastjson', version: '1.2.12'
 // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
 compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.6'
 // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
 compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.6'
 compile group: 'org.aspectj', name: 'aspectjrt', version: '1.8.7'
 compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.8.7'
 compile group: 'com.thoughtworks.xstream', name: 'xstream', version: '1.4.1'
 compile(group: 'org.mortbay.jetty', name: 'jetty', version: '6.1.26')
 compile group: 'org.projectlombok', name: 'lombok', version: '1.16.8'
 compile group: 'com.squareup.okhttp', name: 'okhttp', version: '2.7.5'
 compile group: 'com.google.guava', name: 'guava', version: '18.0'
 compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
 compile group: 'com.jcraft', name: 'jsch', version: '0.1.53'
 testCompile group: 'junit', name: 'junit', version: '4.12'
 testCompile "org.springframework:spring-test:4.3.4.RELEASE"
 compile "javax.validation:validation-api:1.1.0.Final"
 compile "org.hibernate:hibernate-validator:5.2.4.Final"
 }
 //gradle utf-8 compile
 tasks.withType(JavaCompile) {
 options.encoding = 'UTF-8'
 }

 task copyAllDependencies(type: Copy, dependsOn: jar) {
 description = "拷贝全部依赖的jar包"
 from configurations.runtime
 into 'build/libs'
 }

 task copyPartDependencies(type: Copy, dependsOn: jar) {
 description = "拷贝部分依赖的jar"
 from configurations.runtime
 into 'build/libs'
 doLast {
 file("build/libs").listFiles({ !it.name.endsWith("-SNAPSHOT.jar") } as FileFilter).each {
 it.delete()
 }
 }
 }
}

二、对应模块下的build.gradle

def mainClass = "com.hzgj.information.rest.user.run.UserServiceProvider"
def appHome = "/home/appsvr/apps/rest_user"
def javaCommand = "nohup java $jvmArgs -Djava.ext.dirs=$appHome/libs -Denv=$env $mainClass >$appHome/shell.log 2>&1 &"
def index = System.getProperty("index")

def remote = remotes {
 test_0 {
 role 'test_0'
 host = '10.0.21.152'
 if (file("$userHome/.ssh/id_rsa").exists()) {
 user = 'appsvr'
 identity = file("$userHome/.ssh/id_rsa")
 } else {
 user = 'appsvr'
 password = 'xxx'
 }

 }

 test_1 {
 role 'test_1'
 host = '10.0.146.20'
 if (file("$userHome/.ssh/id_rsa").exists()) {
 user = 'appsvr'
 identity = file("$userHome/.ssh/id_rsa")
 } else {
 user = 'appsvr'
 password = 'xxx'
 }
 }
 home {
 role 'home'
 host = '192.168.109.130'
 user = 'appsvr'
 password = 'xxx'
 // identity = file('id_rsa')
 }

}
task deploy << {
 description = "拷贝jar包并启动java服务"
 def roles = remote.findAll {
 def currentEnv = index == null ? "$env" : "$env" + "_" + index
 it['roles'][0].toString().contains(currentEnv)
 }
 ssh.run {
 roles.each {
 def role = it['roles'][0].toString()
 session(remotes.role(role)) {
 try {
 execute("ls $appHome")
 } catch (Exception e) {
 println("#############目录[$appHome]不存在,将自动创建############")
 execute("mkdir -p $appHome")
 }
 finally {
 def r = '$1'
 def pid = execute("jps -l |grep '$mainClass' |awk \'{print $r}\'")
 if (pid) {
 execute("kill -9 $pid")
 }
 put from: 'build/libs', into: "$appHome"
 println("###############准备启动java服务[$javaCommand]####################")
 execute("$javaCommand")
 sleep(10000)
 pid = execute("jps -l |grep '$mainClass' |awk \'{print $r}\'")
 if (pid) {
 println("#####$mainClass [$pid] 启动成功...######")
 execute("rm -f $appHome/shell.log")
 } else {
 println("#$mainClass 启动失败...输出日志如下:#")
 execute("cat $appHome/shell.log")
 }
 }
 }
 }

 }
}

task stop << {
 def roles = remote.findAll {
 def currentEnv = index == null ? "$env" : "$env" + "_" + index
 it['roles'][0].toString().contains(currentEnv)
 }
 ssh.run {
 roles.each {
 session(remotes.role("$env")) {
 def r = '$1'
 def pid = execute("jps -l |grep '$mainClass' |awk \'{print $r}\'")
 if (pid) {
 execute("kill -9 $pid")
 }
 }
 }
 }
}
task start << {
 def roles = remote.findAll {
 def currentEnv = index == null ? "$env" : "$env" + "_" + index
 it['roles'][0].toString().contains(currentEnv)
 }
 ssh.run {
 roles.each {
 def role = it['roles'][0].toString()
 session(remotes.role(role)) {
 def r = '$1'
 def pid = execute("jps -l |grep '$mainClass' |awk \'{print $r}\'")
 if (pid) {
 execute("kill -9 $pid")
 }
 println("###############准备启动java服务[$javaCommand]####################")
 execute("$javaCommand")
 sleep(10000)
 pid = execute("jps -l |grep '$main Class' |awk \'{print $r}\'")
 if (pid) {
 println("#$mainClass [$pid] 启动成功...#")
 execute("rm -f $appHome/shell.log")
 } else {
 println("#$mainClass 启动失败...输出日志如下:#")
 execute("cat $appHome/shell.log")
 }
 }
 }
 }
}

三、使用方式

1.先运行gradle copyAll -x test 进行打包操作,该操作会将该模块所有的依赖的jar

2.进入到对应的模块下 运行gradle deploy -Denv=xxx -Dindex=xxx ,什么意思呢?-Denv代表哪一个环境 -Dindex指定该环境下哪个节点进行发布

3.gradle start -Denv=xxx -Dindex=xxx 运行当前环境下的应用

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • Java使用自动化部署工具Gradle中的任务设定教程
  • 详解android项目由Gradle 2.2 切换到 3.0的坑
  • Android中使用Gradle来构建App项目的入门指南
(0)

相关推荐

  • Java使用自动化部署工具Gradle中的任务设定教程

    tasks 下面的代码展示了三个Gradle task,稍后会讲解这三者的不同. task myTask { println "Hello, World!" } task myTask { doLast { println "Hello, World!" } } task myTask << { println "Hello, World!" } 我的目的是创建一个task,当它执行的时候会打印出来"Hello, World

  • 详解android项目由Gradle 2.2 切换到 3.0的坑

    问题1.运行的时候一直报如下错误 Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForApiTestDebug'.  > java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex 查了很多资料,大概意识是引用重复的库或jar的问题. 然

  • Android中使用Gradle来构建App项目的入门指南

    gradle是Android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的: 1. 方便复用代码和资源 2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不同环境的apk(debug,release) 3. 方便配置,扩展,自定义构建过程 4. 良好的IDE集成 为什么选择Gradle? Gradle主要有以下几个有点: 1. 使用领域驱动语言(DSL)来描述构建逻辑 2. 构建脚本使用Groovy,可以方便的定制构建逻辑 3. 内建的依赖管理系统,使

  • Gradle学习教程之部署上传项目详解

    前言 Gradle,这是一个基于 JVM 的富有突破性构建工具.Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目. 原先在公司做项目时,写了一个简单的基于gradle部署项目的脚本,今天翻出来记录一下,下面话不多说了,来一起看看详细的介绍吧. 方法如下: 一.build.gradle buildscript { ext { env = System.getProperty("env") ?: "test" jvmArgs

  • VUE学习之Element-ui文件上传实例详解

    目录 引言 单文件上传 和表单一起上传 需求:需同时给后端传文件FormData和其他所需参数 数据的编码方式 补充:代理的使用 什么是代理?为什么要用代理 代理的使用 process.env.NODE_ENV 总结 引言 对于文件上传,在开发主要涉及到以下两个方面: 单个文件上传和表单一起实现上传(这种情况一般都是文件上传之后,后端返回保存在服务器的文件名,最后和我们的表单一起上传) 单文件上传 element-ui中的el-upload组件默认发送post请求,在使用upload组件自动携带

  • Go语言学习教程之结构体的示例详解

    目录 前言 可导出的标识符 嵌入字段 提升 标签 结构体与JSON相互转换 结构体转JSON JSON转结构体 练习代码步骤 前言 结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型. 结构体用得比较多的地方是声明与数据库交互时需要用到的Model类型,以及与JSON数据进行相互转换.(当然,项目中任何需要多种数据结构组合在一起使用的地方,都可以选择用结构体) 代码段1:声明一个待办事项的Model类型: type Todo struct

  • python中Django文件上传方法详解

    Django上传文件最简单最官方的方法 1.配置media路径 在settings.py中添加如下代码: MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 2.定义数据表 import os from django.db import models from django.utils.timezone import now as timezone_now def upload_to(instance, filename):     now = timezo

  • JavaScript 使用Ckeditor+Ckfinder文件上传案例详解

    目录 一.准备工作 二.解压 三.开始集成 一.准备工作 Ckeditor_4.5.7_full + Ckfinder_java_2.6.0 二.解压 1.解压ckeditor,和平常文件解压相同,正常解压即可 2.解压ckfinder,解压完成后进入ckfinder文件夹下,发现有CKFinderJava-2.6.0.war文件,继续解压. 3.注意看红框部分 三.开始集成 1.准备工作完成,将图1中的ckeditor,及图3中的ckfinder文件夹拷贝到我们自己的项目的WebContent

  • Docker创建自己的镜像与上传流程详解

    目录 引入 了解Docker的资源隔离和主机模式 创建 centos7 容器 部署mysql5.7 创建Docker Hub仓库 生成镜像 提交镜像 引入 在部署毕节服务器时遇到了个问题:   因为在三台服务器做好ovirt-engine超融合后,在主节点服务器上部署可视化平台需要安装mysql5.7,但是安装mysql时需要卸载一些依赖,但是由于怕影响原有的postgresql数据库和ovirt-engine的服务组件,选择了用docker容器部署mysql数据库.   在顺利创建好容器,配置

  • 基于Struts文件上传(FormFile)详解

    Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 <form action="/StrutsFileUpAndDown/register.do" method="post" enctype="multipart/form-data"> 名字:<input type="text" name="name" /> 头像:<input type="f

  • 学习SpringMVC——国际化+上传+下载详解

    一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好--这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品做大了,用的人多了,不仅仅再是上海人用,北京人用,还有印度人用,法国人用等等,可以说这个产品已经走上了国际化的大舞台.当印度的哥们输入url访问产品时,界面上弹出"欢迎您,三哥",估计哥们当场就蒙圈了.而这个时候,国际化就应运而生了. 要做国际化这道菜,真的没有想象中的那么复杂,反而很简单,不信你看-- 1. 注入Resourc

  • django mysql数据库及图片上传接口详解

    前言 我们在 django-rest-framework解析请求参数 文章中完成了接口文档到参数解析, 一个完整的流程中还缺少对数据库的操作. 本篇内容为django连接数据库, 并编写一个image表用来存储图片路径, 编写图片上传接口和查看数据库中所有图片路径的接口. 前期准备 django操作图片需要安装一个三方库叫做,Pillow workon python35 pip install pillow pip install pymysql Pillow这个库可以对图片进行操作, 例如生成

  • jQuery+php实现ajax文件即时上传的详解

    很多项目中需要用到即时上传功能,比如,选择本地图片后,立即上传并显示图像.本文结合实例讲解如何使用jQuery和PHP实现Ajax即时上传文件的功能,用户只需选择本地图片确定后即实现上传,并显示上传进度条,上传完成后,显示图片信息. HTML本示例基于jQuery以及相当出色的jquery.form插件,所以,先要载入jquery库和form插件.<script type="text/javascript" src="jquery.min.js"><

随机推荐