1. 概述

本教程将介绍如何使用Heroku平台将一个简单的Spring Boot Java应用部署到云端。Heroku通过处理基础设施,简化了应用的部署、管理和扩展。

2. 安装

本文将使用一个简单的"Hello World" Spring Java应用,构建工具为Maven。该应用有一个接口,访问时返回"Hello, Heroku!"。

2.1. 项目设置

打开Hello World项目,我们需要添加几个配置文件。

首先,在项目根目录创建一个Procfile该文件定义了进程类型,并明确指出启动应用的命令。创建后,添加以下命令:

web: java -Dserver.port=$PORT -jar target/*.jar

然后,在根文件夹中创建一个system.properties文件。在这个文件中,我们将指定Heroku应使用的Java运行时环境。默认情况下,Heroku使用Java 8:

java.runtime.version=17

项目设置完成。接下来,我们将配置Heroku,为部署做准备。

2.2. Heroku设置

Heroku CLI需要Git,因此我们需要先安装它。

登录Heroku网站,下载Windows的CLI客户端,或者对于Mac,使用brew tap heroku/brew && brew install heroku

安装完成后,我们可以通过网站或CLI创建Heroku项目。打开终端窗口,导航到项目目录。

为了使用Heroku,我们需要通过heroku login命令登录CLI。

然后,使用git init创建Git仓库,并使用heroku create创建Heroku应用。系统会为默认应用分配一个随机名称,并将区域设置为美国。不过,用户可以通过平台网站轻松修改这些设置。

3. 通过Heroku CLI部署

将代码暂存并提交,然后使用git push heroku main将更改推送到Heroku仓库

Heroku会自动检测我们的Java应用并启动构建过程。构建成功后,我们可以通过提供的URL(通常类似于https://our-app-name.herokuapp.com/)在浏览器中访问应用。

结果,我们应该看到Spring应用已启动,网站显示"Hello, Heroku!"。

或者,我们可以在终端中执行heroku open来快速验证应用是否启动。

4. 通过Heroku Maven插件部署

除了使用CLI,Heroku还支持通过一个名为Heroku Maven Plugin的Maven插件构建和发布应用。

要使用该插件,需要将其添加到pom.xml中:

<plugin>
    <groupId>com.heroku.sdk</groupId>
    <artifactId>heroku-maven-plugin</artifactId>
    <version>3.0.7</version>
    <configuration>
        <logProgress>true</logProgress>
    </configuration>
</plugin>

依赖解析完成后,我们可以使用命令mvn clean heroku:deploy开始部署应用。

这种方法对于编译耗时长的应用或通过CI部署的应用特别有用。

该插件提供了多种配置,包含在pom.xml文件的configuration元素中。我们来探索其中一些。

首先,我们可以设置插件使用的JDK版本,这将覆盖system.properties中的设置:

<jdkVersion>17</jdkVersion>

此外,我们可以配置变量,这些变量将覆盖之前定义的变量:

<configVars>
    <MY_VAR>SomeValue</MY_VAR>
</configVars>

而且,我们可以指定启动应用的命令:

<processTypes>
    <web>java -Dserver.port=$PORT -jar target/*.jar
</processTypes>

5. 通过CI/CD管道部署

文章的下一部分,我们将探讨使用GitHub和GitLab进行部署。

Heroku提供了与GitHub的直接连接,使应用部署更加容易。 而GitLab则需要配置管道。

要使用这些选项,我们需要将项目推送到这些平台的仓库上。

5.1. GitHub

打开Heroku网站,选择我们正在处理的项目。然后,导航到"Deploy"选项卡,选择GitHub作为部署方法

快速登录后,我们搜索并选择仓库。然后,启用"Automatic Deploys",这样任何推送到main分支的操作都会自动触发Heroku上的部署。

5.2. GitLab

对于GitLab,我们需要在项目中添加一个.gitlab-ci.yml文件

image: maven:3.8.7-eclipse-temurin-17

stages:
  - test
  - deploy

cache:
  paths:
    - .m2/repository
    - target

unit-test:
  stage: test
  image: maven:latest

  script:
    - echo "Maven test started"
    - "mvn test"

deploy_job:
  stage: deploy
  image: maven:latest

  script:
    - HEROKU_API_KEY=${HEROKU_API_KEY} mvn clean heroku:deploy

此外,我们需要将Heroku API密钥添加到GitLab CI/CD变量中(在项目设置中)。API密钥可以从Heroku网站的用户个人资料中获取。

由于我们在脚本中使用了Heroku Maven插件,因此需要在pom.xml文件中添加一个额外配置。具体来说,我们必须添加在Heroku平台上显示的应用名称。为此,我们在插件的配置元素中定义应用名称:

<appName>our-app-name</appName>

推送更改后,管道启动,随后部署应用。

6. 使用Docker部署

假设本地已安装Docker,我们首先在项目根目录创建一个Dockerfile。然后填充以下内容:

FROM maven:3.8.4-openjdk-17 AS build

WORKDIR /app

COPY . .

RUN mvn clean package -DskipTests

FROM openjdk:17-jdk-slim

WORKDIR /app

COPY --from=build /app/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

通过上述脚本,我们使用Maven构建应用,将构建的.jar文件复制到一个更小的JDK镜像中,并暴露端口8080供应用运行。

其次,我们需要在resource文件夹中添加application.properties文件来设置服务器端口:

server.port=${PORT:8080}

这样,Docker可以将端口映射到我们的Spring应用端口。

第三,我们构建并运行Docker镜像,确保其正常工作:

docker build -t our-heroku-app .
docker run -p 8080:8080 our-heroku-app

使用curl localhost:8080检查是否返回"Hello, Heroku!"字符串。

最后,我们必须将更改部署并发布到Heroku。为此,我们在终端中执行几个命令

首先运行heroku container:login登录到Heroku Container Registry。然后使用heroku container:push web –app our-heroku-app构建并推送Docker镜像到Heroku。最后,使用heroku container:release web –app our-heroku-app发布应用镜像。

发布后,应用应该上线,我们可以使用命令heroku open –app our-heroku-app进行验证。

7. 总结

本文探讨了在Heroku上部署Java应用的多种方法。

我们了解了如何使用提供的CLI轻松设置和部署Heroku应用。

此外,我们利用Heroku Maven插件的命令,简化了从终端和CI/CD环境的部署。

最后,我们理解了Docker在快速应用部署中的优势。

一如既往,代码可以在GitHub上找到


原始标题:Deploying a Java App on Heroku | Baeldung