tomcat中調用springboot項目執行兩次


1.springboot 的內置tomcat沒有去掉,導致springboot 和tomcat 分別啟動了1次

2.完全是tomcat 啟動了兩次

第一個問題:我們在springboot pom.xml中

<packaging>war</packaging>  
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去除內嵌tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加servlet的依賴-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
第二個問題:在tomcat 的server.xml中 把host的appBase 換為“”,然后啟動就好了

或者你在tomcat內部新建一個webroot 文件夾 然后把appBase換成webroot 也可以

就是host 和context 分別啟動了兩次

 

當時看到這的時候以為肯定是這兩個問題,一定能解決,結果我們改完之后,測試還是不好使

然后經過測試

發現是springboot 啟動類 @SpringBootApplication的類 把extends 的去掉就好了

具體原因就不在這里說明了,但是基本上springboot 在tomcat 中發布兩次的問題 就這三個原因了

原文鏈接:https://blog.csdn.net/qq_25497867/java/article/details/80536410

 

 

 

idea中使用tomcat 方式啟動spring boot項目

 

 Spring boot 的main 入口啟動方式相信都會用,直接運行main直接就啟動了,但是往往這種方式並不是最佳的啟動方式,比如運維的層面更希望調整tomcat的調優參數,而只使用嵌入啟動方式很難做到這些。所以使用tomcat方式啟動spring boot就比較重要。

 

1、去tomcat 官網下載 tomcat 8 tar.gz 文件,然后解壓.

 https://tomcat.apache.org/download-80.cgi

2、idea中,配置啟動

 

 

3、gradle or maven 配置

<packaging>war</packaging>

or

apply plugin: "war"

 

4、增加tomcat啟動調用spring boot初始化入口:

復制代碼
public class ServletInitializer extends SpringBootServletInitializer {

    private Logger logger = LoggerFactory.getLogger(ServletInitializer.class);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        logger.info("starting spring boot initializer ......");

        return application.sources(MainApplication.class);
    }

}
復制代碼

 or

復制代碼
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}
復制代碼

 

5、start runing

 搞定!

 

 

 

 

 

 
tomcat重啟兩次的原因是appBase和Context中docBase設置的值導致的,只需要把appBase置為空,docBase寫項目的絕對路徑就可以了,代碼如下:

<Host name="localhost" appBase=""
unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="F:/Tomcat8.5/webroot/taocloud" debug="0"/>

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>
————————————————
原文鏈接:https://blog.csdn.net/u012759397/java/article/details/82770368

Java代碼   收藏代碼
  1. <Host name="localhost"  appBase=""  
  2.            unpackWARs="true" autoDeploy="true"  
  3.            xmlValidation="false" xmlNamespaceAware="false">  
  4.   
  5.        <Context  docBase="/usr/local/apache-tomcat-6.0.29/webapps/semwinner"  path=""   reloadable="true"></Context>  
  6.        <Context  docBase="/usr/local/apache-tomcat-6.0.29/webapps/emarboxmanager"  path="/admin"   reloadable="true"></Context>  
  7.   
  8.      </Host>  

 把appBase設置為空即可!

去除了appBase="webapps"中的webapps變成了appBase="",因為web應用程序都是放在webapps這個目錄下的,如果 不把“webapps“去掉,這里會調用一次quartz的任務調度,在接下來的“<Context path”中又會調用一次quartz的任務調度,所以就重復了2次

 

 
 
 

本人這個問題最后解決發現,的確是由   web應用程序默認都是放在webapps這個目錄下的,如果不把“webapps“去掉,這里會調用一次quartz的任務調度,在接下來的“<Context path”中又會調用一次quartz的任務調度  這個原因導致。

而且本人剛開始執行3次,tomcat的webapp下面XXX.WAR包解壓之后,war包沒有刪除,相當webapp目錄下有 XXX 和XXX.war 所以XXX和XXX.war各執行一次,當刪除XXX.war時,就只執行了2次,分別是 tomcat的server.xml中appBase和Context docBase,再刪除

<Context docBase=   就只執行一次了。

以上本人驗證成功!

如果webapp下面有多個不同的war包,那么把server.xml中appBase 的內容去掉,應該也是可以。這點沒試過,待驗證!

https://blog.csdn.net/jiang117/article/details/43077275

 

我開始以為眼花了,tomcat啟動的時候,

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.2.RELEASE)

出現了兩次,然后日志中有報錯:

 Unable to register MBean [HikariDataSource (HikariPool-2)] with key 'dataSource ...

最終確認springboot被加載了兩次。

原因一:

war包發布,可能沒有排除內置tomcat,先確認exclusions

 

原因二:

tomcat的server.xml配置有問題

如果<Context>節點里配置了應用全路徑,那么<host>節點里的appBase要置空,否則就是這出問題,host和context分別加載一次。

 

待測: 如果有兩個springboot應用放在tomcat下的情況,還未測試。

https://www.cnblogs.com/asker009/p/9763805.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM