Чем отличается использование двух типов переменных bash в сборке Maven? - PullRequest
0 голосов
/ 14 мая 2018

В моем проекте 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

1 Ответ

0 голосов
/ 14 мая 2018

${...} синтаксис, используемый плагином ресурсов maven :

Эти переменные, обозначаемые разделителями $ {...}, могут быть получены из системных свойств, вашсвойства проекта, из ваших ресурсов фильтра и из командной строки.

так в последней строке второго скрипта, когда плагин ресурсов maven видит ${JAVA_OPTS} Он ищет в среде, чтобы найти JAVA_OPTS, а затем подставляетэто с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...