为什么包含 spring 数据依赖项的项目在 tomcat9 上不起作用?

why a project that contain spring data dependency doesn't work on tomcat9?

我正在尝试在 tomcat9 上部署一个小型 springboot 应用程序,tomcat9 在 ubuntu 20 我在数字海洋中的帐户上。 当我在 pom 文件中添加 spring 数据依赖项时出现的问题:spring-boot-starter-data-jpa 然后使用 mvn clean package 或 install 命令将 jar 文件转换为 war 文件以便能够部署它在 tomcat9 上显示错误: 失败 - 上下文路径 [/heloworld-0.0.1-SNAPSHOT] 中的应用程序无法启动 失败 - 遇到异常 [org.apache.catalina.LifecycleException:无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/heloworld-0.0.1-SNAPSHOT]]]

另一方面,该应用程序可以通过 运行 在 intellij 上完美运行,也可以在我的本地主机 tomcat9 上运行, 顺便说一句,我在机器和 tomcat9 (1.8)

上使用相同的 java 版本
<?xml version="1.0" encoding="UTF-8"?>
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>heloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>heloworld</name>
<description>heloworld</description>
<packaging>war</packaging>
<properties>
    <java.version>8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <version>2.3.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
16-May-2022 10:42:43.516 INFO [http-nio-8080-exec-395] org.apache.catalina.startup.HostConfig.undeploy Undeploying context [/heloworld-0.0.1-SNAPSHOT]

2022 年 5 月 16 日 10:42:45.516 信息 [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此 Web 应用程序实例已被停止。不能加载 []。抛出以下堆栈跟踪用于调试目的以及尝试终止导致非法访问的线程。 java.lang.IllegalStateException:非法访问:此 Web 应用程序实例已被停止。不能加载 []。抛出以下堆栈跟踪用于调试目的以及尝试终止导致非法访问的线程。 在 org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385) 在 org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1038) 在 com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:123) 在 com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:90) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748) 2022 年 5 月 16 日 10:42:53.336 信息 [http-nio-8080-exec-399] org.apache.catalina.startup.HostConfig.deployWAR 部署 Web 应用程序存档 [/var/lib/tomcat9/webapps/heloworld-0.0.1-SNAPSHOT.war] 2022 年 5 月 16 日 10:42:55.479 信息 [http-nio-8080-exec-399] org.apache.jasper.servlet.TldScanner.scanJars 至少扫描了一个 JAR 的 TLD,但不包含 TLD。为这个记录器启用调试日志记录,以获得已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描过程中跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。 2022 年 5 月 16 日 10:44:01.210 严重 [http-nio-8080-exec-399] org.apache.catalina.startup.HostConfig.deployWAR 部署 Web 应用程序存档时出错 [/var/lib/tomcat9/webapps/heloworld-0.0.1-SNAPSHOT.war ] java.lang.IllegalStateException:启动时出错 child 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977) 在 org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:493) 在 org.apache.catalina.startup.HostConfig.check(HostConfig.java:1641) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) 在 org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1590) 在 org.apache.catalina.manager.HTMLManagerServlet.upload(HTMLManagerServlet.java:294) 在 org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:212) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:660) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 1407,42-56 91% 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:666) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:375) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639) 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(任务Thread.java:61) 在 java.lang.Thread.run(Thread.java:748) 原因:org.apache.catalina.LifecycleException:无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/heloworld-0.0.1-SNAPSHOT]] 在 org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717) ... 42 更多 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 初始化方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] 无法构建 Hibernate SessionFactory;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开 JDBC 连接以执行 DDL 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) 在 org.springframework.boot.SpringApplication.refresh上下文(SpringApplication.java:415) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:303) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:175) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:155) 在 org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:97) 在 org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:174) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 43 更多 Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] 无法构建 Hibernate SessionFactory;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开 JDBC 连接以执行 DDL 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ... 62 更多 Caused by: org.hibernate.exception.JDBCConnectionException: 无法打开 JDBC 连接以执行 DDL 在 org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) 在 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:71) 在 org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:63) 在 org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcDatabaseMetaData(ImprovedExtractionContextImpl.java:70) 在 org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processTableResultSet(InformationExtractorJdbcDatabaseMetaDataImpl.java:64) 在 org.hibernate.tool.schema.extract.internal.AbstractInformationExtractorImpl.getTables(AbstractInformationExtractorImpl.java:559) 在 org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:122) 在 org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:68) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:220) 在 org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:123) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:196) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:85) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:335) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.buildEntityManagerFactoryBuilderImpl.java:1498) 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ... 66 更多 原因:com.mysql.cj.jdbc.exceptions.CommunicationsException:通信link失败

上次成功发送到服务器的数据包是在 0 毫秒前。驱动程序尚未从服务器收到任何数据包。 在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:829) 在 com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:449) 在 com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:242) 在 com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) 在 com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) 在 com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) 在 com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) 在 com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) 在 org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 在 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) 在 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:44) ... 82 更多 原因:com.mysql.cj.exceptions.CJCommunicationsException:通信link故障

上次成功发送到服务器的数据包是在 0 毫秒前。驱动程序尚未从服务器收到任何数据包。 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) 在 com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) 在 com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) 在 com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) 在 com.mysql.cj.NativeSession.connect(NativeSession.java:120) 在 com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:949) 1559,88-102 99% 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:819) ... 95 更多 原因:java.net.SocketTimeoutException:连接超时 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:607) 在 com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:156) 在 com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ... 还有 98 个

您已定义使用parent with version 2.6.6。然后你添加其他组件的依赖 例如,您喜欢使用 spring-boot-starter-security。在Spring 开机基本 我的想法是使用 spring 团队提供的组件。这意味着你应该简单地 定义如下组件:

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

注意一点,这里没有给出版本。这意味着基于 parent, 使用的版本是通过 parent 给出的。这意味着您正在使用以下内容 工件 org.springframework.boot:spring-boot-dependencies:2.6.6 包含所有 组件(通常由初学者定义)。例如 spring-boot-starter-thymeleaf 应该这样使用:

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

但是与你使用启动器的想法相矛盾,但不幸的是你有 还定义了这样的版本:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.3.3.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.5.2</version>
  </dependency>
      ..
</dependencies>

给定的版本与您使用的 parent 版本不同,应该同步。 从技术上讲,您可以像这样手动执行此操作:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.6.6</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.6.6</version>
  </dependency>
      ..
</dependencies>

但最简单的方法(使维护更容易)是省略版本。结果是 表示版本由 parent 定义。这也使 Spring 引导版本升级 非常简单,因为您唯一需要更改的是 parent 的版本 像这样:

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

您还在 pom.xml 文件中定义了一个具有特定版本的组件:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.25</version>
</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>

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

<groupId>com.example</groupId>
<artifactId>heloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>heloworld</name>
<description>heloworld</description>
<packaging>war</packaging>

  <properties>
    <java.version>8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>