Bluemix Cloud Foundry:JAVA_OPTS$端口为空
这是在IBMBlueMix中运行的 我正在运行一个Java Ninja框架应用程序,作为一个独立的jar(使用嵌入式Jetty)。如果我在本地运行它: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时,这不起作用 我在舱单上试过: --
$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: