热部署实现

百万奖金有奖问答,程序员的什么最值钱?

是他/她们的聪明才智,简洁代码,惊艳的颜值,还是无与伦比的手速,都不是,是宝贵的时间。

如果你有机会尝试纯前端的web开发,比如:NodeJS FrontEnd。你一定会非常喜欢watch这个功能,可以自动检测文件变化,然后自动完成编译(ES6,React的JSX,用Babel编译)和部署(拷贝到目标目录)。

那么在后端系统中,我喜欢称这个过程为“自动化热部署”。

什么是热部署?

所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。这对于开发人员非常重要,原因就是节省时间,开发人员只需要简单的运行构建,新的代码就自动的部署到正在运行的应用中,而不是构建,关闭应用(Ctrl + C),启动应用(up enter)。

在Gradle的环境如何实现热部署呢?

方法一:Jetty插件 + Watch插件

apply plugin: 'jetty'

Jetty插件提供两个重要方法:jettyRun和jettyRunWar。

jettyRun会将一个已暴露(解包的)的web应用部署到嵌入式Jetty Web容器中。它不需要将web应用打包成一个war文件,目的是为了节省部署时间。

jettyRunWar正好相反,是将一个War包部署到Web容器中。

一个非常有趣的事情

让我们一起来阅读一下JettyRun任务DSL文档,它有这么一段话:

jettyRun任务一旦启动,web容器会可以被配置成持续不断的扫描项目的改变,并自动在有需要的时候执行一个热部署。这允许开发人员可以专注于用他们喜爱的IDE编写代码,并将代码变化立即透明的反应到web容器中,消除重新构建,组装和部署时间浪费。

这么听上去好像,默认就支持热部署,那为什么直接简单应用插件却没有任何的效果?

Jetty插件提供了两个属性,分别是reloadscanIntervalSeconds

reload:重载模式,有两个值,“自动”和“手动”

自动模式,web应用会每隔n秒扫描一次文件变化,n是由scanIntervalSeconds属性决定(注意:scanIntervalSeconds的默认值是0,这意味着“自动”模式是关闭的)。如果检测到文件变化,则web应用就会重新加载。

scanIntervalSeconds:扫描间隔时间,默认是0,表示“自动”模式是关闭的。

既然如此,我们修改脚本文件,添加下面的配置:

jettyRun {
    reload = "automatic"
    scanIntervalSeconds = 1
}

起作用了吗?

运行./gradlew jettyRun启动jetty容器,修改Java类/资源文件(resource下的文件),然后去页面验证变化,答案是没有变化。为什么?

原来,jetty监听的是build目录下的class和resource文件的变化,而不是源代码文件变化,也就说源代码内容改变了,但class文件没有变化,那么不会自动触发jetty重载变化文件,那么该怎么办?

另起一个窗口,手动运行一次./gradlew compileJava或者./gradlew processResources命令。

手动操作实在麻烦,程序员就应该学会偷懒,我们应该自动化一切可以自动化且应该自动化得东西

Gradle Watch插件

借助社区插件来协助Jetty插件,一起实现热部署了,gradle-watch(日本人写的),gradle-watch-plugin

gradle watch的作用是监听某种类型的文件的变化,包括添加,删除和修改,然后执行预定义的任务。

完整配置方式如下:

apply plugin: 'jetty'

jettyRun {
    reload = "automatic"
    scanIntervalSeconds = 1
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.bluepapa32:gradle-watch-plugin:0.1.5'
    }
}

apply plugin: 'watch'

watch {
    java {
        files files('src/main/java')
        tasks 'compileJava'
    }
    resources {
        files fileTree(dir: 'src/main/resources', include: '**/*.xml')
        tasks 'processResources'
    }
}

配置watch闭包,什么文件发生变化后就执行什么任务(好像没有提供默认配置,所以需要手动显示的配置)。

使用方式是开启另一个窗口运行./gradlew watch任务即可。

results matching ""

    No results matching ""