我正在学习Spring MVC,并尝试将其与Gradle和Gretty插件一起使用。我已经成功创建了一个“Hello World”项目,但是尽管设置了managedClassReload=true
,但我无法在Gretty中使用热部署。我通过使用IntelliJ中的appRun
gretty任务运行该应用程序。我的build.gradle
如下:
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'war'
apply from: 'https://raw.github.com/gretty-gradle-plugin/gretty/master/pluginScripts/gretty.plugin'
group = 'lukeg'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
mainClassName = 'lukeg.LearnApplication'
repositories {
mavenCentral()
maven {
url 'https://repo.spring.io/libs-snapshot'
}
}
dependencies {
compileOnly('org.projectlombok:lombok:+')
compile('org.springframework:spring-webmvc:4.3.17.RELEASE')
compile("org.aspectj:aspectjweaver:1.8.11")
compile('org.springframework:spring-context:4.3.18.BUILD-SNAPSHOT')
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
}
gretty {
httpPort = 8080
contextPath = '/'
servletContainer = 'tomcat9'
//reloadOnClassChange=true
managedClassReload=true
loggingLevel='DEBUG'
}
我是否对servlet容器使用
tomcat9
还是jetty9
都没关系:日志不会显示Gretty检测到对项目中源文件的更改。有趣的是,当我注释掉
managedClassReload=true
行并取消注释reloadOnClassChange=true
时,将检测到对源文件的更改,并自动重新加载该项目。gretty的热部署无法正常工作的原因可能是什么? springloaded不能与Spring MVC一起使用吗?
最佳答案
首先,由于官方的Gradle plugin repository中已有org.gretty
已有一段时间了,因此无需依赖您从github上收集的插件脚本:
plugins {
id "org.gretty" version "2.1.0"
}
由于您是使用appRun在本地运行应用程序的,因此不会重新加载您的更改。
您必须使用appRunWar将应用程序作为war运行。
文档中未提及。但是在Gretty源代码中。
您可以在
BaseScannerManager
中检查导致问题的Gretty code:if(wconfig.reloadOnClassChange)
{
if(managedClassReload)
{
if(wconfig.inplace) // <-- your problem, you are running inplace
{
log.info 'file {} is in managed output of {}, servlet-container will not be restarted', f, wconfig.projectPath
}
else
{
log.info 'file {} is in output of {}, but it runs as WAR, servlet-container will be restarted', f, wconfig.projectPath
webAppConfigsToRestart.add(wconfig)
}
}
else
{
log.info 'file {} is in output of {}, servlet-container will be restarted', f, wconfig.projectPath
webAppConfigsToRestart.add(wconfig)
}
}