今天在编写微服务程序启动脚本的时候,遇到一个比较奇葩的问题,下面给出具体描述:
目标:通过读取maven插件打包时生成的pom.properties文件,获取里面的应用名称和应用版本号,然后拼接得到serviceName-version.jar格式的jar包名称,从而通过java -jar -xx.. jarPath的方式启动
遇到的问题:通过shell脚本读取pom.properties文件时,由于其key-value格式分行存储,在linux中获取到的value值最后有一个 参数(可以通过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的值后面有一个 ,在输出的时候echo函数自己处理掉了,所以在输出的结果中看不到换行的效果,version的值也是一样,最后也有一个 ,找到问题的所在以后,就去查找如何去掉变量后面的 方法,这时sed函数便出现在眼前,使用也很简单,改进后的shell脚本如下:
JAR="" if [ -z "$JAR" ];then if [ -f "$APP_HOME/pom.properties" ];then . $APP_HOME/pom.properties ver=$(echo $version | sed 's/ //') art=$(echo $artifactId | sed 's/ //') 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不熟悉的小白而言。