springboot 2.x tomcat war包部署 localhost-startStop-1 启动卡顿卡死
大家好,我是烤鴨:? ?
? ? 關于springboot war包部署tomcat。
? ? 環境:
????? ? springboot 2.0.3.RELEASE
????????apache-tomcat-8.5.32
1.? ? 修改pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version></parent><groupId>com.xxx.xxx</groupId><version>1.0.0-SNAPSHOT</version><artifactId>xxx_xxxx_interface</artifactId><packaging>war</packaging><name>xxx_xxxx_interface</name><description>xxx接口</description><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.encoding>UTF-8</maven.compiler.encoding><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.build.locales>zh_CN</project.build.locales></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><profiles><profile><!--本地開發環境 --><id>dev</id><properties><profiles.active>dev</profiles.active></properties><activation><activeByDefault>true</activeByDefault></activation></profile><profile><!--測試環境 --><id>test</id><properties><profiles.active>test</profiles.active></properties></profile><profile><!--生產環境 --><id>pro</id><properties><profiles.active>pro</profiles.active></properties></profile></profiles><build><finalName>xxxx_interface</finalName> <!-- 指定package生成的文件名為my-spring-boot.jar --><resources><!-- 所有環境配置文件過濾 --><resource><directory>src/main/resources</directory><filtering>true</filtering><excludes><exclude>test/*</exclude><exclude>pro/*</exclude><exclude>dev/*</exclude></excludes></resource><!-- 指定環境配置文件導入 --><resource><directory>src/main/resources/${profiles.active}</directory></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><delimiters><delimiter>@</delimiter></delimiters><useDefaultDelimiters>false</useDefaultDelimiters><archive><manifest><addClasspath>true</addClasspath><useUniqueVersions>false</useUniqueVersions><classpathPrefix>lib/</classpathPrefix><mainClass>xxx.xxx.xxxInterfaceMainApplication</mainClass></manifest><manifestEntries><version>${project.version}</version></manifestEntries></archive></configuration></plugin></plugins></build> </project>網上很多人都說需要再加忽略內置tomcat,或者servlet.api的包,其實都不需要。
主要就是? ?
???? ????????<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version></parent> ????????????????<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> <packaging>war</packaging><parent> ????spring-boot-starter-parent????</parent>
<dependency>? ? ? ? ?spring-boot-starter-web????</dependency>
?<packaging> war </packaging>
2.? ? 修改啟動方法
package com.xxx.xxxx.config;import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors;import javax.annotation.PostConstruct;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import org.springframework.stereotype.Controller;@Configuration @EnableAutoConfiguration @ComponentScan(value = "com.xxx.xxxx", excludeFilters = { @Filter(Controller.class),@Filter(type = FilterType.ASSIGNABLE_TYPE, value = { RootConfiguration.class }) }) @MapperScan({"com.xxx.xxxx.dao"}) public class RootConfiguration extends SpringBootServletInitializer {@PostConstructpublic void postConstruct() {}@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return configureApplication(builder);}public static void main(String[] args) {configureApplication(new SpringApplicationBuilder()).run(args);}private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {return builder.sources(RootConfiguration.class);}}主要就是繼承?SpringBootServletInitializer?,重寫?configure 方法。
3.? ? 問題及猜想
? ? 之前的項目就是這么配置的,用的springboot 1.5.6.RELEASE,是沒有問題的。
? ? ?改了新項目,升級了springboot,也加了很多東西,項目就起不來了。
? ? ?本地run方法運行是沒有問題的。
? ? 3.1 問題?:
? ? ????啟動卡死:
? ? 這是tomcat下log日志的最后幾行,乍一看并沒有什么問題。但是總覺得哪里不對。訪問tomcat也訪問不到。
[2018-07-04 06:48:10.199] [main] [DEBUG] o.h.validator.internal.xml.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only. [2018-07-04 06:48:10.205] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator as ValidatorFactory-scoped message interpolator. [2018-07-04 06:48:10.206] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.resolver.TraverseAllTraversableResolver as ValidatorFactory-scoped traversable resolver. [2018-07-04 06:48:10.206] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider. [2018-07-04 06:48:10.206] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider. [2018-07-04 06:48:10.207] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory. [2018-07-04 06:48:10.654] [main] [WARN ] org.thymeleaf.templatemode.TemplateMode - [THYMELEAF][main] Template Mode 'HTML5' is deprecated. Using Template Mode 'HTML' instead. [2018-07-04 06:48:10.823] [main] [INFO ] org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler [http-nio-8161] [2018-07-04 06:48:10.839] [main] [INFO ] org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read [2018-07-04 06:48:10.877] [main] [INFO ] com.xx.xx.xxxInterfaceMainApplication - Started xxxInterfaceMainApplication in 5.237 seconds (JVM running for 5.691)或者卡在這:
[2018-07-04 06:48:10.056] [main] [DEBUG] o.h.validator.internal.engine.ConfigurationImpl - Setting custom MessageInterpolator of type org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator [2018-07-04 06:48:10.057] [main] [DEBUG] o.h.validator.internal.engine.ConfigurationImpl - Setting custom ConstraintValidatorFactory of type org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory [2018-07-04 06:48:10.057] [main] [DEBUG] o.h.validator.internal.engine.ConfigurationImpl - Setting custom ParameterNameProvider of type org.springframework.validation.beanvalidation.LocalValidatorFactoryBean$1 [2018-07-04 06:48:10.059] [main] [DEBUG] o.h.validator.internal.xml.ValidationXmlParser - Trying to load META-INF/validation.xml for XML based Validator configuration. [2018-07-04 06:48:10.059] [main] [DEBUG] o.h.validator.internal.xml.ResourceLoaderHelper - Trying to load META-INF/validation.xml via user class loader [2018-07-04 06:48:10.059] [main] [DEBUG] o.h.validator.internal.xml.ResourceLoaderHelper - Trying to load META-INF/validation.xml via TCCL [2018-07-04 06:48:10.060] [main] [DEBUG] o.h.validator.internal.xml.ResourceLoaderHelper - Trying to load META-INF/validation.xml via Hibernate Validator's class loader [2018-07-04 06:48:10.060] [main] [DEBUG] o.h.validator.internal.xml.ValidationXmlParser - No META-INF/validation.xml found. Using annotation based configuration only. [2018-07-04 06:48:10.067] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator as ValidatorFactory-scoped message interpolator. [2018-07-04 06:48:10.067] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.resolver.TraverseAllTraversableResolver as ValidatorFactory-scoped traversable resolver. [2018-07-04 06:48:10.067] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.util.ExecutableParameterNameProvider as ValidatorFactory-scoped parameter name provider. [2018-07-04 06:48:10.068] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.DefaultClockProvider as ValidatorFactory-scoped clock provider. [2018-07-04 06:48:10.068] [main] [DEBUG] o.h.validator.internal.engine.ValidatorFactoryImpl - HV000234: Using org.hibernate.validator.internal.engine.scripting.DefaultScriptEvaluatorFactory as ValidatorFactory-scoped script evaluator factory. [2018-07-04 06:48:10.189] [main] [DEBUG] o.h.v.i.engine.resolver.TraversableResolvers - Cannot find javax.persistence.Persistence on classpath. Assuming non JPA 2 environment. All properties will per default be traversable.或者卡在springboot讀取banner之后。
????
? ? 這種問題真的是難找,也不報錯。
? ? 3.2????猜想:
? ??? ? 1????是不是springboot版本升級導致的問題,第一時間降版本,無效。
????? ? 2????是不是引了多余的包,導致jar包沖突,解決了之后,無效。
????? ? 3????tomcat本身問題,換tomcat版本,保證tomcat是沒問題的,無效。
????? ? ????如果這些都做了,還是無效的話,考慮一下是不是代碼的問題。
我嘗試注釋掉部分代碼,再打包啟動,如果成功了,就說明代碼部分有問題。最后找到了代碼中的問題。
問題代碼:
/*** * 定時任務回調輪詢*/ @Component public class TaskUpdateNotify implements CommandLineRunner {public static Log logger = LogFactory.getLog(TaskUpdateNotify.class);public static final long timeFlag = 1000;@Autowiredprivate RedisClient redisClient;@Autowiredprivate ThreadHandler threadHandler;/*** 25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h) 異步通知回調*/@Overridepublic void run(String... args) throws Exception {while (true) {// 先處理發二維碼threadHandler.doNotifyAgainHandler(); //threadHandler.doPayNotifyAgainHandler(); //多線程方法//線成休息 1 minTimeUnit.MINUTES.sleep(1);}} }我懷疑原因是在實現?CommandLineRunner?接口,并在我在方法中?TimeUnit.MINUTES.sleep(1)?。
????? ? 之后把這個方法改成了定時任務,又取消了線程sleep,就可以啟動了。
最后貼一下:
????啟動成功的日志最后幾行,應該是有tomcat容器啟動的。
6-Jul-2018 06:14:03.022 信息 [localhost-startStop-1] org.springframework.boot.StartupInfoLogger.logStarted Started RootConfiguration in 6.223 seconds (JVM running for 12.622) 06-Jul-2018 06:14:03.063 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\preauth_interface.war] has finished in [10,773] ms 06-Jul-2018 06:14:03.064 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\docs] 06-Jul-2018 06:14:03.086 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\docs] has finished in [22] ms 06-Jul-2018 06:14:03.086 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\examples] 06-Jul-2018 06:14:03.357 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\examples] has finished in [271] ms 06-Jul-2018 06:14:03.357 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\host-manager] 06-Jul-2018 06:14:03.386 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\host-manager] has finished in [29] ms 06-Jul-2018 06:14:03.386 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\manager] 06-Jul-2018 06:14:03.409 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\manager] has finished in [23] ms 06-Jul-2018 06:14:03.410 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\ROOT] 06-Jul-2018 06:14:03.432 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [G:\develop\environment\apache-tomcat-8.5.32-1\webapps\ROOT] has finished in [22] ms 06-Jul-2018 06:14:03.441 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 06-Jul-2018 06:14:03.455 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 06-Jul-2018 06:14:03.462 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 11229 ms4.? ? 總結
? ? 如果有報錯信息一切都好說,最怕的就是這樣,找不到原因。只能一點點摸索,算是分享一下吧。每個人的原因不可能一樣。這種問題只能慢慢找了。多嘗試幾次,如果還是找不到。
? ? 就用 jar包方式 運行 springboot 項目。如果有 靜態頁面,就前后端分離,簡單的方式 Nginx。
????
總結
以上是生活随笔為你收集整理的springboot 2.x tomcat war包部署 localhost-startStop-1 启动卡顿卡死的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaWeb项目部署至tomcat下c
- 下一篇: 初学js