使用sh脚本自动获取当前项目的构建的 jar 文件路径
背景
使用 java 的 maven 构建项目时,若有很多命令是基于这个 jar 文件运行的。每次升级构建的版本号时都要将一些 .sh 文件的该 jar 文件改动文件名中版本号的部分。 忘记了话,下次运行时用的就是旧的版本。若是能够自动获取最新的 jar 文件路径,那么就可以不用有这个烦恼了。 直接执行对应的 .sh 文件即可。
定义一个函数集的 sh 文件
首先将写好的函数放到指定的 functions.sh 内,比如我将该文件放在 ~/configuration/functions.sh
#!/bin/sh
# 根据输入参数 $1 的 pom.xml 获取该 pom.xml 生成的 jar 的路径
function project_jar_file() {
project_dir=$(dirname "$1")
# 使用grep命令检查文件中是否包含spring-boot-starter-parent
if grep -q "<artifactId>spring-boot-starter-parent</artifactId>" "$1"; then
# 如果包含,则提取第二个版本号
artifactId=$(sed -n 's/.*<artifactId>\([^<]*\)<\/artifactId>.*/\1/p' "$1" | grep -m 2 . | tail -n 1)
version=$(sed -n 's/.*<version>\([^<]*\)<\/version>.*/\1/p' "$1" | grep -m 2 . | tail -n 1)
else
# 如果不包含,则提取第一个版本号
artifactId=$(sed -n 's/.*<artifactId>\([^<]*\)<\/artifactId>.*/\1/p' "$1" | head -n 1)
version=$(sed -n 's/.*<version>\([^<]*\)<\/version>.*/\1/p' "$1" | head -n 1)
fi
jar_file_name="${artifactId}-${version}.jar"
target_jar_file="${project_dir}/target/${jar_file_name}"
echo "${target_jar_file}"
}
# 递归查找 pom.xml 文件
# 在当前目录找 pom.xml 如果没找到就递归找父目录的 pom.xml 找到一个后退出并返回该 pom.xml 的绝对路径
function find_pom_xml() {
current_dir=$1
pom_file="$current_dir/pom.xml"
# 检查当前目录是否存在 pom.xml 文件
if [ -f "$pom_file" ]; then
echo "$(readlink -f ${pom_file})"
return
fi
# 找到根目录,停止递归
if [ "$current_dir" == "/" ]; then
echo "pom.xml not found"
return
fi
# 递归查找父目录中的 pom.xml 文件
parent_dir=$(dirname "$current_dir")
find_pom_xml "$parent_dir"
}
# 获取当前项目的 jar 路径
function get_jar_file_path() {
# 在当前目录及其父目录中查找 pom.xml 文件
pom_file=$(find_pom_xml "$(pwd)")
jar_file_path=$(project_jar_file "${pom_file}")
echo "${jar_file_path}"
}
定义系统变量
在系统启动的 ~/.zprofile 增加自定义的常量
export MY_FUNCTIONS_FILE=~/configuration/functions.sh
编写自己的脚本
比如 demo 这个项目的 run_demo.sh
# 导入 functions.sh
source "${MY_FUNCTIONS_FILE}"
# 将自动获取的当前项目构建的 jar 文件路径并输出
jar_file=$(get_jar_file_path "$(pwd)")
#启动该 jar 应用
java -jar $jar_file