【问题标题】:Cloud Foundry : How to deploy spring boot app with an additional JVM commandCloud Foundry:如何使用额外的 JVM 命令部署 Spring Boot 应用程序
【发布时间】:2020-03-24 23:37:13
【问题描述】:

我正在使用 Pivotal 在 Cloud Foundry 中托管 Spring Boot 应用程序。我可以在没有任何命令的情况下部署应用程序。但我的要求是运行一个额外的 JVM 命令作为这个issue 的解决方法

-Doracle.jdbc.timezoneAsRegion=false

使用以下清单运行我得到错误,

---
applications:
- name: gl-bo-sample   
  command: java -jar -Doracle.jdbc.timezoneAsRegion=false
  path: ./target/backoffice-1.0-SNAPSHOT.jar
  buildpacks:
      - https://github.com/cloudfoundry/java-buildpack.git

CF 日志

2019-11-29T16:33:45.606+05:30 [CELL/0] [OUT] Cell f38e366a-22ac-45ee-9dba-73e1f505525a creating container for instance e1475d2b-0c8e-4766-7e13-6da7
2019-11-29T16:33:45.952+05:30 [CELL/0] [OUT] Cell f38e366a-22ac-45ee-9dba-73e1f505525a successfully created container for instance e1475d2b-0c8e-4766-7e13-6da7
2019-11-29T16:33:46.958+05:30 [CELL/0] [OUT] Starting health monitoring of container
2019-11-29T16:33:47.168+05:30 [APP/PROC/WEB/0] [ERR] bash: java: command not found
2019-11-29T16:33:47.179+05:30 [APP/PROC/WEB/0] [OUT] Exit status 127
2019-11-29T16:33:47.182+05:30 [CELL/SSHD/0] [OUT] Exit status 0
2019-11-29T16:33:47.385+05:30 [CELL/0] [OUT] Cell f38e366a-22ac-45ee-9dba-73e1f505525a stopping instance e1475d2b-0c8e-4766-7e13-6da7
2019-11-29T16:33:47.385+05:30 [CELL/0] [OUT] Cell f38e366a-22ac-45ee-9dba-73e1f505525a destroying container for instance e1475d2b-0c8e-4766-7e13-6da7
2019-11-29T16:33:47.402+05:30 [API/2] [OUT] Process has crashed with type: "web"

有人可以告诉如何实现这一目标或任何其他方法来实现这一目标。谢谢。

【问题讨论】:

    标签: java spring-boot cloud-foundry ojdbc


    【解决方案1】:

    好的,给你一些东西。

    命令:java -jar -Doracle.jdbc.timezoneAsRegion=false

    1. 使用 Java buildpack 时,除非您真的、真的知道自己在做什么,否则不要设置命令。这可能会导致问题,因为您完全覆盖了 Java buildpack 设置的命令。

    2. 如果你设置了一个命令,你需要确保你撤消了它。您可以通过将其从 manifest.yml 中删除并运行 cf push -c null 来执行此操作。 -c null 将告诉服务器端删除保存命令并返回使用 Java buildpack 决定的内容。另一种选择是cf delete您的应用,但这并不总是可行的。

    3. 要设置 JVM 参数,您可以简单地 cf set-env <app> JAVA_OPTS '-Doracle.jdbc.timezoneAsRegion=false,或者在您的 manifest.yml 中设置它们。您可以添加一个带有环境变量的 env: 块。

      例如:

      ...
      env:
        JAVA_OPTS: -Doracle.jdbc.timezoneAsRegion=false
      ...
      

      这是因为 Java buildpack 在启动命令中包含 $JAVA_OPTS,因此您放入其中的任何内容都会替换为启动应用程序的命令。

    4. 如果您有可执行的 JAR,您还可以使用 cf set-env <app> JBP_CONFIG_JAVA_MAIN '{ arguments: "--server.port=9090 --foo=bar" }' 设置应用程序参数。此选项用于设置 argv 由应用程序本身而不是 JVM 处理的参数。与 JAVA_OPTS 一样,您可以在 manifest.yml 的 env: 块中设置它。

    5. 不管怎样,你得到bash: java: command not found 的原因是Java buildpack 没有将java 放在PATH 上。您需要设置java 进程的完整路径,即$HOME/.java-buildpack/open_jdk_jre/bin/java。因此,如果您使用完整路径,则可以使您所做的工作高于工作。也就是说,强烈建议您不要设置command。

    6. 旁注。不要将buildpack 指向https://github.com/cloudfoundry/java-buildpack.git。当您执行此操作时,您将指向主分支,这是一个移动目标。您通常应该使用您的平台提供的 buildpack,即cf buildpacks,或者在 URL 中添加一个发布标签,例如https://github.com/cloudfoundry/java-buildpack.git#v4.26,以获得 Java buildpack 的 v4.26。

    希望有帮助!

    【讨论】:

    • 谢谢。您的回答完全有助于添加 JVM 参数。但我无法以这种格式使用发布 buildpack https://github.com/cloudfoundry/java-buildpack.git#4.26。获取Failed to clone git repository at https://github.com/cloudfoundry/java-buildpack.git 可以在 GitHub 中看到问题已解决,但我无法在 Manifest 中添加。 -> github.com/cloudfoundry/cli/issues/1232
    • 那个 bug 很老了,检查你的 cf cli 版本并确保它是最新的。我试过cf version 6.47.2+d526c2cb3.2019-11-05,效果很好。另一件事是确认您的暂存容器可以访问 Internet 并下载内容,但是如果没有 #v4.26 的 https://github.com/cloudfoundry/java-buildpack.git 可以工作,那么添加版本应该不会有什么不同。他们都在与 Github 交谈。
    【解决方案2】:

    您可以在 application.properties 中声明它,它应该可以正常工作。

    【讨论】:

    • @Ismail 只需将oracle.jdbc.timezoneAsRegion=false 放在您的 application.properties 文件中,而不是将其作为 JVM 参数传递。
    猜你喜欢
    • 2018-06-09
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2012-03-24
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多