首页 > 解决方案 > Spring Boot 应用程序组织的最佳实践是什么?

问题描述

我一直在使用 Eclipse 作为 IDE 开发 Spring Boot 应用程序(我认为这不是特别相关),并且到目前为止的所有测试执行都是通过从 IDE 启动它来完成的。这适用于开发,但现在应用程序需要是“可部署的”(即以某种方式打包、放置在测试系统上、解包、配置和运行)。

是否有推荐的或“最佳实践”的方式来组织已部署的应用程序?

应用程序资源是否应该组织到某个“已知”的目录结构中,以便在启动时可以找到所需的一切?是否存在必须以特定方式命名的资源文件?

现在的情况

为了实现这个目标,我创建了一个 shell 脚本(Linux 是目标操作系统)来启动程序并修改了我的 maven 构建以收集必要的资源(例如 jar 依赖项、application.yml、log4j2.xml 等)。所有这些都被压缩并放置在目标测试 Linux 盒子上。

解压缩档案后,几乎所有内容都位于“根”中。当我尝试执行该程序时,该程序确实执行(并快速退出并出现错误),但是我认为存在一些问题可能是由于运行时无法正确访问它所需的资源。这只是一个猜测。

这是一个例子:

解压拉链:

[centos@route-assessor route-assessor]$ ls -l
total 41016
-rw-r--r--. 1 centos centos     1017 Oct 21 11:34 application.yml
-rw-r--r--. 1 centos centos  5059429 Oct 21 15:05 elastic-apm-agent-1.10.0.jar
drwxr-xr-x. 2 centos centos     8192 Oct 22 10:38 lib
-rw-r--r--. 1 centos centos     1975 Oct 22 15:12 log4j2.xml
drwxrwxr-x. 2 centos centos       71 Oct 22 15:12 logs
drwxrwxr-x. 2 centos centos       62 Oct 22 15:12 metrics
-rwxr-xr-x. 1 centos centos      740 Oct 22 15:09 run-route-assessor.sh
-rw-r--r--. 1 centos centos 36909394 Oct 22 10:38 services-0.0.1-SNAPSHOT.jar

更新

好吧,也许“部署”不是我应该使用的术语。我不打算将应用程序“部署”或“安装”到机器上,我只是将 zip 存档放在上面,解压缩,进行一些配置并运行它。

话虽如此,我的问题是关于是否(或是否)有关于如何组织解压缩结果中的工件的推荐做法。

例如,在 eclipse 项目中,该项目的结构是 Maven“友好的”,看来 Spring 必须期待这种结构(或者可能类似的结构)。

所以:

<project>
  src/
    main/
      java/
        <java code contained in a package hierarchy>
      resources/
        <various needed resource files>
        log4j2.xml
        application.yml
        etc.

当应用程序“打包”时,是否应该维护这样的目录结构?换句话说,JVM/Spring Boot“运行时”会期望看到这样组织的资源吗?

标签: javaspring-bootdeployment

解决方案


spring-boot 文档在此处描述了安装到 Linux 。从 maven 构建生成的单个工件具有 spring-boot 查找它们的依赖库和资源。

应用程序资源是否应该组织到某个“已知”的目录结构中,以便在启动时可以找到所需的一切?是否存在必须以特定方式命名的资源文件?

您无需解压任何东西即可运行该应用程序。. . 罐子里的东西留在罐子里。这就是 maven 插件(在该链接中提到)所做的。

一旦您在服务器上拥有构建工件,您需要添加配置(例如 db 用户/密码等)并将其集成到 centos 的服务管理中,该文档也描述了这一点。

该文档还描述了如何将您的应用程序发送到云平台,如果这是您的最终目标。


推荐阅读