[英]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.yml
和runtime.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.