2016-07-22 2 views
0

Это работает в IBM Bluemix.

Я использую приложение Java Ninja Framework, как автономную банку (в которой используется встроенный Jetty). Если я запускаю его локально:

$ java -jar -Dninja.port=4444 new-app-1.0.0.jar

приложение запускается, и прослушивает порт 4444: o.e.jetty.server.ServerConnector - Started [email protected]{HTTP/1.1}{0.0.0.0:4444}

Однако, это не работает при нажатии на CF.

Я попытался в манифесте:

--- 
applications: 
- path: "./target/new-app-1.0.0.jar" 
    memory: "500m" 
    name: "foo-new-app" 
    env: 
    JAVA_OPTS: "-Dninja.port=$PORT" 
    buildpack: java_buildpack 

приложение всегда прослушивает 8080 (по умолчанию):

OUT 03:25:29.979 [main] INFO o.e.jetty.server.ServerConnector - Started [email protected]{HTTP/1.1}{0.0.0.0:8080}

И поэтому приложение не может Healthcheck, так как его прослушивает неправильный порт.


После предложения по @sabha Я побежал

CF_TRACE=true cf app foo-new-app

А вот обнаруженная команда запуска:

"detected_start_command":"CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m.. -memoryWeights=heap:75,metaspace:10,native:10,stack:5 -memoryInitials=heap:100%,metaspace:100% -totMemory=$MEMORY_LIMIT) && JAVA_OPTS=\"-Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY -Dninja.port=\" && eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp $PWD/. ninja.standalone.NinjaJetty" 

Похоже -Dninja.port арга не установлен должным образом:

-Dninja.port=\"

Если я смотрю в bluemix консоли (Environment Variables), это то, что я вижу в переменной JAVA_OPTS:

-Dninja.port=$PORT

ли Bluemix не обрабатывает это правильно? Я должен иметь возможность использовать $ PORT там, согласно документам CF.


Вот где java_buildpack документы описывают с помощью $ PORT в качестве аргумента: https://github.com/cloudfoundry/java-buildpack/blob/master/docs/framework-java_opts.md#escaping-strings


Снова следуя @sabha, я в конечном итоге с помощью: JAVA_OPTS="-Dninja.port=\\$PORT"

ответ

1

Появляется $ PORT, который интерпретируется сборщиком раньше опережения реального исполнения. Побег $ PORT, как этот '\ $ PORT', а java buildpack просто использует его как литерал, и аргумент arg интерпретируется в окончательном режиме исполнения.

Установить этот путь: ** Cf набор-ENV Foo-новое приложение JAVA_OPTS '-Dninja.port = \ $ PORT' ** & & сравни restage Foo-новое-приложение.

Затем проверьте, используя методы, описанные выше. vcap @ i7lpc06hav3: ~ $ ps -ef | grep java vcap 14 1 69 14:30? 00:00:33 /home/vcap/app/.java-buildpack/oracle_jre/bin/java -.......... -Dninja.port = 8080 -Daccess.logging.enabled = false - Dhttp.port = 8080 -classpath /home/vcap/app/.java- ... org.apache.catalina.startup.Bootstrap start

1

В CF-Диего, по умолчанию порт назначен 8080, поэтому вы получаете поведение по умолчанию. Вы можете проверить это либо: 1) cf ssh к приложению и ps -ef видеть команду Java арг строки или 2) перезапустить приложение и проверьте вывод buildpack на этапе выпуска или 3) просто попробовать CF_TRACE=true cf app foo-new-app и проверить значение detected_start_command.

+0

Пробовал ваши предложения и обновлял вопрос. Ум взглянуть? – mtyson

+0

Появляется $ PORT, который интерпретируется buildpack раньше перед реальным исполнением. Выйдите из $ PORT, как это, и java buildpack просто использует его как литерал, и аргумент arg интерпретируется в окончательном режиме исполнения: – sabha

Смежные вопросы