使用 Tomcat 进行 Spring Boot 部署
Posted
技术标签:
【中文标题】使用 Tomcat 进行 Spring Boot 部署【英文标题】:Spring boot deployement with Tomcat 【发布时间】:2020-06-03 13:44:23 【问题描述】:我目前正在部署一个应用程序,但由于某种原因它似乎无法完美运行。
在编码时,我正在使用易于配置的 Intellij Spring Boot 运行程序运行/调试项目。
由于我需要在 Tomcat 服务器上进行部署,因此我尝试先在 Intellij 中设置一个 Tomcat Server Runner,然后再从我的 Tomcat 服务器直接运行我的战争。
问题是:运行似乎无法正常工作。事实上,即使部署没有返回任何错误,应用程序也没有完全启动。
这是一个 Spring Boot 运行器输出:
2020-02-19 11:50:18.373 DEBUG 1192 --- [ restartedMain] com.myapp.Application : Running with Spring Boot v2.2.4.RELEASE, Spring v5.2.3.RELEASE
2020-02-19 11:50:18.374 INFO 1192 --- [ restartedMain] com.myapp.Application : No active profile set, falling back to default profiles: default
2020-02-19 11:50:18.421 INFO 1192 --- [ restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in C:\Users\user\.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.3.2\jaxb-runtime-2.3.2.jar referenced one or more files that do not exist: file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jakarta.xml.bind-api-2.3.2.jar,file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/txw2-2.3.2.jar,file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/istack-commons-runtime-3.0.8.jar,file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/stax-ex-1.8.1.jar,file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/FastInfoset-1.2.16.jar,file:/C:/Users/user/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jakarta.activation-api-1.2.1.jar
2020-02-19 11:50:18.422 INFO 1192 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2020-02-19 11:50:18.422 INFO 1192 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2020-02-19 11:50:19.223 INFO 1192 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-02-19 11:50:19.288 INFO 1192 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 57ms. Found 1 JPA repository interfaces.
2020-02-19 11:50:19.807 INFO 1192 --- [ restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-02-19 11:50:20.115 INFO 1192 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http)
2020-02-19 11:50:20.125 INFO 1192 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-02-19 11:50:20.125 INFO 1192 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.30]
2020-02-19 11:50:20.233 INFO 1192 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
etc.
2020-02-19 11:50:24.396 INFO 1192 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-02-19 11:50:24.399 INFO 1192 --- [ restartedMain] com.myapp.Application : Started Application in 6.531 seconds (JVM running for 7.815)
还有一个 Tomcat 运行器输出:
2020-02-19 12:14:15.753 INFO 4436 --- [on(3)-127.0.0.1] com.myapp.Application : Starting Application on UO with PID 4436 (C:\App\apache-tomcat-8.0.47\webapps\server_war\WEB-INF\classes started by user in C:\App\apache-tomcat-8.0.47\bin)
2020-02-19 12:14:15.757 DEBUG 4436 --- [on(3)-127.0.0.1] com.myapp.Application : Running with Spring Boot v2.2.4.RELEASE, Spring v5.2.3.RELEASE
2020-02-19 12:14:15.760 INFO 4436 --- [on(3)-127.0.0.1] com.myapp.Application : No active profile set, falling back to default profiles: default
2020-02-19 12:14:15.937 INFO 4436 --- [on(3)-127.0.0.1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 113 ms
2020-02-19 12:14:15.994 INFO 4436 --- [on(3)-127.0.0.1] com.myapp.Application : Started Application in 1.045 seconds (JVM running for 7.228)
[2020-02-19 12:14:16,029] Artifact server:war: Artifact is deployed successfully
[2020-02-19 12:14:16,029] Artifact server:war: Deploy took 5,204 milliseconds
如您所见,Spring 已正确启动,但似乎并未执行所有启动任务。
我的 pom 中已经提供了 spring-boot-starter-tomcat,这是我的 Application.class:
@SpringBootApplication public class Application extends SpringBootServletInitializer
public static void main(String[] args)
SpringApplication.run(Application.class, args);
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)
return builder.sources(Application.class);
我的问题是:我是否遗漏了配置中的某些内容?如何使用具有多个配置文件的 Tomcat 正确运行所有内容(我目前在运行器中使用 VM 选项)?
【问题讨论】:
您似乎只查看了日志记录。您是否尝试过创建一个简单的 REST 端点或可以从浏览器获取的东西以查看它是否有任何作用? 是的,我得到了一个 Apache 404 返回... 【参考方案1】:我找到了解决问题的方法,不知何故(可能是从前面的其他依赖声明中复制/粘贴)我将 spring-boot-autoconfigure 依赖设置为提供,但我的 tomcat 没有这种依赖。所以我只需要删除提供的范围,一切都已修复。
【讨论】:
这应该会产生非常清晰的错误日志记录,但显然您没有看到。因此,这可能表明存在次要问题。无法找到您的错误记录是相当严重的:) 可能是这样,但我怎么能猜出这是什么次要问题呢?是的,没有错误记录根本没有帮助:(【参考方案2】:你能显示你的 pom.xml 吗?尝试添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
要在启动时获得更详细的输出,请尝试设置日志记录属性 https://www.javadevjournal.com/spring-boot/logging-application-properties/
除此之外,运行的 Tomcat 是“apache-tomcat-8.0.47”,并且您的 servlet 引擎在 Apache Tomcat/9.0.30 上运行
如果您的 parent-pom 在 2.2.4 RELEASE 上,您的 pom 将取决于 Tomcat 9 的东西。至少如果您在本地计算机上将 Spring Boot 作为 Spring Boot 应用程序运行,Spring Boot 还会为您设置 Tomcat(因此是您的依赖项)。
【讨论】:
【参考方案3】:Spring Boot Framework本身封装了一个集成的Tomcat,方便实现,无需生成.war,按照传统方式实现自己的Tomcat,简单的使用比如Maven插件执行,你必须使用 mvn spring-boot : run。
但是,如果这是您想要的方式,您必须使用 maven 从您的 Spring Boot 项目生成战争,然后将战争添加到 tomcat webapps 文件夹,现在您可以在本地启动 tomcat 进行测试。 按照文档中包含的步骤进行操作,应该不会有问题。
https://www.baeldung.com/spring-boot-war-tomcat-deploy
要配置不同的配置文件进行部署,您必须配置Tomcat catalina.properties 文件,以免重复自己很多,看看以下线程:
How to specify a profile when deploying a Spring boot war file to Tomcat?
希望对你有帮助!
【讨论】:
感谢您的回答,不幸的是,在写我的问题之前,我已经完成了与您的第一个链接中相同的设置。是的,出于不同的原因,我必须发动战争。以上是关于使用 Tomcat 进行 Spring Boot 部署的主要内容,如果未能解决你的问题,请参考以下文章
Apache 后面的 Tomcat 使用 ajp 进行 Spring Boot 应用程序