在 Eclipse 中使用 Maven 创建 Web 项目
1. 建立 Maven Project
选择 File→New→Other,在 New 对话框中选择 Maven→Maven Project→Next。
2. 选择项目路径
勾选 Use default Workspace location(使用默认工作空间)→Next。
3. 选择项目类型
在 Artifact Id 中选择 maven-archetype-webapp。如果是 Spring Boot 项目,可以选择 maven-archetype-quickstart。
4. 输入 Group ID、Artifact ID 以及 Package
注意:Group Id 一般写大项目名称,Artifact Id 是子项目名称,Package 是默认的包名,不写也可以。
刚建立好后的文件结构如下图所示。
如果这里显示的内容多,一般是 Filters 设置的问题;或者 Perspective 为 JavaEE 模式,将其改成 Java 模式就可以了。
5. 配置项目
在选择 maven_archetype_web 原型后,如上图所示,项目中默认只有 src/main/resources 这个 Source Floder,还需要添加 src/main/java、src/test/java 和src/test/resources 这三个 Source Floder。右键项目根目录点击 New→Source Folder,建出这三个文件夹。
可能只有 src/test/resources 的 Source Folder 可以创建,
而添加 src/main/java、src/test/java 的 Source Floder 时可能会报 The folder is already a source folder 的错误。如下图所示。
分析原因:右键项目→Properties→Java Build Path→Source 标签,会看到 src/main/java, src/test/java 已存在,但是后面的括号中的内容为 missing。所以只需要创建目录,Source Floder 应该就会出现了。
解决办法:使用 Navigator 视图(如果 Package Explorer 标签旁边没有Navigator标签,那么 Preferences→Show View→Navigator 即可显示 Navigator 标签)直接建立文件夹。比如创建 src/main/java:选择 Navigator 视图→右键目录树中的 src/main 目录→New→Folder(在现有的 src/main 目录下直接创建 java 子目录),如下图所示。
最终在 Package Explorer 视图中要有前面说过的四个 Source Folder,如下图所示。
6. 更改编译输出文件的存放目录
右键项目→Build Path→Configure Build Path→Source 标签,
Source 标签中应该有下面 4 个已经创建的文件夹:
- src/main/java
- src/main/resources
- src/test/java
- src/test/resources
勾选上最下面的 Allow output folders for source folders 复选框来允许为 Source Folder 创建输出文件夹。然后双击每个 Source Folder 文件夹下的 Output folder(有的 Source Folder 使用最下方的 Browse... 按钮左边的 Default output folder 作为默认的编译输出文件夹),按如下规则选择输出目录:
- src/main/java 和 src/main/resources,选择 target/classes;
- src/test/java 和 src/test/resources,选择 target/test-classes;
注意:target/classes 和 target/test-classes 目录存放着编译输出的“.class”文件即相关配置文件,这些“.class”文件和配置文件也是按照相应的包结构存放的。
如果需要更改文件夹显示的顺序:通过 Order and Export 标签进行排序即可。
更改 JRE 版本:点击 Libraries 标签→双击 JRE System Library,选择合适的(Maven 构建 Web 工程需要使用 JDK 安装目录下私有 JRE,即“Jdk_Installed_Directory/jre”,而不能是公共 JRE,关于私有 JRE 和公共 JRE 的区别请参考 Oracle 官网上关于 Private Versus Public JRE 的介绍)、较新的 JRE版本。
关于 JRE 的设置,可通过点击 Installed JREs...按钮→通过 Add.. 按钮(或 Edit... 按钮)来添加系统中已安装(或编辑已添加)的 JRE,可以指定系统中已安装 JRE的路径(JRE home)和 JRE 的别名(JRE name),当然也可以复制(通过 Duplicate... 按钮)和删除(通过 Remove... 按钮)已添加的 JRE。如下图所示。
7. 把项目变成 Dynamic Web 项目
如果是 Spring Boot 项目,可以省略该该步骤。
右键项目,选择 Properties→Project Facets,点击 Convert to faceted form... 按钮。取消 Dynamic Web Module 复选框的勾选(否则更改其版本时下面会提示 Cannot change version of project facet Dynamic Web Module to X.x 的错误),将其版本改为 3.0(需要 1.6 及以上的 JDK),然后将Java的版本改为 1.8,点击 Apply 按钮。
再勾选 Dynamic Web Module 复选框,点击下方弹出的 Further configuration available... 临时按钮,在弹出的对话框中将 Content directory 改为src/main/webapp,同时勾选 Generate web.xml deployment descriptor 复选框来生成 web.xml 配置文件,依次点击 OK、Apply 和 OK 按钮。如下图所示。
如果提示错误,可能需要在 Java Compiler 设置 Compiler compliance level 为 1.6 或更高,或者需要在此窗口的 Java 的 Version 改成 1.6(Dynamic Web Module 为 3.0 时)或更高。
8. 设置部署程序集(Web Deployment Assembly)
再次打开当前项目的 Properties 窗口,点击左侧列表中 Deployment Assembly,此处显示的列表是,部署项目时,文件发布的路径。如下图所示。
删除名称中含有 test 的文件夹,因为 test 是测试使用,并不需要部署。然后依次点击 Apply 和 OK 按钮。置完成效果如下图所示。
9. 构建框架:在 pom.xml 中添加所需要的 jar 包(依赖和插件)
双击项目中的 pom.xml 文件,默认使用 Maven POM Editor 打开 pom.xml 文件,选择 Dependencies 标签,在 Dependencies 栏目点击 Add 按钮,首先弹出一个搜索按钮,例如输入 javax.servlet,就会自动搜索关于 servlet 相关的 jar 包,可以很方便的地选择使用比较多的版本的jar包,还可以通过 Scope 来指定 jar 包的作用范围。如下图所示。
需要添加的其他 jar 包有:junit、jstl。或者点击 pom.xml 标签直接编辑 pom.xml 文件,这样可以直接粘贴从 Maven 仓库(通过 Maven 仓库,我们可以搜索各种版本的jar包)中复制过来 dependency 内容。这里给出我们的 pom.xml 内容:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rosydawn.maven.demo</groupId>
<artifactId>maven-web-demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>maven-web-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<build>
<finalName>maven-web-demo</finalName>
</build>
</project>
10. 运行
通过 Tomcat 插件运行
右键项目→ Run As → Maven install → 右键项目 → Run As → Package,生成完后 Run As → Run on Servers 即可。
也可以使用 Tomcat 的 Maven 插件,在 pom.xml 文件中添加该插件后,即可通过该插件运行 Web 项目。可通过在 pom.xml 文件的 <bulid>
元素中添加以下内容来添加该插件。如以下代码所示:
<build>
<finalName>maven-web-demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>9999</port><!-- 定义程序运行端口 -->
<path>/</path><!-- 定义程序映射目录 -->
<urlEncoding>utf8</urlEncoding><!--解决url乱码 -->
</configuration>
</plugin>
</plugins>
</build>
添加完该插件后,通过右键项目→ Run As → Maven build...,如下图所示。
然后在弹出的对话框的 Goals 栏中填写 tomcat7:run,Name 栏为默认的运行配置名称。后续再运行该项目时,可在接选中项目后,如下图所示,
点击工具栏运行按钮,选择初次运行该项目时默认运行配置名称(即 maven-web-demo)即可运行该项目了。
通过 Jetty 插件运行
Tomcat 的 Maven 插件只支持到 Tomcat 7,从 2013 年到现在(2021 年)一直没有再更新过,不建议使用。可以考虑使用 Jetty 的 Maven 插件,如下所示。
<build>
<finalName>maven-web-demo</finalName>
<plugins>
<!--Jetty 9.x插件。You should use Maven 3.3+ for this plugin-->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.25.v20180606</version>
<!--<version>9.3.24.v20180605</version>-->
<!--<version>9.4.11.v20180605</version>-->
<configuration>
<!--可选。httpConnector元素用于配置connector-->
<!--如果没有指定该元素,则会默认创建一个监听8080端口的ServerConnector。也可以通过标准的jetty xml配置文件
来设置connector,然后在jettyXml元素中引入这些配置文件-->
<httpConnector>
<!--port元素指定connector的监听端口。默认为8080-->
<port>8080</port>
<!--host元素指定connector监听的接口。默认监听所有接口-->
<!--<host>localhost</host>-->
<!--name元素指定connector名称。在配置特定connector的响应上下文时有用-->
<!--<name>jetty-connector</name>-->
<!--idleTimeout元素指定连接的最大空闲时间-->
<!--<idleTimeout>1800</idleTimeout>-->
<!--soLinger元素设置socket linger时间-->
<!--<soLinger>0</soLinger>-->
</httpConnector>
<!--可选。jettyXml元素指定逗号分隔的jetty xml文件列表,用于配置其他jetty信息,功能强大-->
<!--jetty-context.xml文件配置忽略代码校验,以免jetty启动很慢-->
<jettyXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-context.xml</jettyXml>
<!--可选。scanIntervalSeconds元素设置检查是否发生变更以及如果有变更就自动热部署的时间间隔-->
<!-- if you save changes and recompile your class files, Jetty redeploys your webapp, and you can
instantly test the changes you just made-->
<!--默认为0,表示不进行变更检查和自动热部署-->
<scanIntervalSeconds>5</scanIntervalSeconds>
<!--可选。reload元素设置内容改变后是否自动重新加载和部署。默认为automatic,结合scanIntervalSeconds元素的非零值使用。-->
<!--设置为manual将忽略scanIntervalSeconds元素的设置-->
<!--<reload>manual</reload>-->
<!--可选。dumpOnStart元素设置在启动时是否清空容器(dump out the server structure)。默认为false-->
<!--<dumpOnStart>true</dumpOnStart>-->
<!--可选。loginServices元素可配置多个org.eclipse.jetty.security.LoginService实现。注意,并没有默认
的realm,如果你在web.xml中用到了一个realm,可以在这里指定相关的realm。也可以通过标准的jetty xml配置文件
来设置connector,然后在jettyXml元素中引入这些配置文件-->
<!--<loginServices>
<loginService implementation="org.eclipse.jetty.security.HashLoginService">
<name>Test Realm</name>
<config>${basedir}/src/etc/realm.properties</config>
</loginService>
</loginServices>-->
<!--可选。requestLog元素指定一个org.eclipse.jetty.server.RequestLog实现类。还可以有其他三种方式来配置:
jetty xml文件和jettyXml元素,context xml文件和contextXml元素,webApp元素-->
<requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
<filename>target/access-yyyy_mm_dd.log</filename>
<filenameDateFormat>yyyy_MM_dd</filenameDateFormat>
<logDateFormat>yyyy-MM-dd HH:mm:ss</logDateFormat>
<logTimeZone>GMT+8:00</logTimeZone>
<append>true</append>
<logServer>true</logServer>
<retainDays>120</retainDays>
<logCookies>true</logCookies>
</requestLog>
<!--自Jetty 9.3.1版本开始可选。配置一个org.eclipse.jetty.server.Server实例。
一般不用设置该元素,尤其是使用了jettyXml元素的情况下(在jetty xml中就可以配置Server)。
如果同时配置了两者,那么jetty xml文件将会覆盖pom.xml配置-->
<!--<server></server>-->
<!--可选。stopPort元素指定接收stop命令的端口。与jetty:stop或jetty:run-forked目标一起使用时有用-->
<stopPort>9966</stopPort>
<!--可选。stopKey元素和stopPort元素配合使用,用于指定发送到关闭端口的关闭命令的字符串,从而来验证stop命令。 -->
<stopKey>shutdown</stopKey>
<!--可选。systemProperties元素用于配置该插件运行时的系统属性-->
<!--<systemProperties>
<systemProperty>
<name>foo_prop</name>
<value>bar_value</value>
</systemProperty>
</systemProperties>-->
<!--可选。systemPropertiesFile指定指定一个包含该插件运行时的系统属性的文件。
这里设置的系统属性默认不会覆盖命令行、JVM和systemProperties元素指定的系统属性,也可以设置为强制覆盖-->
<!--<systemPropertiesFile></systemPropertiesFile>-->
<!--可选。skip元素用于设置是否执行该插件,默认为false。与在命令行设置-Djetty.skip系统属性有相同效果。
在集成测试中想要跳过测试时这样配置jetty很有用-->
<!--<skip>true</skip>-->
<!--默认为false。如果为true,则会将<scope>provided</scope>类型的依赖添加到容器的类路径中,一般都会使用容
器已经提供的依赖,所以,一般都不用配置该元素。除非容器提供的依赖达不到使用要求-->
<!--<useProvidedScope>true</useProvidedScope>-->
<!--可选。excludedGoals元素指定不执行的Jetty插件的目标列表-->
<!--<excludedGoals>run,run-exploded</excludedGoals>-->
<!--忽略代码校验,以免 Jetty 启动很慢。-->
<contextXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-context.xml</contextXml>
<!-- 指定系统属性。这里配置的属性不会覆盖命令行和JVM指定的属性,仅用于补充两者配置的属性。 -->
<!--<systemProperties>
<systemProperty>
<name>foo_prop</name>
<value>bar_value</value>
</systemProperty>
</systemProperties>-->
<!-- 也可以选择使用属性文件类配置系统属性。这里配置的属性不会覆盖命令行、JVM和systemProperties指定的属性,
仅用于补充三者配置的属性。-->
<!--<systemPropertiesFile>${project.basedir}/my.props</systemPropertiesFile>-->
<webApp>
<!-- 设置项目的ContextPath,默认为“/${project.artifactId}”。 -->
<contextPath>/${project.artifactId}</contextPath>
<!-- Jetty提供静态资源的多个目录,用来替换baseResource元素。 -->
<resourceBases>
<resourceBase>${project.basedir}/src/main/webapp</resourceBase>
<!--<resourceBase>${project.basedir}/commons</resourceBase>-->
</resourceBases>
<!-- 指定一个jetty-env.xml文件的路径,在该文件中可使用JNDI。
确定该文件打包进classpath中,如果把该文件放在测试目录就不行。-->
<jettyEnvXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-env.xml</jettyEnvXml>
</webApp>
</configuration>
</plugin>
<!--Jetty 7.x or Jetty 8.x插件。You will need to use maven 3 from jetty-7.5.3 release going forwards-->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<!--可选。connectors元素指定一个org.eclipse.jetty.server.Connector对象(jetty的端口监听器)列表。如果没有指定,
则会默认在8080端口上配置一个NIO org.eclipse.jetty.server.nio.SelectChannelConnector对象。也可以在标准
jetty xml文件里配置connectors,然后在jettyXml元素中引用该配置文件-->
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<!-- 可通过命令行指令“mvn -Djetty.port=9999 jetty:run” 来设置jetty.port系统属性更改默认端口。 -->
<port>8080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>9090</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<!--可选。jettyXml元素指定逗号分隔的jetty xml文件列表,用于配置其他jetty信息,功能强大-->
<!--jetty-context.xml文件配置忽略代码校验,以免jetty启动很慢-->
<jettyXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-context.xml</jettyXml>
<!--可选。scanIntervalSeconds元素设置检查是否发生变更以及如果有变更就自动热部署的时间间隔-->
<!-- if you save changes and recompile your class files(you can use IDE auto build function),
Jetty redeploys your webapp, and instantly test the changes you just made-->
<!--默认为0,表示不进行变更检查和自动热部署-->
<scanIntervalSeconds>5</scanIntervalSeconds>
<!--可选。systemProperties元素用于配置该插件运行时的系统属性-->
<!--<systemProperties>
<systemProperty>
<name>foo_prop</name>
<value>bar_value</value>
</systemProperty>
</systemProperties>-->
<!--可选。systemPropertiesFile指定指定一个包含该插件运行时的系统属性的文件。这里设置的系统属性默认不会覆盖命令
行、JVM和systemProperties元素指定的系统属性,仅用于补充三者配置的属性,也可以设置为强制覆盖-->
<!--<systemPropertiesFile>${basedir}/my.props</systemPropertiesFile>-->
<!--可选。skip元素用于设置是否执行该插件,默认为false。与在命令行设置-Djetty.skip系统属性有相同效果。
这在集成测试中配置jetty跳过测试时很有用-->
<!--<skip>true</skip>-->
<!--可选。loginServices元素可配置多个org.eclipse.jetty.security.LoginService实现。注意,并没有默认
的realm,如果你在web.xml中用到了一个realm,可以在这里指定相关的realm。也可以通过标准的jetty xml配置文件
来设置connector,然后在jettyXml元素中引入这些配置文件-->
<!--<loginServices>
<loginService implementation="org.eclipse.jetty.security.HashLoginService">
<name>Test Realm</name>
<config>${basedir}/src/etc/realm.properties</config>
</loginService>
</loginServices>-->
<!--可选。requestLog元素指定一个org.eclipse.jetty.server.RequestLog实现类。还可以有其他三种方式来配置:
jetty xml文件和jettyXml元素,context xml文件和contextXml元素,webApp元素-->
<requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
<filename>target/access-yyyy_mm_dd.log</filename>
<filenameDateFormat>yyyy_MM_dd</filenameDateFormat>
<logDateFormat>yyyy-MM-dd HH:mm:ss</logDateFormat>
<logTimeZone>GMT+8:00</logTimeZone>
<append>true</append>
<logServer>true</logServer>
<retainDays>120</retainDays>
<logCookies>true</logCookies>
</requestLog>
<!--可选。stopPort元素指定接收stop命令的端口。与jetty:stop或jetty:run-forked目标一起使用时有用-->
<stopPort>9966</stopPort>
<!--可选。stopKey元素和stopPort元素配合使用,用于指定发送到关闭端口的关闭命令的字符串,从而来验证stop命令。 -->
<stopKey>shutdown</stopKey>
<!--可选。scanIntervalSeconds元素设置检查是否发生变更以及如果有变更就自动热部署的时间间隔-->
<!-- if you save changes and recompile your class files, Jetty redeploys your webapp, and you can
instantly test the changes you just made-->
<!--默认为0,表示不进行变更检查和自动热部署-->
<scanIntervalSeconds>5</scanIntervalSeconds>
<!--可选。reload元素设置内容改变后是否自动重新加载和部署。默认为automatic,结合scanIntervalSeconds元素的非零值使用。-->
<!--设置为manual将忽略scanIntervalSeconds元素的设置-->
<!--<reload>manual</reload>-->
<!--忽略代码校验,以免 Jetty 启动很慢。-->
<contextXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-context.xml</contextXml>
<!--<dumpOnStart>true</dumpOnStart>-->
<!--可选。systemProperties元素用于配置该插件运行时的系统属性-->
<!--<systemProperties>
<systemProperty>
<name>foo_prop</name>
<value>bar_value</value>
</systemProperty>
</systemProperties>-->
<!--可选。systemPropertiesFile指定指定一个包含该插件运行时的系统属性的文件。这里设置的系统属性默认不会覆盖命令
行、JVM和systemProperties元素指定的系统属性,仅用于补充三者配置的属性,也可以设置为强制覆盖-->
<!--<systemPropertiesFile>${basedir}/my.props</systemPropertiesFile>-->
<!--Configuring Your WebApp-->
<!--webApp元素配置一个org.eclipse.jetty.webapp.WebAppContext的扩展,其任何setter方法都可用来配置Web应用-->
<webApp>
<!-- set the context path for your webapp,default is “/${project.artifactId}”-->
<contextPath>/${project.artifactId}</contextPath>
<!-- Optional. Location of a jetty-env.xml file, which allows you to make JNDI bindings that
satisfies <env-entry>, <resource-env-ref> and <resource-ref> linkages in the web.xml. Note that
these can also be made in a <jettyXml> file if you want them to apply to more than one webapp.
确保该文件打包进classpath中,如果把该文件放在测试目录就不行。-->
<jettyEnvXml>${project.basedir}/src/main/webapp/WEB-INF/jetty-env.xml</jettyEnvXml>
<!--The path to a dir that Jetty can use to expand or copy jars and jsp compiles when your
webapp is running. The default is ${project.build.outputDirectory}/tmp-->
<!--<tempDirectory>${project.build.outputDirectory}/tmp</tempDirectory>-->
<!--the path from which Jetty will serve static resources. Defaults to src/main/webapp.-->
<!--<baseResource>${project.basedir}/src/main/webapp</baseResource>-->
<!-- use instead of <baseResource> if you have multiple dirs from which you want to serve static
content. This is an array of dir names.-->
<resourceBases>
<resourceBase>${project.basedir}/src/main/webapp</resourceBase>
<!--<resourceBase>${project.basedir}/commons</resourceBase>-->
</resourceBases>
<!--The path to the web.xml file for your webapp-->
<!--<descriptor>${project.basedir}/src/main/webapp/WEB-INF/web.xml</descriptor>-->
<!--The path to a webdefault.xml file that will be applied to your webapp before the web.xml.
If none is supplied, Jetty uses a default one baked into the jetty-webapp.jar.-->
<!--<defaultsDescriptor></defaultsDescriptor>-->
<!--The path to a web.xml file that will be applied after your web.xml is read.
You can use this to replace or add configuration.-->
<!--<overrideDescriptor></overrideDescriptor>-->
<!--Optional. Defaults to "true". Controls whether any overlaid wars are added before or after
the original base resource(s) of the webapp.-->
<!--<baseAppFirst>true</baseAppFirst>-->
<!--Since jetty-8.1.x. Optional. A pattern to match against the urls of the jars on the
container path to select those that should be examined for things like META-INF fragments,
resources, tlds and class inheritance hierarchy-->
<!--<containerIncludeJarPattern></containerIncludeJarPattern>-->
<!--Since jetty-8.1.6. Optional. A pattern to match against the urls of the jars considered to
be on the webapp's WEB-INF classpath to select those that should be examined for META-INF
fragments, resources, tlds, and class inheritance hierarchy. The default is to potentially
examine them all, subject to any ordering exclusions configured in web.xml.-->
<!--<webInfIncludeJarPattern></webInfIncludeJarPattern>-->
</webApp>
<!--The location of the built WAR file(jetty:run-war) or the exploded WAR(jetty:run-exploded).
This defaults to ${project.build.directory}/${project.build.finalName}[.war]-->
<war>${basedir}/target/myApp</war>
<!--<war>${basedir}/target/myApp.war</war>-->
<!--Optional. The path to a context xml file that is applied to your webapp AFTER the <webApp>.-->
<!--<contextXml></contextXml>-->
</configuration>
</plugin>
</plugins>
</build>
通过 Spring Boot 运行
如果你使用 Spring Boot 开发,那么就不需要使用对应的运行插件了。因为 Spring Boot 的 spring-boot-starter-web 依赖自带较新版本的内嵌 Tomcat,也可以缓存内嵌的 Jetty、Undertower 等 Web 容器。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>x.x.x.RELEASE</version>
</dependency>
<!-- ... -->
</dependencies>