SpringBoot启动成功,但端口启动失败
目录
一、问题展示
二、问题分析
2.1.端口与Tomcat的关系
2.2.问题分析
三、SpringBoot常见知识记录
3.1.SpringBoot项目常用jar包
3.1.1.必要性jar包
3.1.2.选择性jar包
3.2.标签的作用及取值
3.2.1.compile(编译范围)
3.2.2.provided(已提供范围)
3.2.3.runtime(运行时范围)
3.2.4.test(测试范围)
3.2.5.system(系统范围)
3.2.6.import(导入范围)
3.3.POM文件中, 和 标签
3.4.POM文件中的作用
一、问题展示
新建的项目,启动后控制台日志如图所示。可以看到SpringBoot版本(2.4.8),JDK 版本(1.8.0),电脑信息和启动用时(0.918s)等信息,但最后出现了:Process finished with exit code 0。
"Process finished with exit code 0" 是一个常见的消息,表示你的程序或脚本已经成功执行并正常结束了。在大多数操作系统和编程环境中,退出代码(或称为返回码)用于表示程序的执行结果。退出代码 0 通常被约定为“成功”或“没有错误”的标志。
值得注意的是,成功执行:这意味着程序按照预期完成了所有任务,没有出现运行时错误或异常情况。而问题是,我需要项目一直启动,而不是启动后即结束,左侧蓝箭头也显示,项目也启动结束了,重新检查后,发现端口信息没找到。正确项目日志如下所示:
两个图片对比,中间新增了端口的启动日志,左侧的蓝色箭头也有变化,显示项目在启动中。
二、问题分析
2.1.端口与Tomcat的关系
由上图图二可知,端口是由Tomcat启动的,在SpringBoot项目中,端口由Tomcat启动的原因与SpringBoot的核心理念和设计方式紧密相关。SpringBoot旨在简化应用的创建、配置和部署过程,而内置Tomcat(或其他嵌入式Servlet容器)是实现这一目标的重要手段之一。而端口由Tomcat启动的原因由以下几点
-
嵌入式Servlet容器:
SpringBoot内置了一个嵌入式的Servlet容器(默认是Tomcat),这意味着开发者无需手动下载、安装和配置外部的Servlet容器(如传统的Tomcat服务器),就可以直接运行Web应用。这种方式简化了部署流程,使得开发者只需一个“可执行的”JAR或WAR文件即可快速部署应用。 -
自动配置:
SpringBoot的自动配置特性会检查类路径上的依赖,并自动配置应用。当加入spring-boot-starter-web
依赖时,默认也会加入Tomcat的嵌入式依赖。在SpringBoot的启动过程中,TomcatAutoConfiguration
类会被自动应用(如果类路径上存在Tomcat的相关依赖且没有其他Servlet容器配置),从而创建一个TomcatServletWebServerFactory
,该工厂负责配置、创建和启动Tomcat实例。 -
端口配置:
端口的配置可以在application.properties
或application.yml
文件中指定,也可以在启动应用程序时通过命令行参数来指定。无论是哪种方式,这些配置信息最终都会被TomcatServletWebServerFactory用于配置Tomcat的Connector,Connector是Tomcat中负责监听端口、接收请求的组件。因此,端口的配置实际上是在Tomcat启动之前或启动过程中完成的,并由Tomcat负责监听和响应来自该端口的请求。 -
集成SpringMVC:
SpringBoot还通过自动配置类注册了DispatcherServlet
,这是SpringMVC的核心组件之一,负责将请求分发给相应的控制器处理。由于Tomcat是SpringBoot内置的Servlet容器,因此DispatcherServlet
也运行在Tomcat上,负责处理来自配置端口的HTTP请求。
2.2.问题分析
首先,用命令查看本地端口是否被占用
其次,看配置文件,server.port 的端口配置是在配置文件里的。
然后,POM排查,文件里 spring-boot-starter-web 我是缺失的,加上下面的POM配置,项目就正常启动了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.8</version>
<scope>compile</scope>
</dependency>
POM文件完全加载后,从Maven也可以看到,spring-boot-starter-web里是包含Tomcat的。同时也能看到,该jar集成了web和webmvc,所以也能用来处理HTTP请求(比如一个RESTful API或者Web应用)。
三、SpringBoot常见知识记录
3.1.SpringBoot项目常用jar包
3.1.1.必要性jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.4.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.8</version>
</dependency>
<!-- Mybatis的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Mybatis-plus的依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
3.1.2.选择性jar包
Mysql Connector java(如果使用Mysql):如果使用Mysql,可以使用该jar进行数据库连接,并提供驱动。
<!-- 数据库连接池的依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
Spring Boot Starter Data JPA(如果你使用JPA):如果你打算使用JPA来访问数据库,spring-boot-starter-data-jpa
是一个很好的选择,它包括了Hibernate, Spring Data JPA, 和数据库连接的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.4.8</version>
</dependency>
注意:由于你已经选择了MyBatis Plus,这个依赖可能不是必需的,除非你还打算同时使用JPA。
日志框架(虽然Spring Boot默认包含):虽然Spring Boot默认使用了Logback作为日志框架,但你可能需要添加其他日志相关的依赖,比如SLF4J的绑定,但通常这不是必需的,因为Spring Boot已经为你处理了。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
Spring Boot DevTools(开发时非常有用):在开发过程中,spring-boot-devtools
提供了一些有用的功能,比如自动重启和快速的应用上下文重新加载。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
安全框架(如Spring Security):如果你的应用需要安全功能(如用户认证和授权),你可能需要添加Spring Security的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.4.8</version>
</dependency>
缓存框架(如Spring Cache + Redis):如果你的应用需要缓存支持,可以考虑添加Spring Cache的抽象层,并可能使用Redis作为缓存实现。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.4.8</version>
</dependency>
<!-- 如果使用Redis作为缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.8</version>
</dependency>
根据项目需求,可能还需要添加其他第三方库,比如消息队列(RabbitMQ, Kafka等)、搜索引擎(Elasticsearch)、邮件发送(Spring Boot Starter Mail)等,需要的依赖将完全取决于你的项目需求。
3.2.<scope>标签的作用及取值
在Maven的pom.xml文件中,<scope>标签用于指定依赖项的作用范围。它决定了依赖项在项目的哪个阶段是可用的,以及是否会被打包进最终的构建产物(如JAR或WAR文件)中。<scope>有几种不同的值,每种值对应不同的用途和行为。以下是几种常见的<scope>值及其区别:
3.2.1.compile(编译范围)
默认值:如果不指定<scope>,则默认为compile。
用途:这个范围的依赖项在项目的编译、测试、运行阶段都是可用的。它们会被打包进最终的构建产物中。
示例:像spring-boot-starter-web这样的依赖,因为它们是项目运行所必需的,所以通常设置为compile范围。
3.2.2.provided(已提供范围)
用途:这个范围的依赖项在编译和测试阶段可用,但在运行时不需要打包进去,因为假设容器或JDK已经提供了这些依赖项。
示例:在开发Web应用时,Servlet API和JSP API的依赖通常被设置为provided,因为Web服务器(如Tomcat)已经提供了这些库。
3.2.3.runtime(运行时范围)
用途:这个范围的依赖项在编译时不是必需的,但在运行和测试阶段需要。它们会被打包进最终的构建产物中。
示例:JDBC驱动实现通常被设置为runtime范围,因为它们在编译时不是必需的,但在运行时是需要的。
3.2.4.test(测试范围)
用途:这个范围的依赖项仅在测试编译和运行阶段可用,不会被打包进最终的构建产物中。
示例:JUnit和Mockito等测试框架的依赖通常被设置为test范围。
3.2.5.system(系统范围)
用途:这个范围与provided类似,但是你需要通过systemPath元素显式地指定依赖项的路径。由于它绕过了Maven的依赖解析机制,因此不推荐使用,除非在特殊情况下。
示例:通常不推荐使用,因为它破坏了Maven的依赖管理原则。 除非,别人自定义了jar,然后在小组开发过程中,供大家集体使用这种特殊情况。
<dependency>
<groupId>x509</groupId>
<artifactId>x509</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/x509.jar</systemPath>
</dependency>
3.2.6.import(导入范围)
用途:这个范围仅用于<dependencyManagement>部分,用于导入另一个POM文件中的<dependencyManagement>配置,从而允许你跨多个POM文件共享一致的依赖配置。
示例:在Spring Boot项目中,spring-boot-dependencies POM通过<dependencyManagement>和<scope>import</scope>被导入,以提供对Spring Boot依赖项的集中管理。
3.3.POM文件中<groupId>, <artifactId>
和 <version>
标签
在Maven的POM(Project Object Model)文件中,<groupId>, <artifactId>, 和 <version> 这三个标签是项目的基本坐标(coordinates),它们共同定义了Maven项目在仓库中的唯一位置。下面是每个标签的具体作用:
<groupId>:
作用:定义了项目属于哪个实际的Maven项目对象模型(POM)的组。这个组通常基于公司的域名反写来命名,以确保唯一性。例如,com.bypay 表示这个项目是由 bypay.com 这个公司或组织开发的。
重要性:<groupId> 是项目坐标的重要部分,它帮助Maven识别项目所属的组或公司,以便在仓库中正确地组织和查找项目。
<artifactId>:
作用:定义了项目在所属组(<groupId>)中的唯一ID。这通常是项目的名称或模块名。例如,xmgj-reconciliation 可能表示这个项目或模块是关于“xmgj”的“reconciliation”(对账)功能。
重要性:<artifactId> 与 <groupId> 一起,唯一地标识了一个Maven项目或模块。这允许Maven从仓库中精确地下载或引用该项目。
<version>:
作用:定义了项目的当前版本。版本号通常是按照某种约定(如主版本号.次版本号.修订号[-快照/里程碑])来编写的,以反映项目的不同发布阶段和兼容性。例如,1.0-SNAPSHOT 表示这是一个处于开发阶段(快照)的1.0版本。
重要性:<version> 允许Maven管理项目的不同版本,确保依赖的精确性和兼容性。它还允许项目在开发过程中进行迭代和发布,而不会影响其他依赖该项目的项目。
综上所述,<groupId>, <artifactId>, 和 <version> 这三个标签共同构成了Maven项目的唯一标识,使得Maven能够准确地定位、下载和构建项目及其依赖。
3.4.POM文件中的<build>作用
在pom.xml
文件中的<build>
部分,通常包含了与构建项目相关的配置。这些配置可以指定如何编译源代码、处理资源文件、插件的配置等。对于Spring Boot项目来说,<build>
部分通常会特别关注于Spring Boot Maven插件(spring-boot-maven-plugin
)的配置,因为它负责将项目打包成可执行的jar或war文件。以下是一个基本的<build>
部分示例,该示例展示了在Spring Boot项目中常见的配置:
<build>
<!-- 项目打成jar包后的名称,有以下两种方式,可直接命名,也可以引用命名 -->
<!-- <finalName>xmgj-reconciliation</finalName>-->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Spring Boot Maven 插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 这里通常不需要指定版本号,因为Spring Boot的starter-parent已经管理了它 -->
<!-- 插件配置 -->
<configuration>
<!-- 可选的配置项,比如指定mainClass,但通常不是必需的,因为Spring Boot插件可以自动找到 -->
<!-- <mainClass>com.example.MyApplication</mainClass> -->
<!-- 其他可能的配置,如打包时排除某些文件或目录 -->
<!-- <excludes>
<exclude>
<groupId>org.group</groupId>
<artifactId>artifact</artifactId>
</exclude>
</excludes> -->
<!-- 启用/禁用重新打包 -->
<!-- <repackage>true</repackage> -->
<!-- 其他插件特定的配置项 -->
</configuration>
<!-- 插件执行的阶段,通常不需要指定,因为Spring Boot插件默认绑定到了一些生命周期阶段 -->
<!-- <executions>
...
</executions> -->
</plugin>
<!-- 其他插件配置,如编译插件、资源插件等 -->
<!-- version:指定插件版本,但Spring Boot的starter-parent可能已经管理了它 -->
<!-- source:Java源代码版本 -->
<!-- target:目标Java版本 -->
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.4.8</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
-->
</plugins>
<!-- 其他构建相关的配置,如资源文件配置 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 可选的配置,比如过滤文件等 -->
<!-- <filtering>true</filtering> -->
</resource>
</resources>
</build>