如果已经回答,我道歉;我的搜索没有透露任何一个。
我在Heroku上部署了一个播放应用程序。我在同一个版本中还有另一个带有main方法的Worker类。我希望将该类作为工作者而不是Web来运行。当我尝试运行它时,它给了我ClassDefNotFound异常,这很明显,因为我没有为这个过程提供类路径。
我如何弄清楚应该是什么类路径(罐子和类)?或者还有其他方法吗?
将该类与单独的工作进程放在一起的原因是将其扩展为独立于Web应用程序。
这里有更多细节。我的Procfile有以下条目,
web: target/start -Dhttp.port=$PORT -DapplyEvolutions.default=true -DapplyDownEvolutions.default=true -Ddb.default.url=$DATABASE_URL ${JAVA_OPTS}
worker: target/start com/company/test/worker/WorkerApplication ${JAVA_OPTS}
worker entry只有“WorkerApplication”类的名称需要运行,但Heroku无法找到这些类文件和其他依赖项。
答案 0 :(得分:3)
您需要在项目中创建多个Global objects,每个入口点都有不同的名称。然后在Procfile中,指定从application.global
属性开始的属性,如下所示:
web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=Web
worker: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=Worker
我没有尝试使用Play项目,但您也可以使用sbt-start-script plugin来使用正确的类路径创建自定义target/start
脚本。
答案 1 :(得分:2)
好的,我明白了。 target / start适用于web而不适用于worker。我在target / stage文件夹中找到了所有的jar。将工人改为跟随工作正常。
worker:java -cp“target / staged / *”com / company / test / worker / WorkerApplication
答案 2 :(得分:0)
我们最近为Heroku上的Playframework开放了我们的延迟工作框架Moonlight。
延迟的工作通常需要某种协调。例如,您可能需要一个队列,以便工作人员可以从队列中获取作业并对其进行处理。 Moonlight为您处理。
对于您关于Procfile
的特定问题,我们在这里有一个有效的示例:https://github.com/GIVESocialMovement/moonlight/blob/master/test-project/Procfile
您的类路径不应包含/
,我认为您需要参数-main
。