В моем проекте maven есть скрипт bash для запуска моего приложения. Я скомпилировал свой проект с использованием двух разных типов переменных в моем скрипте bash:
1
#!/bin/bash
MAIN_PATH=`dirname $0`
cd $MAIN_PATH
MAIN_PATH=..
MAINCLASS="${component.mainclass}"
LIB_PATH="$MAIN_PATH/lib"
JACOCO_VERSION="${jacoco.version}"
JACOCO_PATH=$LIB_PATH
JACOCO_OPTS=-javaagent:$JACOCO_PATH/jacoco-javaagent-$JACOCO_VERSION.jar=jmx=true,output=tcpserver,address=*,port=6302,includes=*
JAVA_OPTS="${filter.component.java.opts}"
GC_OPTS="${filter.component.gc.opts}"
CLASSPATH=""
CLASSPATH=$MAIN_PATH/config
for f in $MAIN_PATH/lib/*.jar; do
CLASSPATH=$CLASSPATH:$f
done
echo "java -classpath $CLASSPATH $MAINCLASS"
java $GC_OPTS $JAVA_OPTS -classpath $CLASSPATH $MAINCLASS $*
2
MAIN_PATH=`dirname $0`
cd ${MAIN_PATH}
MAIN_PATH=..
MAINCLASS="${component.mainclass}"
LIB_PATH="$MAIN_PATH/lib"
JACOCO_VERSION="${jacoco.version}"
JACOCO_PATH=${LIB_PATH}
JACOCO_OPTS=-javaagent:${JACOCO_PATH}/jacoco-javaagent-${JACOCO_VERSION}.jar=jmx=true,output=tcpserver,address=*,port=6302,includes=*
JAVA_OPTS="${filter.component.java.opts}"
GC_OPTS="${filter.component.gc.opts}"
CLASSPATH=""
CLASSPATH=${MAIN_PATH}/config
for f in ${MAIN_PATH}/lib/*.jar; do
CLASSPATH=${CLASSPATH}:${f}
done
echo "java -classpath $CLASSPATH $MAINCLASS"
java ${GC_OPTS} ${JAVA_OPTS} -classpath ${CLASSPATH} ${MAINCLASS} $*
Фильтры:
filter.component.java.opts=-mx4096M $JAVA_OPTS $JACOCO_OPTS
filter.component.gc.opts=-XX:+UseG1GC
jacoco.version
и component.mainclass
определены в pom.xml
:
<jacoco.version>0.7.6.201602180812</jacoco.version>
<component.mainclass>MyAppStarter</component.mainclass>
Я создаю проект maven с помощью этой команды:
mvn clean install -X
Если я использую первый упомянутый способ определения переменной, ${JAVA_OPTS}
, передающий java
, будет заменен на -mx4096M
после сборки, но другим способом $JAVA_OPTS
будет изменен на -Xmx3072m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true
.
Нет никакой разницы между $JAVA_OPTS
и ${JAVA_OPTS}
в сценариях Linux bash; В чем разница между этими двумя для java
или maven
?
РЕДАКТИРОВАТЬ 1:
Для последнего использования переменной, о котором я говорил, подстановка переменной для JAVA_OPTS
происходит во время сборки. Я имею в виду второй способ, когда сборка maven завершается, последняя строка больше не содержит JAVA_OPTS
, но с первым методом никаких изменений не происходит.
Для первого способа последняя строка после сборки:
java $GC_OPTS $JAVA_OPTS -classpath $CLASSPATH $MAINCLASS $*
И в течение первой секунды я получаю следующую строку:
java ${GC_OPTS} -Xmx3072m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true -classpath ${MAINCLASS} $*
РЕДАКТИРОВАТЬ 2:
Я поместил эти две команды эха в оба финальных сценария после строки JAVA_OPTS="${filter.component.java.opts}"
:
echo "test 1 >> "$JAVA_OPTS
echo "test 2 >> "${JAVA_OPTS}
И результат для обоих одинаков:
test 1 >> -mx4096M -javaagent:../lib/jacoco-javaagent-0.7.6.201602180812.jar=jmx=true,output=tcpserver,address=*,port=6302,includes=*
test 2 >> -mx4096M -javaagent:../lib/jacoco-javaagent-0.7.6.201602180812.jar=jmx=true,output=tcpserver,address=*,port=6302,includes=*
РЕДАКТИРОВАТЬ 3:
Я проверил переменные окружения перед сборкой с помощью команды echo
:
echo 'JAVA_OPTS: '${JAVA_OPTS}
Оказывается, JAVA_OPTS
установлено в моей среде:
JAVA_OPTS: -Xmx3072m -XX:MaxPermSize=1024m -Djava.net.preferIPv4Stack=true