簡體   English   中英

在 Python Flask Cloud Foundry/IBM Cloud 應用程序中添加 Java/JRE/JVM

[英]Add Java/JRE/JVM in Python Flask Cloud Foundry/IBM Cloud application

我正在 Cloud Foundry/IBM Cloud 環境中運行 python Flask 應用程序。 在我的應用程序中,我嘗試使用 IBMDBPY 包連接到 DB2 Warehouse on Cloud。 這個包需要一個叫做 jaydebeapi 的包才能運行。 為了讓 jaydebeapi 工作,我想我需要在服務器上以某種方式安裝 JRE/JVM。 我嘗試為基於 Linux 的操作系統添加服務器 JRE ,但它也不起作用。 我在嘗試上傳 Sever JRE 之前遇到的錯誤是:

idadb = IdaDataBase(dsn=jdbc) #Establish a connection to our DB2-service
1/20/2018 12:05:45 PM   ERR undefined   File "/home/vcap/deps/0/python./lib/python2.7/site-packages/ibmdbpy/base.py", line 282, in __init__
1/20/2018 12:05:45 PM   ERR undefined jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path=%s' % jarpath)
1/20/2018 12:05:45 PM   ERR undefined   File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_core.py", line 114, in get_default_jvm_path
1/20/2018 12:05:45 PM   ERR undefined   return finder.get_jvm_path()
1/20/2018 12:05:45 PM   ERR undefined   File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 121, in get_jvm_path
1/20/2018 12:05:45 PM   ERR undefined   jvm = method()
1/20/2018 12:05:45 PM   ERR undefined   File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 164, in _get_from_known_locations
1/20/2018 12:05:45 PM   ERR undefined   for home in self.find_possible_homes(self._locations):
1/20/2018 12:05:45 PM   ERR undefined   File "/home/vcap/deps/0/python/lib/python2.7/site-packages/jpype/_jvmfinder.py", line 95, in find_possible_homes
1/20/2018 12:05:45 PM   ERR undefined   for childname in sorted(os.listdir(parent)):
1/20/2018 12:05:45 PM   ERR undefined   OSError: [Errno 2] No such file or directory: '/usr/lib/jvm'
1/20/2018 12:05:46 PM   OUT undefined   Exit status 1

有誰知道我該如何解決這個問題?

經過多次反復試驗,對我有用的解決方案是多構建包部署,如下所述:

cf push -b https://github.com/cloudfoundry/multi-buildpack

並在您的項目的根目錄中包含一個multi-buildpack.yml其中包含以下內容

buildpacks:
  - https://github.com/cloudfoundry/apt-buildpack
  - https://github.com/cloudfoundry/python-buildpack

和一個apt.yml包含以下內容:

--- 
packages: openjdk-8-jre
repos: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main
keys: https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB9B1D8886F44E2A

runtime.txt文件中,(也在項目的根目錄下)是python的版本python-3.6.6

不幸的是,JAVA 安裝在您的home deps目錄中,因此您必須在manifest.yml創建一個JAVA_HOME環境變量。

JAVA_HOME: /home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/

我也嘗試以這種方式將 jre/bin 添加到路徑中

PATH: /bin:/usr/bin:/home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/bin

然而,推送會清除它並只安裝默認路徑/bin;/usr/bin對我來說幸運的是, JAVA_HOME足以讓jaydebapi與我擁有的jar文件的數據庫驅動程序一起工作。 如果你需要這個環境變量,也許可以嘗試使用python os 包發出命令來修改路徑作為啟動的一部分。

包括一個更現代的答案。 在我撰寫本文時,您遇到的大多數(所有值得使用的)Cloud Foundry 版本都將支持多個開箱即用的構建包。 因此,您不再需要多構建包 buildpack。

相反,您可以簡單地cf push並指定多個構建包。

https://docs.cloudfoundry.org/buildpacks/use-multiple-buildpacks.html

這可以通過將多個-b標志設置為cf push或使用manifest.yml文件並執行如下操作來完成:

...
buildpacks:
  - buildpack_1
  - buildpack_2
...

在任何一種情況下,都按照您列出它們的順序執行。

https://docs.cloudfoundry.org/devguide/deploy-apps/manifest-attributes.html#buildpack

其余答案與@lamonaki 的答案相同。

  • 按此順序調用 apt-buildpack 和 Python buildpack。

  • 添加apt.yml文件,並在其中指明要安裝的 Java 包。

    來自@lamonaki 的回答:

     --- packages: openjdk-8-jre repos: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu trusty main keys: https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xEB9B1D8886F44E2A
  • 添加runtime.txt以設置您要安裝的 Python 版本

  • .profile文件添加到項目的根目錄,就像apt.ymlruntime.txt 在其中,添加用於export JAVA_HOME=/home/vcap/deps/0/apt/usr/lib/jvm/java-8-openjdk-amd64/jre/export PATH=$PATH:$JAVA_HOME/bin和潛在的LD_LIBRARY_PATH如果您需要在 Java 或 Python 代碼中引用任何自定義共享庫。

您可能會想,為什么使用 apt-buildpack 而不是 Java buildpack。 不幸的是,當前版本的 Java 構建包僅支持作為最終構建包(即構建包列表中的最后一個構建包)運行。 這排除了它作為一個很好的候選者,因為你希望 Python buildpack 是最后一個。 Java Cloud Native Buildpacks 將解決這個問題,但在我寫這篇文章時,沒有在 CF 上本地運行的 Cloud Native Buildpacks。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM