我需要为spring-boot项目单独安装Tomcat吗?

时间:2018-09-17 21:36:56

标签: spring-boot tomcat intellij-idea

我有一个spring-boot项目,并且具有以下设置:

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

我问这个问题的原因是,一次可以在IntelliJ IDE和终端(mvn spring-boot:run)上运行我的Web(war软件包)应用程序以启动该应用程序,然后可以使用localhost发送http请求到静态服务。我没有单独安装Tomcat。

一段时间后,我仍然可以在IntelliJ中成功运行Web应用程序,但无法通过“ mvn spring-boot:run”运行它。我想这是由于pom文件中的某些更改所致。错误消息似乎与Tomcat有关:

[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:506)
    at java.lang.Thread.run (Thread.java:748)
Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh (EmbeddedWebApplicationContext.java:137)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:536)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:761)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:371)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1186)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1175)
    at com.jd.jnlu.qe.boot.JnluQEWebStart.main (JnluQEWebStart.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:506)
    at java.lang.Thread.run (Thread.java:748)
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat

如果我在机器上安装Tomcat以便能够通过'mvn spring-boot:run'运行它,这会有所帮助吗?另外,当前我没有安装Tomcat或Apache服务器,是否可以在IntelliJ中成功使用Web应用程序?

1 个答案:

答案 0 :(得分:1)

您已注释掉为tomcat提供的范围。 在这种状态下,默认情况下会编译作用域,这意味着在您启动应用程序时(无论使用哪种方法)它都将在类路径上可用。

取消注释并将其放入提供的范围时,意味着它仅在编译时可用,并且您希望JDK或容器提供对类路径的依赖关系。如果将其部署到单独的tomcat实例中,这很有意义。

就像JB Nizet所说的那样,Spring-boot使用并启动了一个嵌入式的tomcat容器。但是为了做到这一点,它需要依赖!

按照其他人的建议,您应该阅读spring-boot的文档以了解其工作原理。首先,这是一个很好的方法,它说明了使用maven https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-first-application.html#getting-started-first-application-run运行spring-boot应用程序的基础知识 希望您能够从那里复制它。

请注意,spring-boot-starter-web取决于spring-boot-starter-tomcat!