spring-boot項目在外部tomcat環(huán)境下部署遇到的問題

spring-boot默認(rèn)提供內(nèi)嵌的tomcat,所以打包直接生成jar包,用java -jar命令就可以啟動。但是,有時候我們更希望一個tomcat來管理多個項目,這種情況下就需要項目是war格式的包而不是jar格式的包。spring-boot同樣提供了解決方案,只需要簡單的幾步更改就可以了,這里提供maven項目的解決方法:

1.將項目的啟動類Application.java繼承SpringBootServletInitializer并重寫configure方法

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

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

public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}

}

2.在pom.xml文件中,project下面增加package標(biāo)簽

<packaging>war</packaging>

3.還是在pom.xml文件中,dependencies下面添加

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

這樣,只需要以上3步就可以打包成war包,并且部署到tomcat中了。需要注意的是這樣部署的request url需要在端口后加上項目的名字才能正常訪問。spring-boot更加強大的一點就是:即便項目是以上配置,依然可以用內(nèi)嵌的tomcat來調(diào)試,啟動命令和以前沒變,還是:mvn spring-boot:run。

如果需要在springboot中加上request前綴,需要在application.properties中添加server.contextPath=/prefix/即可。其中prefix為前綴名。這個前綴會在war包中失效,取而代之的是war包名稱,如果war包名稱和prefix相同的話,那么調(diào)試環(huán)境和正式部署環(huán)境就是一個request地址了。

到這一步都參考:http://blog.csdn.net/james_wade63/article/details/51009423

一般這樣配置都不會出現(xiàn)問題,但有些時候,還是會報錯,那是因為tomcat運行版本不同:

例如我在tomcat8.0.30版本下,配置如下:

<!-- 打war包時加入此項, 告訴spring-boot tomcat相關(guān)jar包用外部的,不要打進(jìn)去 -->
  <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.4.0.RELEASE</version>
<scope>provided</scope>
</dependency>

這樣配置在外部tomcat是8.0.30版本下正常運行,但是我的服務(wù)器是7.0.69就會報錯:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/zhaolixiang]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:4088)
    at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1539)
    at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1512)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1748)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:333)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1371)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1543)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1553)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1521)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
    at org.springframework.boot.context.web.SpringBootServletInitializer.createSpringApplicationBuilder(SpringBootServletInitializer.java:140)
    at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:104)
    at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:85)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:175)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5573)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    ... 12 more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1858)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1701)
    ... 18 more

解決版本,修改代碼:

<!-- 打war包時加入此項, 告訴spring-boot tomcat相關(guān)jar包用外部的,不要打進(jìn)去 -->
  <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.3.0.RELEASE</version>
<scope>provided</scope>
</dependency>

就成功了??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容