Java

新手前置:3种不同方式快速创建1个Springboot工程

零 项目和背景说明

对于Java新手而言,快速创建1个Springboot工程非常必要。作为一个从Java新手开始出发的我而言,在本篇中通过图文并茂的方式,详细记录3种不同方式快速创建Springboot工程的异同和对比。

一 通过Spring官方网站创建Springboot工程

1 打开start.spring.io

https://start.spring.io/ 其实就是Spring initializr

项目选择基于Maven管理,语言用Java,Spring Boot版本选择当前最新的4.0.0,项目元数据根据当前默认即可。需要注意的是,dependency里要选择web,

 

选好之后,如下:

 

 

2 点击explore,查看项目pom.xml文件

点击界面上的EXPLORE按钮进行查看,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>
  <url/>
  <licenses>
    <license/>
  </licenses>
  <developers>
    <developer/>
  </developers>
  <scm>
    <connection/>
    <developerConnection/>
    <tag/>
    <url/>
  </scm>
  <properties>
    <java.version>17</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

 

需要注意的是,从springboot 4.0.0开始,对于web的依赖,从之前的spring-boot-starter-web改成了spring-boot-starter-webmvc。如果在界面上选择的是4.0.0以前的版本,比如点选那个3.5.8版本时,其pom.xml文件里的依赖则是:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

 

3 下载该项目的压缩包文件

4 解压压缩包demo.zip,并于IDEA打开该项目

查看pom.xml内容:

 

二 通过IDEA创建Maven Archetype工程,再转成Springboot工程

1 通过IDEA选择新建项目

根据提示,左侧菜单项目生成器,选择Maven Archetype:根据提示,填入对应的信息。

其中,项目原型,选择org.apache.maven.archetypes:maven-archetype-quickstart。如下:

org.apache.maven.archetypes:maven-archetype-quickstart

2 通过新建窗口打开项目

3 pom.xml添加依赖spring-boot-starter-parent和spring-boot-starter-webmvc

在我们的pom.xml文件里添加下述2个依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.0</version>
  </parent>
 
 ...
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc</artifactId>
    </dependency>
    <dependency>

 

就是参照和方法一中通过Spring官网的 start.spring.io创建出来的SpringBoot工程里的pom.xml文件,做对比得出来的,要添加这2个依赖。最终的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.0</version>
  </parent>

  <groupId>com.miaoshaproject</groupId>
  <artifactId>demo2</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>demo2</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>17</maven.compiler.release>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit-bom</artifactId>
        <version>5.11.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- Optionally: parameterized tests support -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.4.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.3.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.13.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.3.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.4.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>3.1.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>3.1.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.12.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.6.1</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 

4 项目里添加对应的resources目录

在main上,邮件选择创建directory,名字输入resources,IDEA会自动匹配到Maven sources Directories,如下:

至此,我们通过在IDEA上先创建1个Maven archetype工程,再在pom.xml添加2个Springboot的依赖,以及添加1个resources路径,进而创建了一个springboot工程。

三 一步到位,通过IDEA直接创建springboot工程

1 新建工程

2 类型选择springboot

3 设置对应的配置项

4 指定对应的springboot版本和依赖

这里选择springboot 4.0.0版本,依赖里输入web进行搜索,并且选中Spring Web依赖项。

5 打开工程

6 查看工程项目结构

四 方式一和方式二到底有什么区别?为什么方式二的pom.xml文件里的build元素下多了很多子元素?而方式一或方式三的pom.xml却很干净优雅?

核心原因在于:方式二创建出来的并不是一个“纯净”的工程,而是基于Maven的官方模板archetype创建的一个Java骨架项目的快速原型,从其名字可以看出一二,maven-archetype-quickstart。这套标准模版是Apache Maven在10几年前就定义好了的一套标准的Java基础项目模板,它出现的时候,都还没有Springboot呢。进而,pom.xml文件里build子元素,拖泥带水的多出了内容,其原因是这些插件可以用于在没有任何父pom的依赖限定情形下,依然可以稳定的编译、清理、打包,它锁住了lockdown这些需要用到的Maven核心插件:

<build>
  <pluginManagement> <!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
    <plugins>
      <plugin><artifactId>maven-clean-plugin</artifactId><version>3.4.0</version></plugin>
      <plugin><artifactId>maven-resources-plugin</artifactId><version>3.3.1</version></plugin>
      <plugin><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version></plugin>
      <plugin><artifactId>maven-surefire-plugin</artifactId><version>3.3.0</version></plugin>
      <plugin><artifactId>maven-jar-plugin</artifactId><version>3.4.2</version></plugin>
      ...
    </plugins>
  </pluginManagement>
</build>

 

为啥呢?这么做的原因是,这一套代码在不同的机器上编译、打包、clean时,都采用这些锁死的插件版本,避免由于不同电脑上安装或使用不同版本的插件,导致产生不同的结果的尴尬情况发生。比如,这套代码明明在我电脑上打包、编译都ok,到你电脑上就为啥不行了呢?

同时,看到它们外层的标签是<pluginManagement>,是用于插件管理的,源代码里,也自动加上了lock down plugins versions注释说明的问题,可以看到它是干嘛用的了。其作用就是声明并锁定插件。

方式一和方式三,创建的是专门针对于Springboot而定制化的创建工程的模板,在其内部已经自动定义好了父pom,在pom.xml上面靠前部分,

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>4.0.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

 

以及在build标签里,只需要引入

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

 

这一个插件就OK了,Springboot会自动根据前面的依赖parent里的版本来,自动帮我们锁定工程clean、compile、package所需要的插件及其版本了。因此,pom.xml代码看起来变得非常优雅、清爽。

简单总结对比:方式一或方式三,是为Springboot专门定制好的精装房,方式二,却是Maven archetype quickstart的模板毛坯房。

五 如何把方式二中创建的工程改为和方式一相同的项目结构,包含pom.xml也保持简洁

由于方式二是创建的Maven archetype quickstart脚手架类型的Java工程,其pom.xml文件里除了多出了Maven自己约定和锁死的插件,在<pluginManagement>标签里定义的内容之外。Maven还自动创建了包含junit的插件依赖。如果我们想要使之改成和方式一创建的相同的项目结构,就需要把<build>构建标签下之前的<pluginManagement>及其子标签的所有内容替换为,spring-boot-maven-plugin:

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

 

同时,删掉所有和junit相关的依赖,替换为Springboot自动管理的依赖,spring-boot-starter-webmvc-test:


	  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webmvc-test</artifactId>
      <scope>test</scope>
    </dependency>

 

另外,需要给项目工程添加src/main/resource路径。

六 参考

https://spring.io/quickstart

 

 

 

 

留言