如何使用Tomcat 8 + Spring Boot + Maven

Posted

技术标签:

【中文标题】如何使用Tomcat 8 + Spring Boot + Maven【英文标题】:How to use Tomcat 8 + Spring Boot + Maven 【发布时间】:2014-07-30 05:23:12 【问题描述】:

根据Using Tomcat 8 上的参考API 和这个Deploy Spring Boot Applications 教程应该可以将Tomcat 8 与Spring Boot 一起使用,它默认使用Tomcat 7。

由于某种原因,它对我不起作用。我做错了什么?

pom.xml

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<properties>
    <tomcat.version>8.0.3</tomcat.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.0.5.RELEASE</version>
    </dependency>
</dependencies>

SampleController.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class SampleController 

    @RequestMapping("/")
    @ResponseBody
    String home() 
        return "Hello World!";
    

    public static void main(String[] args) throws Exception 
        SpringApplication.run(SampleController.class, args);
    

输出是 正在启动 Servlet 引擎:Apache Tomcat/7.0.52

 :: Spring Boot ::        (v1.0.2.RELEASE)

2014-06-09 13:55:27.688  INFO 5744 --- [           main] SampleController                         : Starting SampleController on CI01081252 with PID 5744 (started by TECBMEPI in D:\projetos\teclogica\testes automatizados\exemplo int db\workspace\spring-boot-tomcat8-maven)
2014-06-09 13:55:27.730  INFO 5744 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@33b45e9a: startup date [Mon Jun 09 13:55:27 BRT 2014]; root of context hierarchy
2014-06-09 13:55:28.869  INFO 5744 --- [           main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8081
2014-06-09 13:55:29.117  INFO 5744 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2014-06-09 13:55:29.118  INFO 5744 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-06-09 13:55:29.226  INFO 5744 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-06-09 13:55:29.226  INFO 5744 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1498 ms
2014-06-09 13:55:29.656  INFO 5744 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-06-09 13:55:29.658  INFO 5744 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2014-06-09 13:55:29.946  INFO 5744 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-06-09 13:55:30.035  INFO 5744 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "[/],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]" onto java.lang.String SampleController.home()
2014-06-09 13:55:30.059  INFO 5744 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-06-09 13:55:30.059  INFO 5744 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-06-09 13:55:30.236  INFO 5744 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-06-09 13:55:30.257  INFO 5744 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081/http
2014-06-09 13:55:30.259  INFO 5744 --- [           main] SampleController                         : Started SampleController in 2.933 seconds (JVM running for 3.318)

我已经尝试过这个newer RC version of Spring boot,但仍然加载了 Tomcat 7 而不是 8。

同时添加 &lt;java.version&gt;1.7&lt;/java.version&gt; 属性也没有用。

也试过“application.properties”。端口设置为启动时指定的,但 Tomcat 的版本仍然是默认的 7。

application.properties

server.port=8081
tomcat.version=8.0.3

【问题讨论】:

tomcat.version 必须在 maven pom 中指定以包含正确版本的 Tomcat。仅当您使用 spring-boot-starter-parent 作为父依赖项时才会起作用,否则它将不起作用。 @M.Deinum 成功了,德克萨斯州。您可以发布您的答案以便我标记为已解决吗? 用 2 个可能的解决方案添加了更广泛的答案。 完全不相关,但既然你在这里使用的是最先进的Tomcat,你不应该也使用最先进的Java吗? @MichaelPiefel 出于内部目的,我现在必须使用 Java 7,但它会升级。 【参考方案1】:

当使用 Spring Boot 覆盖带有 tomcat.version 作为属性的 tomcat 时,只有在您使用 spring-boot-starter-parent 作为项目的父级时才有效。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.0.M2</version>
</parent>

(将版本更改为您喜欢的版本)。

<properties>
    <tomcat.version>8.0.8</tomcat.version>
</properties>

如果您不想将其用作父级,则必须在 pom.xml 中使用 &lt;dependencyManagement&gt; 部分来覆盖所有 spring 版本并保留上述属性。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-logging-juli</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>$tomcat.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jsp-api</artifactId>
            <version>$tomcat.version</version>
        </dependency>
    </dependencies>

</dependencyManagement>

无论哪种方式都可以,但扩展父级是我想说的最简单的方法,但这并不总是可行的。

【讨论】:

【参考方案2】:

你try overriding tomcat.version in your application.properties了吗?具体来说,将其设置为 8.0.3 会使 spring boot 运行 8.0.3 而不是默认值。

【讨论】:

感谢您的回答,但我在这里尝试过,但没有奏效。正如教程所说Smaller things, like which port the server runs on。此外,文档不指向属性文件,而仅针对类路径依赖项。 application.properties 是否位于类路径的根目录?它对我来说很好。 是的,我还将端口设置为 8081 以确保读取文件。 This tutorial 也使用 Tomcat 8,并且没有在属性文件中设置该属性,仅在 pom.xml 中。 这将限制你使用 maven 的引导插件来运行应用程序,使用我建议的方法让你使用 java -jar application.properties 仅在运行时使用,因为为时已晚,因为 Tomcat jar 已经在类路径中。所以这个答案是不正确的。正确答案是配置您的构建工具(Maven 的 pom.xml)。【参考方案3】:

这里是Official document。

没有起始父级:

<project>
    <properties>
        <tomcat.version>8.0.3</tomcat.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- things you wanna override  -->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>$tomcat.version</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-el</artifactId>
                <version>$tomcat.version</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-websocket</artifactId>
                <version>$tomcat.version</version>
                <scope>test</scope>
            </dependency>

            <!-- pom -->
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.4.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-juli</artifactId>
            <version>$tomcat.version</version>
        </dependency>
    </dependencies>
</project>

【讨论】:

【参考方案4】:

我可以像在another thread 中一样回答这个问题。我认为有些人不知道的一条关键信息是,Spring Boot 只是对实际 Java Servlet 容器(如 Jetty、Glassfish、Tomcat 等)的模拟。作为开发人员,您必须选择要使用的容器。

Spring Boot 很不错,但当然也有它的缺点,它实际上只是由 spring.io 团队创建的,目的是让他们的教程看起来更好看,试图与其他“在几秒钟内启动并运行”技术竞争。

【讨论】:

以上是关于如何使用Tomcat 8 + Spring Boot + Maven的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Embedded Tomcat 8 和 Spring boot 将子域转换为路径

如何在 IDEA Intellij 上使用 Spring-boot 进行自动重新加载

spring-boo hello world程序

Tomcat 8 和 Spring Security Cors

Spring boot + tomcat 8.5 + mongoDB,AsyncRequestTimeoutException

在调用处理程序之前使用 Tomcat 8 和 Spring 4 ClassCastException 的 websockets