如何自行部署 Spring Boot 应用程序
Posted
技术标签:
【中文标题】如何自行部署 Spring Boot 应用程序【英文标题】:How to deploy spring boot application into it self 【发布时间】:2019-12-15 01:30:51 【问题描述】:我有一个 Spring Boot 应用程序,它运行在嵌入式 tomcat 上,java -jar app.jar
在远离我工作办公室的服务器上,我对该服务器没有任何 ssh 或其他访问权限。
所以当我想安装和运行更新版本的应用程序时,我应该去服务器位置,物理连接到服务器,然后安装和运行更新版本。
有没有办法在不去服务器位置的情况下运行更新版本的应用程序?例如,将较新的 jar 文件上传到我正在运行的应用程序中,并自行更新它。
注意
由于 IP 和端口限制,我无权访问服务器,也无法使用和运行任何持续交付工具,例如 jenkins 或其他。
【问题讨论】:
据我了解,服务器不接受任何入站连接。那么它可以调用任何出站服务吗? @Jagger 也许可以,你知道方法吗? 如何创建一个有一个端点的应用程序,它接受上传。使这个上传成为一个 JAR 文件,并让你的应用程序 Runtime.exec() 它。我想说这不是一种真正可维护的做事方式,但它是可行的。简而言之:制作一个可以部署应用程序的应用程序。无论你做什么来实现这一点,从安全的角度来看,这也是噩梦般的。所以你被警告了:-) @RasoolGhafari 如果服务器可以建立出站连接,例如到 SFTP 服务器,您将在其中存储 jar 文件,然后编写脚本(.bat
、.sh
或其他取决于服务器的操作system),它将下载文件,然后使用java -jar your_app.jar
重新部署应用程序。您可以使用前言者的提示并从 Spring Boot 中的计划作业运行 Runtime.exec()
(@Scheduled
注释)。或者,您可以在 Java 本身中使用一些 SFTP
库,但是您会遇到从自身停止应用程序的问题。
@Jagger 如果应用程序可以通过 HTTP 访问(如果它是启用 Tomcat 的 SpringBoot 应用程序,那么您甚至不必建立出站连接,只需 HTTP POST 您的 JAR。唯一的限制可能是:来自防火墙/代理/服务器的 HTTP 请求限制(但如果是这种情况,您可以对上传进行切片),以及安全策略限制(Java 运行时管理员可能禁止 Runtime.exec()) .
【参考方案1】:
我不久前做过类似的事情,效果很好。
所以你可以在服务器上创建一个超级小应用程序(小到它“永远”不需要更新)并让它监控版本,当有新版本可用时,它可以停止实际进程并重新启动它新的 jar 文件。
很遗憾,我没有该入门应用的代码,但编写一个适合您需要的应用应该不会花那么长时间
【讨论】:
【参考方案2】:您为什么不将 Tomcat 安装到服务器并使用它的管理 GUI 来部署较新版本的应用程序?这是一种非常古老的时尚,但效果很好。
您唯一需要在源代码中修改的就是将 pom.xml 中的 packaging
从 jar
替换为 war
,这样您就可以通过 Tomcat 管理器进行部署。
这是管理器 GUI 的样子:
You can learn more about the Tomcat Manager here.
【讨论】:
以上是关于如何自行部署 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含所有spring-boot库的情况下将spring-boot应用程序部署到nexus?
Tomcat使用Tomcat部署Spring Boot项目生成的jar包
如何在嵌入式 tomcat 服务器上部署 Spring Boot Web 应用程序,来自 Spring Boot 本身