发布时间:2024-07-08
浏览次数:0
#百万奖金竞猜#对于一个程序员来说,最有价值的东西是什么?
是他的聪明才智、简洁的代码、惊艳的外表、还是无与伦比的手速?都不是,而是他宝贵的时间。
如果你有机会尝试纯前端Web开发,比如:。你一定会喜欢watch功能,它可以自动检测文件变化,然后自动完成编译和部署。
#又一个百万美元奖金问题#如果 Watch 可以在 Java/环境中完成该有多好!!!
好吧,本文并不是什么高深的抽象理论,也不是什么改变业界观念的伟大真理,而是从实际的角度给大家答案,只是希望能给大家在这三个环境(、、Idea)中进行开发的时候节省一点时间。
什么是热部署?
这是即时的。热点是非常热点。您可以运行其构建并自动生成新代码的时间是。
解决方案:
对于热部署的解决方案,根据版本的不同,分为MVC+Jetty和Boot两种不同的方案。最后给大家分享一个Watch插件,实现watch功能。
如何实现MVC + Jetty
首先我们来回顾一下 Jetty 插件。Jetty 插件提供了两个重要的方法: 和 。它将一个暴露的(未打包的)Web 应用程序部署到内嵌的 Jetty Web 容器中。它不需要将 Web 应用程序打包成 war 文件以节省部署时间。相反,它将一个 War 包部署到 Web 容器中。
好处是你可以更改静态文件和 JSP 文件而不必重新启动服务器。
但即便如此,对于日常开发来说还是比较不方便,因为开发过程中有很多Java文件以及资源配置文件需要更改,所以真正需要的是热部署。
API文档里有一句话:
一旦,网络就可以运行,因为在和热的时候。这是使用他们的IDE的,并且在网络上,时间是,和。
这句话简单概括了Jetty提供热部署的功能,开发者只需要专注于编写代码,减少了重建、重组、重新部署所浪费的时间。那么如何配置才能实现Jetty提供的热部署呢?
Jetty 插件提供了两个属性:
:模式,为“”或者“”。
:Web 应用程序中的文件。如果文件是,则 Web 应用程序是。仅当设置为“”。为 0 时,其中。
看了上面两段话,意思是默认配置是不支持自动重新加载变更的文件的。因此需要修改Jetty插件的默认配置:
buildscript {
repositories { jcenter() }
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE"
classpath 'org.springframework:springloaded:1.2.4.RELEASE'
}
}
apply plugin: 'idea'
idea {
module {
inheritOutputDirs = false
outputDir = file("$buildDir/classes/main/")
testOutputDir = file("$buildDir/classes/test/")
}
}
然后我运行jetty容器,修改Java类/资源文件(下载文件),然后去页面验证变化,结果是没有任何变化intellij idea gradle,这是为什么呢?
原来 Jetty 监控的是构建目录下的类和文件的变化,而不是源代码文件的变化。也就是说,如果源代码内容发生了变化,但是类文件没有变化,那么 Jetty 不会自动触发重新加载变化的文件。那该怎么办呢?
再开一个窗口,手动或者用命令运行一次,就这么简单,3+Jetty 就实现热部署了。
Boot 实现方法 -
现在越来越多的应用直接使用Boot作为框架,我们公司也一样。官方也意识到了热部署的问题,并提供了解决方案:。项目地址:-/-·
官方也很有意识,专门有一章来介绍Hot:78.Hot
它告诉了如何组合和和:
默认情况下Java类和资源文件会被编译到不同的位置,这样会造成监控失败,所以使用idea模块修改编译输出位置和命令行任务是一样的,而且必须配置和命令行任务一样的Java版本,并且必须作为依赖项包含进去。
buildscript {
repositories { jcenter() }
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.2.7.RELEASE"
classpath 'org.springframework:springloaded:1.2.4.RELEASE'
}
}
apply plugin: 'idea'
idea {
module {
inheritOutputDirs = false
outputDir = file("$buildDir/classes/main/")
testOutputDir = file("$buildDir/classes/test/")
}
}
依赖项下载完成后,正常启动Boot Run。
官方文档中的问题:
官方文档版本是1.2.0,这个版本有问题,会出现错误信息:org...jvm.JVM : .JVM?。而且,如果仔细看官方文档代码的话,会发现官方文档少了一行配置,官方文档里没有设置,这样就会导致编译代码时,测试下的类会输出到out目录的main目录下。这样就改变了默认的输出测试路径(main和test是分开的),所以最好手动配置一下。
此时,如果在应用程序启动时修改了Java代码,只需要点击编译按钮就可以重新编译代码。
导致集成测试的问题:
这样配置之后,运行make,输出的内容在build/中。这在集成测试中会造成一个问题,在运行集成测试时,我们经常需要用到文件和xml文件,如果之前已经运行过build,并且没有清理build目录,那么文件和xml文件会默认放在build/中,这与 的行为不同。在运行测试时,默认会先运行make,但是由于build/中已经有文件了,所以会跳过,导致因为需要的路径和build时输出的路径不同而找不到文件。
解决方案:手动点击或者配置Junit
你可以手动点击它,它会清理输出目录(也就是当前目录),然后再 make。或者你可以改变 Junit 的配置intellij idea gradle,Junit 会在运行测试之前运行 make,你可以让它在 make 之前运行 clean 任务。
如何实现Watch大法-Watch插件
最后,也是最重要的一点,Watch 插件其实通过上面的方法已经实现了热部署,只不过每次变更都需要手动触发,这比重启服务器要快得多。
但这还不够,程序员应该学会偷懒,我们应该把一切可以和应该自动化的事情都自动化。
网上有一个不太流行的Watch插件:/-watch-·
它可以帮你监控任何文件的变化,并在监控到变化后自动执行相应的任务,我们以下面+Jetty的方式为例:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.bluepapa32:gradle-watch-plugin:0.1.3'
}
}
apply plugin: 'watch'
watch {
java {
files files('src/main/java')
tasks 'compileJava'
}
resources {
files fileTree(dir: 'src/main/resources', include: '**/*.xml')
tasks 'processResources'
}
}
当Java或文件发生变化时自动执行。然后,它是Boot下的类似配置。
从现在开始你不用再重复烦人的三组操作并无休止地等待服务器启动:ctrl+c->向上键->enter->等待,而可以专心实现和修复bug。
请让我做一个只默默写代码的程序员吧!
回复 - 获取本月精彩内容合集
例如:如果你想看5月份精彩见解集锦,请回复
如果您想前往 TW 网站阅读所有洞察文章,请复制 URL 并在浏览器中打开:..org
❶ 新技术雷达
❷ 各种实用见解
❸ 精选职位信息
❹ 活动预览摘要
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码