为 Java Spring Boot Gradle 项目构建 Heroku Procfile

Posted

技术标签:

【中文标题】为 Java Spring Boot Gradle 项目构建 Heroku Procfile【英文标题】:Building a Heroku Procfile for Java Spring Boot Gradle project 【发布时间】:2021-08-01 06:02:56 【问题描述】:

我的应用程序在本地运行得非常好,并使用 Heroku 进行部署,但我正在努力构建一个 Procfile,该文件声明应该执行什么命令来启动应用程序。我是一名新开发人员,可以在 Linux 进程模型的工作原理方面获得一些帮助。

Heroku 文档为 Java Spring Boot 项目提供了两个 Procfile 示例:

web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/demo-0.0.1-SNAPSHOT.jar

web: java $JAVA_OPTS -cp target/classes:target/dependency/* com.example.HelloWorld

我决定尝试遵循 -cp 示例,因为我没有任何 .jar 文件。

这是我当前的 Procfile:

web: java $JAVA_OPTS -cp gradlew java/com/deepdraft/deep_draft/DeepDraftApplication.java procfile

在最近的一次开发人员采访中,我简要询问了 Procfile,他建议我在编写 Procfile 时参考我的“gradlew”文件,但我没有机会询问我是从该文件复制命令还是将 Procfile 定向到文件中的命令。我选择“gradlew”文件复制到我当前 Procfile 的主类中作为猜测。这是 gradlew 文件底部收集的参数。 gradlew

我尝试通过引用 (com.deepdraft.deep_draft.DeepDraftApplication) 和路径 (java/com/deepdraft/deep_draft/DeepDraftApplication.java) 将主类放入 Procfile。两个 Procfile 都导致日志显示“错误:无法找到或加载主类”。这是完整日志的照片。 logs

但老实说,我不确定为什么 Procfile 需要我编写一个将文件从一个目录复制到另一个目录的脚本。我只是在尝试这个,因为 Heroku 文档使用这个 Procfile 作为 SpringBoot 项目的示例。

很抱歉,如果这些信息到处都是,但我是一名新开发人员,对部署我的第一个应用程序感到非常兴奋。如何构建 Procfile?

(编辑)好吧,其实我找到了一个 jar 文件!我在终端中使用“.jar”而不是“jar”,并找到了一个 gradlewrapper.jar 文件。我将尝试使用该文件来遵循上面的第一个 Procfile 示例,使用 -jar 命令。 gradlewrapper.jar

(编辑 2)哇,我觉得我很接近。收到新的错误消息令人兴奋。哈哈。它说“没有主要清单属性”在 .jar 文件中。 new logs 我发现this 堆栈溢出关于添加清单属性的对话,但我无法编辑这个压缩文件,我拥有的最类似于开发人员文件的文件(包含所有依赖项)是保存在我的build.gradle 文件。 build.gradle file 我现在将尝试编辑 .jar 文件,但任何 cmets 将不胜感激!

【问题讨论】:

为什么没有jar文件?你有自定义命令在 heroku 上构建项目吗? 【参考方案1】:

heroku 所引用的 jar 文件是您项目的可执行 jar 文件。 现在有两种情况:

    对于 maven springboot 项目,我们在项目目录中使用“mvn package”。之后,您应该能够在目标文件夹中找到 jar 文件。 对于 gradle springboot 项目,您应该也可以这样做。

【讨论】:

谢谢!我最终使用 gradle 来生成执行应用程序所需的 .jar 文件。它现在正在工作。 @tkolkmeyer 你是如何解决没有主要清单属性的问题的?我将 heroku 指向 Procfile 中的 gradle-wrapper.jar 并且不知道下一步该做什么(

以上是关于为 Java Spring Boot Gradle 项目构建 Heroku Procfile的主要内容,如果未能解决你的问题,请参考以下文章

Java学习(随笔)—Spring boot以及Gradle相关

Spring Boot 项目中的 Gradle 无法识别路径中的 Java jdk

Spring Boot、Gradle 和非 Maven 依赖项 [重复]

将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败

如何使用 gradle 6+ 和 java 11+ 在 Spring Boot 中配置 spock

Java 8,Gradle 3 上的 Spring Boot 应用程序的 gradle 包装器失败:找不到 cacerts