拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Spring Boot 2.7.0入门实战:从零搭建可部署的Java后端服务

1. 项目概述为什么是Spring Boot 2.7.0如果你刚接触Java后端开发或者是从传统的SSH、SSM框架迁移过来听到“Spring Boot”这个词大概率会感到既熟悉又陌生。熟悉是因为它基于Spring陌生是它似乎把很多复杂的东西都“藏”了起来。我刚开始接触时也有同感直到用Spring Boot 2.7.0完整做完第一个项目后才恍然大悟它不是一个新框架而是一套全新的、以“约定大于配置”为核心的生产力工具集。Spring Boot 2.7.0发布于2022年5月它是一个承上启下的重要版本。说它承上是因为它属于Spring Boot 2.x的“功能完善期”在2.6.x的基础上做了大量优化和漏洞修复稳定性达到了一个高峰说它启下是因为它是Spring Boot 2.x的最后一个功能版本之后团队的重心就完全转向了3.x系列。对于新手而言从2.7.0入门有几个无法替代的优势首先它的社区资料、解决方案和第三方库的兼容性是最丰富的你遇到的绝大多数问题都能在网上找到现成的答案。其次它的API和配置方式已经非常成熟和稳定学习路径清晰不会因为版本频繁变动而手足无措。最后从2.7.0平滑过渡到3.x比从更老的版本迁移要容易得多因为它已经包含了许多为未来版本铺路的特性。这个入门系列我不想只教你如何写一个“Hello World”。我想带你走一遍我作为开发者第一次用Spring Boot 2.7.0搭建一个可运行、可测试、结构清晰的后端服务时所经历的全部思考和操作。我们会从最根本的“为什么需要Spring Boot”开始一直深入到如何组织代码、如何集成常用组件、以及如何避开那些新手最容易踩的坑。目标是让你学完后不仅能运行项目更能理解每一个操作背后的意图从而具备独立搭建和调试的能力。2. 核心概念与项目初始化实战2.1 理解Spring Boot的核心自动配置与起步依赖在手动搭建Spring MVC项目的年代我们需要在XML文件里手动配置DispatcherServlet、视图解析器、数据源、事务管理器等等动辄上百行的配置是家常便饭。Spring Boot的革命性在于“自动配置”。它的原理是根据你项目中引入的“起步依赖”Starter以及现有的类路径Classpath自动推断你可能需要的Bean并将它们装配到Spring应用上下文中。举个例子当你引入了spring-boot-starter-web这个起步依赖Spring Boot会自动为你配置一个内嵌的Tomcat服务器、一个DispatcherServlet、以及默认的JSON转换器Jackson。你不需要写任何关于Tomcat端口或Servlet映射的XML配置它已经按照业界最通用的约定帮你做好了。如果你不满意当然可以通过application.properties或application.yml文件来修改这些约定。这就是“约定大于配置”的精髓它为你提供了开箱即用的默认值同时保留了全部自定义的灵活性。起步依赖则是另一个神器。它本质上是一个Maven或Gradle的依赖描述文件POM它聚合了完成某个特定功能所需的一组依赖库并确保这些库的版本是相互兼容的。比如spring-boot-starter-data-jpa就包含了Spring Data JPA、Hibernate以及数据库连接池等。你不再需要自己去查找Hibernate的版本应该配哪个连接池版本起步依赖帮你管理好了这一切极大地减少了依赖冲突和版本管理的心智负担。2.2 三种创建项目的姿势与选型建议创建Spring Boot项目主要有三种方式各有优劣。方式一使用官方初始化网站start.spring.io这是我最推荐新手使用的方式直观且可控。访问start.spring.io你会看到一个表单。Project选择构建工具。Maven是老牌且生态最广的选择Gradle更灵活但学习曲线稍陡。新手无脑选Maven。Language选Java。Spring Boot版本选择2.7.0。注意官网默认可能显示最新的3.x版本需要手动在下拉框中选择2.7.0。Project MetadataGroup通常填写公司或组织的域名倒序如com.example。Artifact项目名称如demo。Name、Description可自动生成按需修改。Package name包名通常由Group和Artifact组成如com.example.demo。Packaging选Jar。Spring Boot推荐使用可执行Jar包内嵌服务器部署极其方便。Java选择你本地安装的JDK版本Spring Boot 2.7.0兼容JDK 8-17建议至少使用JDK 11。Dependencies点击“ADD DEPENDENCIES”添加初始依赖。对于第一个项目我建议只加两个Spring Web用于构建Web应用和Lombok用于简化Java Bean代码。点击“Generate”按钮下载生成的ZIP包并解压然后用IDE如IntelliJ IDEA打开即可。方式二使用IDEIntelliJ IDEA内置工具IntelliJ IDEA Ultimate版社区版不支持和Spring Tools Suite都提供了图形化创建向导。以IDEA为例File - New - Project左侧选择Spring Initializr后续步骤与网页版类似。好处是创建后直接就在IDE中打开无缝衔接。缺点是IDEA社区版用户无法使用。方式三手动从零搭建我不建议新手这么做但了解其过程有助于理解本质。你需要创建一个Maven项目。在pom.xml中继承spring-boot-starter-parent。添加所需的起步依赖如spring-boot-starter-web。创建主应用类并使用SpringBootApplication注解。 这种方式繁琐且易出错仅适用于需要深度定制构建流程的特殊场景。实操心得无论用哪种方式创建项目后的第一件事是用IDE打开项目等待Maven/Gradle下载完所有依赖。如果网络不好导致依赖下载缓慢或失败可以配置国内镜像源如阿里云Maven镜像这能节省大量时间。2.3 项目结构解析什么样的布局是合理的解压或创建好的项目会呈现一个标准的Maven项目结构。理解这个结构非常重要它代表了Spring Boot社区公认的最佳实践。demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── demo/ │ │ │ ├── DemoApplication.java # 主启动类 │ │ │ ├── controller/ # 控制器层 │ │ │ ├── service/ # 业务逻辑层 │ │ │ ├── service/impl/ # 业务逻辑实现层 │ │ │ ├── dao/ 或 repository/ # 数据访问层 │ │ │ └── entity/ 或 model/ # 实体类层 │ │ └── resources/ │ │ ├── static/ # 静态资源CSS, JS, 图片 │ │ ├── templates/ # 模板文件如Thymeleaf, Freemarker │ │ └── application.properties # 主配置文件 │ └── test/ # 测试代码目录 └── pom.xml # Maven项目对象模型文件DemoApplication.java这是应用的入口。SpringBootApplication注解是一个组合注解它包含了Configuration标识为配置类、EnableAutoConfiguration启用自动配置和ComponentScan自动扫描组件。main方法中通过SpringApplication.run()启动整个Spring容器。分层结构controller,service,dao,entity这是典型的分层架构。这种分离确保了代码的清晰职责和可测试性。虽然Spring Boot不强制要求这样组织但严格遵守此约定能让项目更易于维护和团队协作。resources/static和resources/templates分别用于存放前端静态资源和服务器端渲染模板。如果你只开发纯后端REST APItemplates目录可能用不到。application.properties这是整个项目的“控制中心”。几乎所有配置都可以在这里调整比如服务器端口server.port8081、数据库连接spring.datasource.urljdbc:mysql://localhost:3306/test等。它也支持YAML格式application.yml写法更简洁我个人更推荐。注意事项包名com.example.demo下的类才会被SpringBootApplication默认扫描到。如果你把Controller类放在这个包之外Spring Boot将无法发现它你需要使用ComponentScan注解手动指定扫描路径。3. 编写第一个REST API与配置详解3.1 从零创建一个“Hello World”接口理论说再多不如动手跑一遍。我们来创建一个最简单的RESTful接口。首先在src/main/java/com/example/demo/目录下创建controller包然后在该包下创建HelloController.java文件。package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController // 1. 声明这是一个REST风格的控制器 RequestMapping(/api) // 2. 为这个控制器下的所有接口添加统一前缀“/api” public class HelloController { GetMapping(/hello) // 3. 声明这是一个处理GET请求的接口路径是“/api/hello” public String sayHello() { return Hello, Spring Boot 2.7.0!; } GetMapping(/hello/{name}) // 4. 路径中带参数 public String sayHelloToSomeone(PathVariable String name) { return Hello, name !; } }代码解析RestController等于ControllerResponseBody。它告诉Spring这个类里的所有方法返回的数据都应该直接写入HTTP响应体如JSON或字符串而不是跳转到一个视图页面。RequestMapping(“/api”)类级别的注解将这个控制器下所有方法的请求路径都加上/api前缀。这是一种很好的实践可以将API版本或模块区分开。GetMapping(“/hello”)方法级别的注解缩写自RequestMapping(method RequestMethod.GET, path“/hello”)。它映射一个GET请求。PathVariable用于获取URL路径中的变量值。访问/api/hello/Worldname参数的值就是“World”。现在回到主类DemoApplication.java直接运行它的main方法。在控制台日志中你会看到Tomcat启动在8080端口默认。打开浏览器访问http://localhost:8080/api/hello和http://localhost:8080/api/hello/World就能看到返回的字符串了。3.2 配置文件Properties vs. YAML以及多环境配置Spring Boot的配置优先级很高支持多种外部配置源。最常用的就是application.properties或application.yml。Properties格式传统的键值对使用.进行层级分隔。server.port8081 spring.datasource.urljdbc:mysql://localhost:3306/mydb spring.datasource.usernameroot spring.datasource.password123456 logging.level.com.example.demoDEBUG # 设置特定包的日志级别为DEBUGYAML格式结构更清晰通过缩进来表示层级非常适合配置复杂的结构化数据。server: port: 8081 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: 123456 logging: level: com.example.demo: DEBUG实操心得我个人强烈推荐使用YAML格式尤其是在配置列表、Map等复杂结构时YAML的可读性远胜于Properties。但要注意YAML对缩进必须是空格不能是Tab非常敏感格式错误会导致配置不生效。多环境配置在实际开发中我们通常有开发dev、测试test、生产prod等不同环境。Spring Boot通过配置文件命名约定来支持这一点。application.yml主配置文件所有环境共享的配置。application-dev.yml开发环境专用配置。application-prod.yml生产环境专用配置。如何激活特定环境有两种方式在application.yml中指定spring: profiles: active: dev # 激活dev环境通过启动参数指定优先级更高命令行java -jar myapp.jar --spring.profiles.activeprodIDEA中编辑运行配置在Program arguments里添加--spring.profiles.activetestSpring Boot会先加载application.yml再加载application-{profile}.yml后者的配置会覆盖前者。这样你可以把数据库连接、日志级别等环境相关的配置分离出来管理起来非常清晰。3.3 使用Lombok大幅简化Java Bean代码在刚才的controller示例中我们返回的是简单的字符串。实际业务中我们更多返回结构化的JSON对象。这就需要定义Java Bean或称为POJO、Entity。传统的Java Bean充斥着大量的getter、setter、toString、equals和hashCode方法虽然IDE可以生成但让代码显得非常臃肿。Lombok通过在编译时自动生成这些样板代码的字节码让开发者只需关注核心属性。我们在项目初始化时已经添加了Lombok依赖。现在在entity包下创建一个User.java。package com.example.demo.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; Data // 1. 核心注解自动生成getter, setter, toString, equals, hashCode NoArgsConstructor // 2. 生成无参构造器 AllArgsConstructor // 3. 生成全参构造器 public class User { private Long id; private String name; private Integer age; private String email; }就这么简单Data注解帮你生成了所有必要的方法。然后在HelloController里添加一个新的接口GetMapping(/user) public User getUser() { // 在实际项目中这个User对象通常是从数据库或服务层获取的 return new User(1L, 张三, 25, zhangsanexample.com); }重启应用访问/api/user你会看到返回了一个格式工整的JSON对象{“id”:1, “name”:”张三”, “age”:25, “email”:”zhangsanexample.com”}。Spring Boot默认使用Jackson库进行JSON序列化而Lombok生成的getter方法正好被Jackson用来获取属性值。注意事项Lombok需要IDE安装插件才能正常识别。IntelliJ IDEA需要在插件市场搜索“Lombok”并安装。否则IDE会报错说找不到getXXX()方法但这不影响编译和运行。另外在团队项目中确保所有成员都安装了Lombok插件以避免IDE报错带来的困扰。4. 深入理解自动配置与自定义配置4.1 自动配置原理浅析Conditional注解的魔力Spring Boot的自动配置看似魔法实则基于一系列Conditional注解。这些注解是Spring框架的条件化装配机制Spring Boot在此基础上封装了更易用的注解如ConditionalOnClass,ConditionalOnMissingBean,ConditionalOnProperty等。以自动配置Tomcat为例。在spring-boot-starter-web的依赖中包含了Tomcat的库。Spring Boot的自动配置类如ServletWebServerFactoryAutoConfiguration中会有类似下面的代码逻辑Configuration ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class }) // 条件1类路径下存在这些类 ConditionalOnMissingBean(value ServletWebServerFactory.class, search SearchStrategy.CURRENT) // 条件2用户没有自己定义ServletWebServerFactory这个Bean public class EmbeddedTomcatAutoConfiguration { Bean public TomcatServletWebServerFactory tomcatServletWebServerFactory() { return new TomcatServletWebServerFactory(); } }解读ConditionalOnClass只有当项目的类路径下存在Servlet.class,Tomcat.class等类时这个配置类才会生效。这意味着你引入了Web相关的起步依赖。ConditionalOnMissingBean只有当Spring容器中不存在用户自定义的ServletWebServerFactory类型的Bean时它才会注册这个默认的Tomcat工厂Bean。这个机制非常巧妙。它给了你默认的、最优的选择同时又把最终决定权完全交还给你。如果你对默认的Tomcat配置不满意只需要在你自己定义的配置类中显式地声明一个ServletWebServerFactory的Bean那么Spring Boot的自动配置就会因为ConditionalOnMissingBean条件不满足而退出转而使用你定义的Bean。4.2 如何查看和调试自动配置作为新手你可能会好奇“Spring Boot到底自动给我配置了什么”有两种主要方式可以查看。方式一使用spring-boot-autoconfigure日志在application.yml中开启debug模式debug: true # 注意这是一个顶级的配置项不是spring.debug启动应用控制台会打印出大量的日志。其中一部分名为CONDITIONS EVALUATION REPORT条件评估报告。这份报告详细列出了所有自动配置类以及它们生效或未生效的原因。通过它你可以清晰地看到为什么某个功能被启用或禁用。方式二使用Actuator的/actuator/conditions端点需要引入spring-boot-starter-actuator依赖Actuator是Spring Boot的生产就绪特性提供了很多监控和管理端点。其中/actuator/conditions端点以更结构化的JSON格式提供了与debug日志类似的信息。这对于在非开发环境调试非常有用。4.3 自定义配置的几种方式当你需要覆盖或补充自动配置时有以下几种方式使用application.yml/properties这是最简单、最常用的方式。几乎所有Spring Boot官方支持的属性都可以在这里配置。例如修改内嵌服务器端口server.port9090。使用ConfigurationProperties绑定配置到Bean当有一组相关的配置属性时可以定义一个Bean来集中管理。首先在application.yml中定义配置myapp: thread: pool-size: 10 task: timeout: 5000然后创建一个配置类package com.example.demo.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; Component ConfigurationProperties(prefix myapp) // 绑定前缀为myapp的属性 Data // 使用Lombok public class MyAppProperties { private Thread thread new Thread(); private Task task new Task(); Data public static class Thread { private Integer poolSize; } Data public static class Task { private Integer timeout; } }现在你可以在任何需要的地方注入MyAppPropertiesBean并使用myAppProperties.getThread().getPoolSize()来获取配置值。这种方式类型安全且有IDE的自动补全支持。使用Bean手动声明这是最强大的方式用于完全接管某个组件的配置。例如你想自定义一个RestTemplate用于发送HTTP请求的客户端Configuration public class MyConfig { Bean public RestTemplate restTemplate() { RestTemplate restTemplate new RestTemplate(); // 在这里可以进行各种自定义配置比如设置连接超时、读写超时、拦截器等 restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); return restTemplate; } }当你声明了这个Bean后Spring Boot自动配置中关于RestTemplate的部分如果存在就会因为ConditionalOnMissingBean条件不满足而失效整个应用都会使用你定义的这一个RestTemplate实例。实操心得优先使用application.yml进行配置它简单直观。当配置项很多且相关时使用ConfigurationProperties进行分组绑定。只有当你需要对组件进行非常底层的、个性化的定制时才使用Bean手动声明。过度使用Bean手动声明相当于放弃了Spring Boot“约定大于配置”的便利性。5. 开发工具与调试技巧5.1 热部署实现代码修改实时生效在开发过程中每次修改代码都要重启应用非常影响效率。Spring Boot通过spring-boot-devtools模块提供了热部署功能。添加依赖在pom.xml中添加dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope !-- 通常设置为runtime表示只在运行时需要 -- optionaltrue/optional !-- optionaltrue可以防止依赖传递到其他模块 -- /dependency工作原理spring-boot-devtools会监控类路径classpath下文件的变动。当检测到.class文件发生变化时通常是因为你保存了Java文件IDE自动编译它会触发一个应用重启。但这个重启比冷启动要快得多因为它使用了两个类加载器一个用于加载不会变化的第三方库Base ClassLoader一个用于加载你正在开发的代码Restart ClassLoader。重启时只重启后者从而加快了速度。配置与限制默认情况下/META-INF/maven,/META-INF/resources,/resources,/static,/public,/templates这些目录下的资源文件变动会触发重启。你也可以在application.yml中通过spring.devtools.restart.exclude来排除某些路径。它不会监控Bean定义的变化比如Bean方法内部的逻辑变了对于这种情况仍然需要手动重启。在IntelliJ IDEA中需要确保开启了自动编译Settings - Build, Execution, Deployment - Compiler勾选Build project automatically。同时按CtrlShiftAlt/选择Registry勾选compiler.automake.allow.when.app.running。注意事项热部署在生产环境是必须禁用的可以通过设置环境变量spring.devtools.restart.enabledfalse或者在打包时排除spring-boot-devtools依赖来实现。optionaltrue的设置就是为了防止它被打进生产包。5.2 Actuator你的应用健康监控仪表盘spring-boot-starter-actuator为你的应用添加了一系列生产级的管理和监控端点HTTP接口。它让你能洞察应用内部状态比如健康状态、指标、环境配置、日志级别等。添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency常用端点默认情况下只有/actuator/health和/actuator/info是启用的。你需要在application.yml中暴露更多端点。management: endpoints: web: exposure: include: * # 暴露所有端点生产环境请谨慎按需开放 endpoint: health: show-details: always # 显示健康检查的详细信息启动应用后你可以访问http://localhost:8080/actuator/health应用健康状态UP/DOWN。http://localhost:8080/actuator/info应用自定义信息需在配置中设置info.app.namexxx。http://localhost:8080/actuator/metrics查看JVM内存、线程、HTTP请求等各类指标。http://localhost:8080/actuator/env查看所有环境属性包括系统属性、环境变量和application.yml中的配置。http://localhost:8080/actuator/loggers查看和动态修改日志级别非常实用的调试功能。5.3 日志配置让问题排查有迹可循良好的日志是调试和排查线上问题的生命线。Spring Boot默认使用Logback作为日志框架并通过application.yml提供了统一的配置入口。基础配置logging: level: root: INFO # 根日志级别 com.example.demo: DEBUG # 将我们自己项目的包级别设为DEBUG便于调试 org.springframework.web: DEBUG # 查看Spring MVC的详细请求处理过程 file: name: logs/myapp.log # 将日志输出到文件默认追加 pattern: console: %d{yyyy-MM-dd HH:mm:ss} - %msg%n # 控制台输出格式 file: %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n # 文件输出格式高级配置与Logback XML如果默认配置不能满足需求比如按天滚动归档、按文件大小分割、为不同包设置不同级别的输出目的地等你可以完全接管Logback的配置。在resources目录下创建一个logback-spring.xml文件注意是-spring后缀这样可以使用Spring的Profile特性Spring Boot会自动识别并使用它而忽略application.yml中的日志配置。一个简单的logback-spring.xml示例?xml version1.0 encodingUTF-8? configuration !-- 开发环境在控制台输出彩色日志 -- springProfile namedev include resourceorg/springframework/boot/logging/logback/console-appender.xml / root levelINFO appender-ref refCONSOLE / /root logger namecom.example.demo levelDEBUG/ /springProfile !-- 生产环境输出到文件并按天滚动 -- springProfile nameprod property nameLOG_PATH value./logs / property nameLOG_FILE valuemyapp / appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${LOG_FILE}.log/file encoder pattern%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/pattern /encoder rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePattern${LOG_PATH}/archived/${LOG_FILE}-%d{yyyy-MM-dd}.%i.log.gz/fileNamePattern maxHistory30/maxHistory !-- 保留30天 -- timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize100MB/maxFileSize !-- 单个文件最大100MB -- /timeBasedFileNamingAndTriggeringPolicy /rollingPolicy /appender root levelINFO appender-ref refFILE / /root /springProfile /configuration这个配置实现了环境隔离开发环境看彩色控制台日志生产环境则记录到按天和大小滚动的文件中。踩坑记录日志级别设置不当是常见问题。在开发环境可以将级别设为DEBUG甚至TRACE来获取详细信息但在生产环境一定要设为INFO或WARN否则会产生海量日志迅速占满磁盘并严重影响性能。使用logback-spring.xml配合spring.profiles.active是管理多环境日志的最佳实践。6. 打包、运行与部署入门6.1 两种打包方式Jar vs. War该如何选择Spring Boot应用可以打包成两种格式可执行JAR包和传统的WAR包。可执行JAR推荐这是Spring Boot的默认和推荐方式。它使用“胖JAR”Fat Jar或“超级JAR”Uber Jar格式即一个JAR包里不仅包含你编译的类文件还内嵌了所有依赖的第三方库在BOOT-INF/lib/目录下以及内嵌的Web服务器如Tomcat。这意味着你部署时只需要一个JAR文件和Java运行环境JRE运行命令极其简单java -jar your-app.jar。它实现了真正的“开箱即用”非常适合微服务和云原生部署。传统WAR包如果你需要将应用部署到已有的、外部的Tomcat、Jetty等Servlet容器中则需要打包成WAR。这时你需要修改两点在pom.xml中将packagingjar/packaging改为packagingwar/packaging。让主启动类继承SpringBootServletInitializer并重写configure方法。SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }打包后你会得到一个your-app.war文件将其放入外部Tomcat的webapps目录即可。选型建议对于全新的Spring Boot项目强烈建议使用可执行JAR包。它简化了部署流程与Docker等容器技术结合得更好也是云原生时代的标配。只有在公司强制规定必须使用已有应用服务器的情况下才考虑WAR包。6.2 使用Maven进行打包和运行在项目根目录下pom.xml所在目录打开命令行执行mvn clean packageMaven会执行清理、编译、测试、打包等一系列操作。最终在target目录下你会找到打包好的JAR文件名称通常是{artifactId}-{version}.jar例如demo-0.0.1-SNAPSHOT.jar。运行这个JARjava -jar target/demo-0.0.1-SNAPSHOT.jar应用就会以与在IDE中完全相同的方式启动。你可以通过--spring.profiles.active参数指定运行环境java -jar target/demo-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod6.3 基础Docker化部署将Spring Boot应用Docker化是实现现代化部署和持续集成/持续部署CI/CD的关键一步。你需要创建一个Dockerfile文件放在项目根目录。Dockerfile示例多阶段构建推荐# 第一阶段构建阶段 FROM maven:3.8.4-openjdk-11-slim AS builder WORKDIR /app COPY pom.xml . # 利用Maven的依赖缓存机制如果pom.xml没变则不会重复下载依赖 RUN mvn dependency:go-offline -B COPY src ./src RUN mvn clean package -DskipTests # 第二阶段运行阶段 FROM openjdk:11-jre-slim WORKDIR /app # 从构建阶段拷贝打好的JAR包 COPY --frombuilder /app/target/*.jar app.jar # 为了安全不以root用户运行 RUN useradd -m myuser USER myuser # 暴露端口与application.yml中server.port一致 EXPOSE 8080 # 启动命令 ENTRYPOINT [java, -jar, app.jar] # 可以在这里传递启动参数例如--spring.profiles.activeprod # CMD [--spring.profiles.activeprod]构建和运行Docker镜像在Dockerfile所在目录执行构建命令-t用于给镜像打标签docker build -t my-springboot-app:1.0 .运行容器-p将宿主机的8080端口映射到容器的8080端口-d表示后台运行docker run -d -p 8080:8080 --name myapp my-springboot-app:1.0现在你可以通过访问宿主机的http://localhost:8080来访问容器内运行的应用。实操心得多阶段构建可以显著减小最终镜像的体积因为它只包含运行所需的JRE和JAR包而不包含Maven、源代码等构建工具。使用openjdk:11-jre-slim作为基础镜像比完整的JDK镜像小很多。记得在docker run时通过环境变量-e或卷挂载-v的方式将生产环境的配置文件如application-prod.yml或密钥注入容器而不是打包进镜像。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门