Bluemix Cloud Foundry:JAVA_OPTS$端口为空

Bluemix Cloud Foundry:JAVA_OPTS$端口为空,java,ibm-cloud,cloud-foundry,Java,Ibm Cloud,Cloud Foundry,这是在IBMBlueMix中运行的 我正在运行一个Java Ninja框架应用程序,作为一个独立的jar(使用嵌入式Jetty)。如果我在本地运行它: $java-jar-Dninja.port=4444 new-app-1.0.0.jar 应用程序启动,并在端口4444上侦听:o.e.jetty.server.ServerConnector-已启动ServerConnector@c9d0d6{HTTP/1.1}{0.0.0.0:4444} 但是,当按下CF时,这不起作用 我在舱单上试过: --

这是在IBMBlueMix中运行的

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

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

应用程序启动,并在端口4444上侦听:
o.e.jetty.server.ServerConnector-已启动ServerConnector@c9d0d6{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]信息o.e.jetty.server.ServerConnector-已启动ServerConnector@65ae6ba4{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
arg:

-Dninja.port=\”

如果我查看bluemix控制台(环境变量),这就是我看到的
JAVA\u OPTS
变量:

-Dninja.port=$port

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


以下是java_buildpack文档使用$PORT作为参数的描述:



在@sabha之后,我再次使用了:
JAVA\u OPTS=“-Dninja.port=\\$port”

在CF Diego中,默认分配的端口是
8080
,因此您可以获得默认行为。您可以通过以下方式进行验证: 1)
cf ssh
到app和
ps-ef
查看java命令行参数或 2) 重新启动应用程序,并检查buildpack输出的发布步骤或
3) 只需尝试
CF\u TRACE=true CF app foo new app
并检查检测到的\u start\u命令值。

在CF Diego中,分配的默认端口为
8080
,因此您可以获得默认行为。您可以通过以下方式验证: 1)
cf ssh
到app和
ps-ef
查看java命令行参数或 2) 重新启动应用程序,并检查buildpack输出的发布步骤或
3) 只需尝试
CF\u TRACE=true CF app foo new app
并检查检测到的\u start\u命令值。

显示$PORT在实际执行之前被buildpack解释。像这样转义$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 start

显示$port由buildpack提前解释如“\$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 start

尝试了您的建议和更新的问题。想看一看吗rs$PORT在实际执行之前由buildpack提前解释。像这样转义$PORT,java buildpack将其作为文本使用,arg在最终运行时得到解释:尝试了您的建议并更新了问题。介意看一看吗?看起来$PORT在实际执行之前由buildpack提前解释ion.像这样转义$PORT,java buildpack将其作为文本使用,并在最终运行时解释arg: