如何使用Tomcat 8 + Spring Boot + Maven

12
根据 《使用Tomcat 8》 参考API 和这篇 部署 Spring Boot 应用程序 的教程,可以将 Tomcat 8 与默认使用 Tomcat 7 的 Spring Boot 配合使用。

但出于某些原因,我无法使用它。我错在哪里了?

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)
我已经尝试过这个更新的Spring Boot RC版本,但仍然加载Tomcat 7而不是8。
另外添加<java.version>1.7</java.version>属性也没有起作用。
同样尝试了"application.properties"。端口按启动时指定的设置,但Tomcat的版本仍保持默认的7。 application.properties
server.port=8081
tomcat.version=8.0.3

1
在Maven POM中必须指定tomcat.version以包含正确的Tomcat版本。这仅适用于使用spring-boot-starter-parent作为父依赖项的情况,否则它将无法工作。 - M. Deinum
@M.Deinum,它起作用了,谢谢。你能发布你的答案,这样我就可以标记为已解决吗? - Evandro Pomatti
添加了更详细的答案,包含两种可能的解决方案。 - M. Deinum
完全没有关系,但既然您在使用尖端的Tomcat,那么您是否也应该使用尖端的Java呢? - Michael Piefel
@MichaelPiefel 为了内部目的,我现在必须使用Java 7,但它将会升级。 - Evandro Pomatti
4个回答

21

如果使用Spring Boot覆盖Tomcat,并且将tomcat.version视为属性,那么只有在您的项目中使用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中使用<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>

两种方法都可以,但我认为扩展父级是最容易的,然而这并不总是可能的。


1

谢谢你的回答,但我在这里尝试过了,它没有起作用。就像教程所说“更小的事情,比如服务器运行的端口”。此外,文档并没有指向属性文件,而仅指向类路径依赖项。 - Evandro Pomatti
你的应用程序配置文件(application.properties)是否在类路径的根目录下?对我来说它运行得很好。 - hd1
是的,我也将端口设置为8081以确保文件被读取。这个教程 也使用Tomcat 8,并且没有在属性文件中设置该属性,只在pom.xml中设置了。 - Evandro Pomatti
这将限制您使用Maven的引导插件来运行应用程序,而使用我建议的方法可以让您使用java -jar。 - hd1
application.properties 只在运行时使用,这时已经太晚了,因为 Tomcat jars 已经在类路径上。因此,这个答案是不正确的。正确的答案是配置你的构建工具(如 Maven 的 pom.xml)。 - Francois Marot

0
这里是官方文件
没有启动器父级:
<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>

-1

我可以以与我在另一个线程中回答问题的方式相同来回答这个问题。 我认为一些人没有意识到的一个关键信息是,Spring Boot只是一个实际的Java Servlet容器(如Jetty,Glassfish,Tomcat等)的模拟。 作为开发人员,您必须选择要使用哪个。

Spring Boot还不错,但当然也有其缺点,它实际上只是由spring.io团队创建的,旨在使他们的教程看起来更漂亮,以竞争其他“在几秒钟内启动”的技术。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接