java - Bluemix Cloud Foundry : JAVA_OPTS $PORT is blank

标签 java ibm-cloud cloud-foundry

它在 IBM Bluemix 中运行。

我正在运行 Java Ninja Framework 应用程序,作为独立的 jar(使用嵌入式 Jetty)。如果我在本地运行它:

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

应用程序启动,并监听端口 4444:o.e.jetty.server.ServerConnector - Started ServerConnector@c9d0d6{HTTP/1.1}{0.0.0.0:4444}

但是,当推送到 CF 时,这不起作用。

我在 list 中尝试过:

---
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] 信息 o.e.jetty.server.ServerConnector - 已启动 ServerConnector@65ae6ba4{HTTP/1.1}{0.0.0.0:8080}

因此应用程序无法进行健康检查,因为它监听了错误的端口。

<小时/>

按照@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 控制台(环境变量),这就是我看到的 JAVA_OPTS 变量:

-Dninja.port=$PORT

Bluemix 没有正确处理这个问题吗?根据 CF 文档,我应该能够在其中使用 $PORT。

<小时/>

这里是 java_buildpack 文档描述使用 $PORT 作为参数的地方:https://github.com/cloudfoundry/java-buildpack/blob/master/docs/framework-java_opts.md#escaping-strings

<小时/>

再次关注@sabha,我最终使用:JAVA_OPTS="-Dninja.port=\\$PORT"

最佳答案

似乎 $PORT 在实际执行之前就被构建包解释了。像这样转义 $PORT '\$PORT' 并且 java buildpack 只是像文字一样使用它,并且 arg 在最终运行时被解释。

这样设置: **cf set-env foo-new-app JAVA_OPTS ' -Dninja.port=\$PORT' ** && cf Restage foo-new-app 。

然后使用上述方法进行检查。 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 启动

关于java - Bluemix Cloud Foundry : JAVA_OPTS $PORT is blank,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38533166/

相关文章:

java - 使用不同的线程迭代 ConcurrentSkipListSet 删除元素

node.js - 如何在 IBM Cloud Nodejs 运行时安装字体? (云代工厂)

swift - 如何在 IBM Cloud Application Tools 中创建的 XCode 中打开项目?

mysql - CloudFoundry MySQL Java 配置

java - Linux 二进制文件应位于何处,以便在 PCF 中运行的 Spring Boot 微服务中通过 ProcessBuilder/Runtime 进行调用

mysql - 如何将两个 grails 应用程序部署到独立数据库中的 cloudfoundry

java - 创建一个枚举或使用.class在java中的类型之间切换?

java - 更新 JavaFX 阶段的大小和位置不起作用

java - 在Windows上使用JNA调用__cpuid函数

ibm-cloud - 导出Kubernetes Pod CPU/内存信息