作爲一個前端程序員,好不容易用第一次使用spring boot 寫了一個項目,idea裏面運行的ok,心裏暗自竊喜。但是沒想到打包就出現問題,折騰了一天,現在總結一下;
先看一下我的項目的結構:
這是我的項目,主項目是一個spring boot 項目,用來作爲服務端。還有一個ArcFaceSDK模塊,這是一個java模塊,用來請求服務端。
先說一下ArcFaceSDK模塊的打包:
這個比較簡單,因爲是一個java模塊,所以打成jar包就可以了。
首先打開:
然後,選擇artifacts 點擊+
下一步:
下一步,在彈出的對話框中選擇要打包的module,如果有mainClass 選擇:
然後一路ok保存就好。
配置完成,接着就是執行打包。
build-->build Artifacts
然後 項目的目錄下面就產生了這個jar:
到此,java模塊打包成jar完成;
接着是主項目的打包:
首先說明一下 spring boot 項目是自帶服務器的,這意味着你可以不依賴其他服務器(比如tomcat)運行。 當你自身運行的時候,只需要電腦上裝有java環境即可。當然你也可以不使用自身的服務器。所以這個時候有兩種打包方式:
1. 打包成jar, 自身運行;
2. 打包成war,依附於其他服務器運行;
這裏介紹第一種。
maven 插件給我們提供了一種很簡單的打包方式,就是使用插件自帶的功能。
首先打開maven預覽:
如果默認沒有,可以使用這種方式打開:
打開後看到lifecycle下面的任務,我們打包需要的就是下面這兩個,首先執行一下clean,然後執行一下package,就會生成了。
彆着急,在生成之前我們需要對輸出文件配置一下,因爲是maven提供的打包,所以我們需要在pom裏提供配置:
添加紅色框裏面的配置,意思是我們即將輸出 jar包(也可以配置成war),下面就是jar包的名字和描述,最後生成的文件名會以name和上面的version拼接作爲結果。
這時候我們依次點擊一下 clean 和 package,生成文件如下:
項目啓動:
cd 到jar所在的,目錄,執行:
java -jar arcfaceserver-0.0.1-SNAPSHOT.jar
就可以了。
好,一般的項目到這裏就基本完成了,但是我的啓動的時候會報錯誤,很多Class 沒找到。很快我發現了原因,因爲我項目中引入了一個本地的jar包文件,而maven打包時沒有將它打包進去。
解決辦法就是吧本地jar依賴轉化爲maven依賴,在pom 中添加:
<!--加入本地依賴-->
<dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<version>2.2.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/arcsoft-sdk-face-2.2.0.1.jar</systemPath>
</dependency>
它在我項目中的真實目錄爲:
只添加了這個還不夠,運行的時候還是找不到,查了很久,原來還要加上這句話:
附上代碼:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--加入下面可以將本地jar打包進去 -->
<configuration>
<executable>true</executable>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
到此爲止,我的本地jar包終於成功打包進去,運行項目正常。
到這裏作爲初學者還不是很完美,因爲打包後的jar我門怎麼動態修改端口號,數據庫信息什麼的呢?總不能每次修改重新打包啊,我的暫時的解決辦法如下:
使用啓動命令:
java -jar arcfaceserver-0.0.1-SNAPSHOT.jar --server.port=8084
上面的命令可以配置服務的端口號。
類似的還有下面的參數,這是在application.properties中的參數,都可以以上面的形式配置。
spring.datasource.url=jdbc:mysql://localhost:3306/faceDB
spring.datasource.username=root
spring.datasource.password=xxxxxxxxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
#指定端口號
server.port=8082
#指定context path
#server.context-path=/test 被棄用
server.servlet.context-path=/arcfaceserver
當然,把所有參數都寫進腳本文件中太不美觀,還有一種非常優雅的方式:
在jar文件同級目錄建立config文件夾,將application.properties 文件拷貝進去, 就 ok 了。
爲什麼? 這裏拷貝別人的文章中的一段:
應用程序屬性文件
SpringApplication 將從 application.properties 以下位置的文件中加載屬性並且將其添加到 Spring 的環境當中:
當前目錄下的 /config 子目錄
當前目錄
classpath中的 /config 目錄
classpath根目錄
該列表按照優先級的順序排列(在列表中較高的位置定義的屬性將會覆蓋在較低位置定義的屬性)。
如果您不喜歡 application.properties 作爲配置文件名,則可以通過指定 spring.config.name 環境屬性來切換到另一個名稱。還可以使用 spring.config.location 環境屬性(以逗號分隔的目錄位置列表或文件路徑)引用顯式位置。
比如:
java -jar myproject.jar --spring.config.name = myproject
1
java -jar myproject.jar --spring.config.location =
classpath:/default.properties,classpath:/override.properties
1
2
java -jar -Dspring.config.location=
D:\speech\default.properties analysis-speech-tool-0.0.1-SNAPSHOT.jar