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

在Python Flask Cloud Foundry/IBM云应用程序中添加Java/JRE/JVM,java,python,jvm,ibm-cloud,dashdb,Java,Python,Jvm,Ibm Cloud,Dashdb,我正在CloudFoundry/IBM云环境中运行python flask应用程序。在我的应用程序中,我尝试使用IBMDBPY包连接到云上的DB2仓库。这个包需要一个名为jaydebeapi的包才能运行。为了让jaydebeapi正常工作,我想我需要在服务器上安装JRE/JVM。我尝试为基于Linux的操作系统添加,但也没有成功。我在尝试上载服务器JRE之前遇到的错误是: idadb = IdaDataBase(dsn=jdbc) #Establish a connection to our D

我正在CloudFoundry/IBM云环境中运行python flask应用程序。在我的应用程序中,我尝试使用IBMDBPY包连接到云上的DB2仓库。这个包需要一个名为jaydebeapi的包才能运行。为了让jaydebeapi正常工作,我想我需要在服务器上安装JRE/JVM。我尝试为基于Linux的操作系统添加,但也没有成功。我在尝试上载服务器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-bhttps://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环境变量

我还尝试通过这种方式将jre/bin添加到路径中

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

但是,推送会将其清除并仅安装默认路径/箱/usr/bin对我来说很幸运,JAVA_HOME足以让jaydebapi使用我拥有的jar文件的数据库驱动程序。如果需要此环境变量,
也许可以尝试使用python os包发出命令,在启动过程中修改路径。

以包含更现代的答案。在我写这篇文章时,您遇到的最值得使用的CloudFoundry版本将支持多个现成的构建包。因此,您不再需要多构建包构建包

相反,您可以简单地cf push并指定多个构建包

这可以通过将多个-b标志设置为cf push或使用manifest.yml文件并执行以下操作来实现:

...
buildpacks:
  - buildpack_1
  - buildpack_2
...
在任何一种情况下,都会按照您列出它们的顺序执行

其余答案与@lamonaki的答案相同

按照该顺序调用apt构建包和Python构建包

添加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行,如果需要在JAVA或Python代码中引用任何自定义共享库,则可能添加LD_LIBRARY_PATH行


您可能会想,为什么要使用aptbuildpack而不是javabuildpack呢。不幸的是,当前版本中的Java构建包只支持作为最终构建包运行,即构建包列表中的最后一个构建包。这就排除了它是一个很好的候选者,因为您希望Python构建包是最后一个。Java云本机构建包将解决这个问题,但在我写这篇文章时,没有在CF上本机运行的云本机构建包。

我遇到过类似的情况。该应用程序使用的是tabla-py,它是tabla-java的包装器,需要在python子流程中调用java。我尝试过JAVA_HOME、PYTHONPATH、sys.path、os.join的各种选项,但都不起作用。向应用程序添加.profile文件并使用jre安装路径导出路径的简单解决方案解决了此问题。
--- 
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