概述
第一次用maven工具打war包,出現各種各樣的問題,做個問題記錄方便下次查看
maven
一開始用的maven是springboot默認的,在.m2下,要打包時才發現沒有mvn指令。索性自己就重新裝個maven,去官網下載,我安裝的是3.5.2版本。因為maven倉庫默認是國外的,需要更改為國內的鏡像地址,方便建立本地的倉庫,於是更改setting.xml文件,在<mirrors>標簽內添加一個新的標簽,完成之后自己配置環境變量,下圖是lz自己電腦的配置,根據自己安裝目錄進行,完成后測試下maven -version
<mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>
環境變量
指定要下載的本地倉庫地址,所以添加本地地址
<localRepository>D:\maven\repository</localRepository>
IDEA配置maven
除此之外,IDEA也需要更改默認的maven地址,home directory選擇本地maven,file 選擇本地maven的配置文件,local repository選擇本地倉庫路徑
pom.xml修改
重新加載maven->reimport,下載本地倉庫時間較慢,慢慢等待吧。本地倉庫下載完成后,必須修改打包形式,在pom.xml內添加
<packaging>war</packaging>
因為springboot整合有tomcat的容器如果打成war包放置在外部服務器的tomcat下,將會出現沖突,所以移除內部的tomcat容器,在pom.xml下添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
還需要添加servlet-api依賴
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
如果不想用maven打包出來的war名稱,還得添加自己自定義的名稱
<finalName>seasgame</finalName> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <encoding>${project.build.sourceEncoding}</encoding> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </pluginManagement>
pom.xml修改到這里,我們開始進行打包,在pom.xml那層目錄,執行 mvn clean package
啟動類修改
public class SpringBootStartApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // 注意這里要指向原先用main方法執行的SeasgameApplication啟動類 return builder.sources(SeasgameApplication.class); } }
問題匯總
因為移除了tomcat,所以跟tomcat依賴相關的得更改。
ERROR: expected START_TAG or END_TAG not TEXT
這是因為pom.xml的文件內,有不合法的語法,也可以看提示哪一行出的問題,建議處理方法將idea的檢驗級別拉高,有問題就會一下子報紅。將標簽內容補全,重新在進行打包
ERROR:No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
這是因為我們需要之指定一個符合配置的JDK環境,這個問題一般是因為裝有多個版本的jdk引發的,idea的maven配置Runner,需要配置哪個版本,最好都一致。
ERROR:Unsupported major.minor version 52.0
版本信息不一致,低版本編譯高版本出的問題,springboot我建議用tomcat 8 以上和jdk8以上,因為tomcat7太過老舊了,可能會出現各種不兼容的問題,升級后一般能解決很多問題。
ERROR: Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5
這是被某個程序占用了,我們重新啟動下idea,甚至還無法解決可以重啟。
在打包的時候出現這幾個問題,一 一解決后要部署到服務器。因為服務器還是用jdk7和tomcat7。。各種版本不兼容,很頭疼。只能自己在裝一個jdk8 和tomcat8,在tomcat8內指定jdk版本運行。
在tomcat8的bin下修改 setclasspath.sh 在第一行添加
export JAVA_HOME=/usr/local/jdk1.8.0_172/
export JAVA_HOME=/usr/local/jdk1.8.0_172/jre
如何還不行,在catalina.sh內也添加上。因為有多個版本tomcat所以端口號會沖突,修改server里的端口號。。可參考這篇文件
https://blog.csdn.net/Jay_1989/article/details/52870760
好了,啟動tomcat8,發現
ERROR:Field xxxService in 某個類 required a single bean, but 3 were found
這是因為我在內部有個工程類
private EntityManager entityManager;
找不到這個bean,將注解弄掉。順利跑起來了,第一次打war包花了一下午的時間,終於成功跑起來,訪問127.0.0.1:端口號