Spring Boot 开发者工具并不仅限于本地开发,在运行远程应用时你也可以使用一些特性。远程支持是可选的,通过设置 spring.devtools.remote.secret 属性可以启用它,例如:
spring.devtools.remote.secret=mysecret
注意:在远程应用上启用 spring-boot-devtools 有一定的安全风险,生产环境中最好不要使用。
远程 devtools 支持分两部分:
一个是接收连接的服务端端点
另一个是运行在 IDE 里的客户端应用
如果设置 spring.devtools.remote.secret 属性,服务端组件会自动启用,客户端组件必须手动启动。
(1)将我们的 Spring Boot 打包成可执行的 jar 文件,然后将 jar 拷贝到其他地方,笔者拷贝到桌面。然后使用 java -jar 命令启动 Spring Boot,如下:
C:\Users\Administrator\Desktop>java -jar springboot.jar {spring.web.resources.chain.cache=false, spring.web.resources.cache.period=0} . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.4.0) 2020-11-21 08:23:22.707 INFO 14476 --- [ main] h.s.s.SpringbootDevtoolsDemo1Application : Starting SpringbootDevtoolsDemo1Application v0.0.1-SNAPSHOT using Java 1.8.0_45 on MS-OYCYMLXUSLLD with PID 14476 (C:\Users\Administrator\Desktop\springboot.jar started by Administrator in C:\Users\Administrator\Desktop) 2020-11-21 08:23:22.712 INFO 14476 --- [ main] h.s.s.SpringbootDevtoolsDemo1Application : No active profile set, falling back to default profiles: default 2020-11-21 08:23:22.891 INFO 14476 --- [ main] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable 2020-11-21 08:23:22.892 INFO 14476 --- [ main] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' 2020-11-21 08:23:27.228 INFO 14476 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2020-11-21 08:23:27.263 INFO 14476 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2020-11-21 08:23:27.264 INFO 14476 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.39] 2020-11-21 08:23:27.510 INFO 14476 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2020-11-21 08:23:27.524 INFO 14476 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4630 ms 2020-11-21 08:23:27.597 WARN 14476 --- [ main] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote restart updates on /.~~spring-boot!~/restart 2020-11-21 08:23:28.067 INFO 14476 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2020-11-21 08:23:28.357 INFO 14476 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index 2020-11-21 08:23:28.901 INFO 14476 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2020-11-21 08:23:28.925 INFO 14476 --- [ main] h.s.s.SpringbootDevtoolsDemo1Application : Started SpringbootDevtoolsDemo1Application in 7.349 seconds (JVM running for 8.36)
使用浏览器访问该 Spring Boot 程序,记得在浏览器上面打开 LiveReload 插件,这样当程序代码改变后可以动态刷新。
(2)记住,上面的 Spring Boot 程序是在 IDEA 外面,通过 java -jar 启动的。现在打开 IDEA 运行 org.springframework.boot.devtools.RemoteSpringApplication 类,连接到远程 Spring Boot 程序。如下:
a、找到 spring-boot-devtools 的依赖,打开找到“RemoteSpringApplication”。双击打开该类,拷贝该类的完全限定类名称 org.springframework.boot.devtools.RemoteSpringApplication,接下来会用到。如下图:
b、打开 IDEA 的“Run/Debug Configurations”,点击左上角的加号“+”创建一个新的 Application。如下图:
设置新的 Application 的配置信息,其中:Main class 输入框填写上面拷贝的 org.springframework.boot.devtools.RemoteSpringApplication 类名称;Program arguments 输入框输入 Spring Boot 的访问地址,这里是 http://127.0.0.1:8080 ,真实情况应该是一个远程 Spring Boot 地址;最后,记得选一个 module,如果不选择将会跑错。如下图:
运行我们刚刚新创建的 RemoteSpringApplication,运行日志如下:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: Spring Boot Remote :: (v2.4.0) 2020-11-21 13:29:37.825 INFO 17220 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication v2.4.0 using Java 1.8.0_45 on MS-OYCYMLXUSLLD with PID 17220 (D:\repository\maven\org\springframework\boot\spring-boot-devtools\2.4.0\spring-boot-devtools-2.4.0.jar started by Administrator in D:\learn\Spring\springboot\springboot_workspaces\springboot2\springboot_devtools) 2020-11-21 13:29:37.832 INFO 17220 --- [ main] o.s.b.devtools.RemoteSpringApplication : No active profile set, falling back to default profiles: default 2020-11-21 13:29:39.170 WARN 17220 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://127.0.0.1:8080 is insecure. You should use a URL starting with 'https://'. 2020-11-21 13:29:39.373 INFO 17220 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2020-11-21 13:29:39.406 INFO 17220 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 3.789 seconds (JVM running for 5.912)
到这里,Spring Boot 远程程序和本地程序都已经启动成功。
接下来,我们去修改一个文件且编译它,看看 Spring Boot 会有什么反应。笔者这里只修改了一下 index.ftl 文件,Spring Boot 输出了如下日志:
2020-11-21 13:30:02.960 INFO 17220 --- [ File Watcher] o.s.b.d.r.c.ClassPathChangeUploader : Uploaded 1 class resource 2020-11-21 13:30:10.395 INFO 17220 --- [pool-1-thread-1] o.s.b.d.r.c.DelayedLiveReloadTrigger : Remote server has changed, triggering LiveReload
再去看看浏览器,你会发现 Spring Boot 远程应用的页面已经变化了。
简单的说来,Spring Boot 本地远程客户端会监听本地文件的变化,当本地文件变化了,会将变化的文件通过网络传递到远程应用中,重启/重新加载远程应用。