简体   繁体   English

如何使用Tomcat 8 + Spring Boot + Maven

[英]How to use Tomcat 8 + Spring Boot + Maven

According to the Reference API on Using Tomcat 8 and this Deploy Spring Boot Applications tutorial it should be possible to use Tomcat 8 with Spring Boot , which uses Tomcat 7 as default.根据使用 Tomcat 8上的参考 API 和这个部署 Spring Boot 应用程序教程,应该可以将 Tomcat 8 与Spring Boot一起使用,它默认使用 Tomcat 7。

For some reason it is not working for me.出于某种原因,它对我不起作用。 What am I doing wrong?我究竟做错了什么?

pom.xml 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示例控制器.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);
    }
}

Output is Starting Servlet Engine: Apache Tomcat/7.0.52输出正在启动 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)

I have already tried this newer RC version of Spring boot , but still Tomcat 7 is loaded instead of 8.我已经尝试过这个较新的 RC 版本的 Spring boot ,但仍然加载了 Tomcat 7 而不是 8。

Also adding <java.version>1.7</java.version> property didnt work.还添加<java.version>1.7</java.version>属性不起作用。

Tried "application.properties" as well.也试过“application.properties”。 Port is set as specified on start-up, but version of Tomcat remains the default 7.端口设置为启动时指定,但Tomcat的版本保持默认7。

application.properties应用程序属性

server.port=8081
tomcat.version=8.0.3

When using Spring Boot overriding tomcat with tomcat.version as a property will only work if you use spring-boot-starter-parent as a parent for your project.当使用 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>

(change the version to the one you like). (将版本更改为您喜欢的版本)。

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

If you don't want to use this as a parent you will have to use a <dependencyManagement> section in your pom.xml to override all the spring versions and leave the properties as above.如果您不想将其用作父项,则必须在 pom.xml 中使用<dependencyManagement>部分来覆盖所有 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>

Either way will work but extending the parent is the easiest I would say, however this isn't always possible.无论哪种方式都可以,但我会说扩展父级是最简单的,但这并不总是可行的。

Did you try overriding tomcat.version in your application.properties ?您是否尝试在 application.properties 中覆盖 tomcat.version Specifically, setting it to 8.0.3 makes spring boot run 8.0.3 instead of whatever the default is.具体来说,将其设置为 8.0.3 会使 spring boot 运行 8.0.3 而不是默认值。

Here is Official document .这是官方文件

Without Starter Parent:没有起始父级:

<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>

I can answer this question the same way I answered it in another thread .我可以像在另一个线程中回答它一样回答这个问题。 A key piece of information that I think some people are unaware of that Spring Boot is only a mock of an actually Java Servlet container like Jetty, Glassfish, Tomcat, etc. You as the developer have to choose which you will use.我认为有些人不知道 Spring Boot 的一个关键信息只是对实际 Java Servlet 容器(如 Jetty、Glassfish、Tomcat 等)的模拟。作为开发人员,您必须选择将使用哪个容器。

Spring Boot is decent but of course has its downfalls and was really only created by the spring.io team to make their tutorials look that much nicer in an attempt to compete with other 'Get up and running in seconds' technologies. Spring Boot 很不错,但当然也有缺点,它实际上只是由 spring.io 团队创建的,目的是使他们的教程看起来更好,以试图与其他“在几秒钟内启动并运行”技术竞争。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM