使用springboot也很長時間了,一直都是使用內置Tomcat運行項目褥傍,最近由于公司架構需要將項目以war包形式發(fā)布封裝組件儡嘶,又不想把自己多天的成功重新用spring造一遍喇聊,遂有了將springboot打成war包的想法恍风。參考網上各種方法,自己也在坑里掙扎了許久誓篱。脫坑后總結一下朋贬,供大家參考,也給自己提醒窜骄。
首先需要一個能成功運行的springboot項目锦募,這里不在重新搭建,直接用已知項目作為更改邻遏。
啟動文件修改
springboot默認是使用內部Tomcat啟動糠亩,如果使用外部Tomcat的話同樣存在一個入口的問題,這里我們只需要將啟動類繼承SpringBootServletInitialize告訴外部Tomcat在這個類下啟動(注解并不需要這么多准验,這里只是為了學習和記錄赎线,大家可以參考參考)。
@EnableTransactionManagement // springboot 開啟事務的注解
@EnableCaching // 使能緩存
@EnableAsync //為了使@Async注解能夠生效糊饱,還需要在Spring Boot的主程序中配置@EnableAsync
@SpringBootApplication
public class RestdemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(RestdemoApplication.class);
}
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(RestdemoApplication.class, args);
}
}
pom文件的修改
首先我們需要將springboot打包方式更改為war
<packaging>war</packaging>
springboot 內置了Tomcat垂寥,為了防止Java包沖突我們需要排除springboot默認Tomcat依賴,然而Tomcat啟動有需要一些sevlet或者el等類去編譯另锋,因此還需要依賴spring-boot-starter-tomcat滞项,當然這里的作用域需要設置為provided
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
接著是添加maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<fork>true</fork>
<!-- 這里是啟動類App的位置 -->
<mainClass>com.example.restdemo.RestdemoApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<!-- 沒有web.xml 配置的話, 配置為false-->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
pom文件修改就到這里夭坪。
IDEA 配置Tomcat啟動
此處省略Tomcat啟動....或者直接使用maven命令打包(跳過測試過程)
maven clean package -Dmaven.test.skip=true
不知道你們是否正常啟動文判,如果有問題繼續(xù)看看我踩的坑
踩坑記錄
1.啟動后無法正常訪問
在cmd里面查看我springboot配置的端口8084,使用netstat -ano|findstr "8084",沒有找到相關進程室梅。
同樣查看Tomcat配置的端口8087律杠,使用
netstat -ano|findstr "8084",看到端口以及被監(jiān)聽竞惋,根據(jù)進程號可以查看和kill端口柜去。
注意:在application.properties里面配置的端口是springboot內部端口,同外部Tomcat啟動的話端口并不是 application.properties的配置端口拆宛,而是外部Tomcat所配置的端口嗓奢。
2.端口問題解決后還是沒法訪問,于是若若的看了一下Tomcat日志浑厚,報錯了股耽。根盒。。堆棧日志我就不貼了物蝙,告訴大家出現(xiàn)這樣的報錯
Caused by: java.lang.NoClassDefFoundError: javax/el/ELManager 炎滞。什么?我不是已經加入spring-boot-starter-tomcat 相關依賴了嗎诬乞?這個問題我苦苦在坑里待好幾天册赛,終于在網上找到了答案。原因是我的tomcat7提供的el-api 和項目里面的el-api.jar沖突震嫉,解決辦法也很簡單森瘪,就是將你IDE(IDEA 或eclipse)安裝目錄下的el-api.jar 替換Tomcat的lib目錄下的el-api.jar 或者使用Tomcat8 即可解決問題。
暫時就這么多票堵,終于可以helloword了扼睬,如果大家還有什么坑可以貼出來一起交流交流。