在Heroku上从Java / Kotlin应用程序运行Python脚本

时间:2018-09-15 19:07:38

标签: java python heroku kotlin

我有一个Java / Kotlin应用程序,该应用程序每次用户发出请求时都会运行Python脚本。

它可以在我的笔记本电脑和任何其他VPS上正常运行。但是我无法在Heroku上使用它。它不起作用,什么也不打印。

以下是相关代码:

val command = "python3 $s/assets/script.py $params"
println("Command: $command")
val process = Runtime.getRuntime().exec(command)
process.waitFor()
val reader = BufferedReader(InputStreamReader(process.inputStream))
val message = reader.lines().collect(Collectors.joining("\n"))
println(message)

为什么在Heroku上失败?

1 个答案:

答案 0 :(得分:1)

Heroku基于buildpacks构建应用。每个buildpack都知道如何构建某种项目,例如一个人可能知道如何安装Maven依赖项并编译Kotlin源代码,而另一个人可能知道如何安装Ruby gems。

在简单的情况下,开发人员不必为此担心太多。如果未明确请求构建包,请使用Heroku tries to infer which buildpack it should use。基本上,它以给定的顺序遍历官方支持的buildpack,并使用每个buildpack的detection script来查看项目是否看起来与该buildpack匹配。

一旦找到匹配的buildpack,它就会停止寻找。在简单的情况下,这通常就足够了。但是每个buildpack都旨在生成相当精简的映像。您可能期望在常规Linux机器上存在的工具不一定存在。特别是,Java / Kotlin构建包不会为您提供python二进制文件。

好消息是,只需进行一些配置即可使用multiple buildpacks

  1. 首先,设置您的主buildpack:heroku buildpacks:set heroku/java
  2. 然后,添加辅助构建包:heroku buildpacks:add --index 1 heroku/python
  3. 使用heroku buildpacks

    确保以正确的顺序显示您的buildpack(先显示Python,然后显示Java)

      

    列表中的最后一个buildpack将用于确定应用程序的process types。从早期buildpacks定义的任何进程类型都将被忽略。

  4. 最后,您可能需要添加一个空的requirements.txt文件,以防止Python buildpack无法运行。另外,您可以添加任何可能具有的Python依赖项。

    如果您确实具有Python依赖项,请考虑使用PipfilePipfile.lock而不是requirements.txt。这将导致您的应用是使用pipenv而不是pip构建的。