2

如果这已经得到回答,我很抱歉;我的搜索没有发现任何人。

我在 Heroku 上部署了一个播放应用程序。我在同一个版本中还有另一个带有 main 方法的 Worker 类。我想以工人而不是网络的身份运行该课程。当我尝试运行它时,它给了我 ClassDefNotFound 异常,这很明显,因为我没有为此过程提供类路径。

我如何弄清楚类路径应该是什么(jars 和 classes)?或者有没有其他方法可以做到这一点?

将该类独立于工作进程的原因是为了使其独立于 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 条目只有需要运行的类“WorkerApplication”的名称,但 Heroku 无法找到这些类文件和其他依赖项。

4

3 回答 3

3

您需要在项目中为每个入口点创建多个具有不同名称的全局对象。然后在你的 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 插件一起使用,以创建target/start具有正确类路径的自定义脚本。

于 2013-04-18T05:42:20.610 回答
2

好的,我想通了。target/start 是针对 web 而不是 worker。我在 target/stage 文件夹中找到了所有 jar。将工人改为跟随工作正常。

工人:java -cp "target/staged/*" com/company/test/worker/WorkerApplication

于 2013-04-23T20:13:10.940 回答
0

我们最近为 Heroku 上的 Playframework开源了我们的延迟作业框架Moonlight 。

延迟的工作通常需要某种协调。例如,您可能需要一个队列,以便工作人员可以从队列中获取作业并进行处理。月光为你处理。

对于您的具体问题Procfile,我们在这里有一个工作示例:https ://github.com/GIVESocialMovement/moonlight/blob/master/test-project/Procfile

你的类路径不应该包含/,我认为你需要这个论点-main

于 2018-07-30T17:14:52.383 回答