今天在編寫微服務程序啟動腳本的時候,遇到一個比較奇葩的問題,下面給出具體描述:
目標:通過讀取maven插件打包時生成的pom.properties文件,獲取里面的應用名稱和應用版本號,然后拼接得到serviceName-version.jar格式的jar包名稱,從而通過java -jar -xx.. jarPath的方式啟動
遇到的問題:通過shell腳本讀取pom.properties文件時,由於其key-value格式分行存儲,在linux中獲取到的value值最后有一個\r參數(可以通過sh -x app.sh查看到),導致拼接到的jarName跟預期的不一致
pom.properties中的內容如下:
version=1.0 groupId=project.parent artifactId=com.lxk.cms.admin.service
最初寫的讀取pom.properties中參數拼接JAR的shell腳本如下:
JAR="" if [ -z "$JAR" ];then if [ -f "$APP_HOME/pom.properties" ];then . $APP_HOME/pom.properties echo "artifactId=$artifactId" echo "version=$version" JAR="$artifactId-$version.jar" fi fi echo "the app jar name is: $JAR"
這樣輸出的結果如下:
artifactId=com.lxk.cms.admin.service version=1.0 .jar app jar name is :com.lxk.cms.admin.service
半天也搞不懂為啥會有這樣的輸出結果,網上查找相關的shell編程資料,讀取properties文件都是獲取里面的參數變量值,很少有遇到拼接時這種問題的,最后在一位shell老司機的博客里面看到可以通過在執行腳本的命令中加入-x參數來獲取詳細的執行過程,照着這個方法執行,果然看到了在第一次echo輸出artifactId的值后面有一個\r,在輸出的時候echo函數自己處理掉了,所以在輸出的結果中看不到換行的效果,version的值也是一樣,最后也有一個\r,找到問題的所在以后,就去查找如何去掉變量后面的\r方法,這時sed函數便出現在眼前,使用也很簡單,改進后的shell腳本如下:
JAR="" if [ -z "$JAR" ];then if [ -f "$APP_HOME/pom.properties" ];then . $APP_HOME/pom.properties ver=$(echo $version | sed 's/\r//') art=$(echo $artifactId | sed 's/\r//') JAR="$art-$ver.jar" fi fi echo "the app jar name is :$JAR"
改進后輸出的結果如下:
artifactId=com.lxk.cms.admin.service version=1.0 the app jar name is:com.lxk.cms.admin.service-1.0.jar
這樣就成功了解決了獲取jarName的問題,之后通過
$JAVA_PATH $JAVA_OPTS -Dmx.config.path="$APP_HOME/etc/" -jar "$APP_HOME/lib/$JAR"
便可以成功啟動我們的服務了,希望對遇到這類問題的童鞋有幫助,問題很簡單,但是發現問題確實比較難,尤其對shell不熟悉的小白而言。