鍍金池/ 問答/Java  C  Linux  網(wǎng)絡(luò)安全/ 不同路徑下shell腳本啟動(dòng)java程序時(shí)項(xiàng)目根目錄問題

不同路徑下shell腳本啟動(dòng)java程序時(shí)項(xiàng)目根目錄問題

問題描述

將java項(xiàng)目打成tar.gz格式, 然后再Linux上解壓縮, 文件目錄:

./
    -conf/
    -bin/
        -startup.sh
    -lib/
    -logs/
    -README.md

我執(zhí)行./bin/startup.sh啟動(dòng)java程序.
但是, 煩人的是:

啟動(dòng)腳本時(shí)路徑不同, 項(xiàng)目的根目錄就會(huì)不同.

  1. tar根目錄下執(zhí)行sh bin/startup.sh時(shí), java會(huì)將tar包根目錄作為項(xiàng)目根目錄.

代碼中new File("logs/xx.log"), 會(huì)生成./logs/xx.log, 這是想要的預(yù)期效果.

  1. 但是, 擋在./bin/下執(zhí)行sh startup.sh時(shí), new FIle("logs/xx.log")就會(huì)在./bin/logs/下產(chǎn)生xx.log文件. 這顯然不是想要的效果, 很惱人.

startup.sh

#!/bin/bash

current_path=`pwd`

case "`uname`" in
    Linux)
        bin_abs_path=$(readlink -f $(dirname $0))
        ;;
    *)
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
esac

echo "腳本位置: $bin_abs_path"
#base=${bin_abs_path}/..
base=$(dirname $(cd `dirname $0`;pwd))
echo "base path: $base"


export LANG=en_US.UTF-8
export BASE=$base

#can't run repeatedly
if [ -f $base/bin/addr.pid ] ; then
    echo "found bin/addr.pid , Please run stop.sh first ,then startup.sh" 2>&2
    exit 1
fi

## set java path
if [ -z "$JAVA" ] ; then
  JAVA=$(which java)
fi



str=`file $JAVA_HOME/bin/java | grep 64-bit`
if [ -n "$str" ]; then
    JAVA_OPTS="-server -Xms1024m -Xmx1536m -Xmn256m -XX:SurvivorRatio=2 -XX:PermSize=96m -XX:MaxPermSize=256m -Xss256k -XX:-UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError"
else
    JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m "
fi

JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8"

for i in $base/lib/*;
    do CLASSPATH=$i:"$CLASSPATH";
done


#$JAVA $JAVA_OPTS -classpath .:$CLASSPATH com.jfai.addr.StartUp 1>>$base/bin/nohup.out 2>&1 &
$JAVA $JAVA_OPTS -classpath .:$CLASSPATH com.jfai.addr.StartUp 1>$base/bin/nohup.out 2>&1 &

echo $! > $base/bin/addr.pid
echo "Process addr is running..., pid=$!"
cd $current_path
回答
編輯回答
冷咖啡

可以在startup.sh一開始的地方就cd更改目錄到你想去的目錄,不要依賴調(diào)用者當(dāng)前目錄,就可以了,比如如果你想進(jìn)入bin目錄,最開始的地方加

cd `dirname "$0"` 

如果你想在上一級目錄,就

cd `dirname "$0"`/.. 
2017年11月5日 19:10