Deep-dive on the Next Gen Platform. Join the Webinar!

Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up

Heroku スターターガイド (Gradle)

​はじめに

このチュートリアルを使用して Java アプリを数分でデプロイします。

このチュートリアルでは、以下が用意されていることを前提としています。

  • 確認済みの Heroku アカウント
  • ​OpenJDK 17​ (またはそれ以降) がインストールされている
  • ​Postgres​ がインストールされている
  • Eco dyno プラン​のサブスクリプション (推奨)

Gradle の代わりに Maven を使用する場合は、「スターターガイド (Java)​」を参照してください。

低料金プラン​を使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

​設定する

Heroku CLI には、一般によく使われている Git​ というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。

  • ​Git のインストール
  • ​Git の初期設定

このステップでは、Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリケーションの管理やスケール、アドオンのプロビジョニング、最近のアプリケーションログの表示、アプリケーションのローカル実行に使用します。

ご使用のプラットフォーム用のインストーラをダウンロードし、実行してください。

apple ロゴ​macOS

​$ ​brew tap heroku/brew && brew install heroku

windows ロゴ​Windows

​ご使用の Windows に合ったインストーラをダウンロードします。

​64 ビット用インストーラ

​32 ビット用インストーラ

インストールが完了したら、ターミナルで heroku​ コマンドを使用できます。

heroku login​ コマンドを使って Heroku CLI にログインします。

$ heroku login
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com

このコマンドにより、Web ブラウザで認証を完了するための Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページに表示されているLog in​ (ログイン) ボタンをクリックします。

heroku​ と git​ のコマンドが両方とも正しく機能するには、この認証が必要です。

外部の HTTP/HTTPS サービスへの接続にプロキシが必要なファイアウォールを使っている場合は、heroku​ コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY​ または HTTPS_PROXY​ 環境変数を設定​してください。

​アプリを準備する

このステップでは、サンプルアプリケーションをクローンし、Heroku にデプロイできるように準備します。

Heroku をはじめて使う場合は、 Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。

デプロイするアプリケーションを用意してある場合は、 「​Heroku のデプロイ用にコードベースを準備する​」を参照してください。

ローカルのコマンドシェルまたはターミナルで次のコマンドを実行して、サンプルアプリのローカルコピーを作成します。

$ git clone https://github.com/heroku/gradle-getting-started
$ cd gradle-getting-started

この正常な Git リポジトリには、単純な Java アプリケーションが格納されています。アプリケーションには、Heroku アプリによって使用される特殊なプレーンテキストファイルである Procfile​ が含まれています。このファイル内で、アプリを開始するために使用されるプロセスおよびコマンドを明示的に宣言します。

サンプルアプリのソースコードの Procfile​ は、次のようになっています。

web: java -jar build/libs/java-getting-started-gradle-1.0.0-SNAPSHOT.jar

このファイルでは、単一のプロセスタイプの web​ と、その実行に必要なコマンドを宣言しています。web​という名前が重要です。これにより、このプロセスタイプが Heroku の HTTP ルーティング​スタックにアタッチされ、Web トラフィックを受信できることが宣言されます。

Procfile には追加のプロセスタイプを含めることができます。たとえば、アイテムをキューから外す処理を実行するバックグラウンドワーカーを宣言できます。このチュートリアルでは他の処理について説明しませんが、Procfile​ およびプロセスモデル​で詳しい情報を参照できます。

このサンプルアプリには Java のビルドツールである Gradle が使用する build.gradle.kts​ ファイルも含まれています。次のステップでは、このファイルを使用して依存関係を宣言する方法について説明します。

​アプリの依存関係を宣言する

Heroku では、アプリのルートディレクトリに build.gradle.kts​ ファイルがあると、自動的にそのアプリを Gradle アプリと認識します。Heroku で Gradle アプリが検出されると、公式の Gradle buildpack がアプリに追加され、これによってアプリの依存関係がインストールされます。

デプロイしたサンプルアプリには、事前に build.gradle.kts​ が用意されています (こちらを参照)​。

アプリをデプロイすると、Heroku がこのファイルを読み出し、依存関係をインストールします。build.gradle.kts​に一覧表示される依存関係を確認してください。

別の system.properties​ ファイルで、使用する Java のバージョンを指定します。このオプションのファイルの内容は、次のようになります。

java.runtime.version=17

Heroku では、多数の異なるバージョン​をサポートしています。異なるバージョンの Java を使用して、独自のアプリをプッシュできます。

​アプリをデプロイする

このステップでは、アプリを Heroku にデプロイします。

dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。コストを抑制するために、試行を終了したらすぐにアプリを削除​し、データベースも削除​してください。

 

Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちら​を参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

Heroku でアプリを作成して、デプロイ用のソースコードを受け取るよう準備します。

$ heroku create
Creating app... done, ⬢ peaceful-inlet-84135
https://peaceful-inlet-84135.herokuapp.com/ | https://git.heroku.com/peaceful-inlet-84135.git

このコマンドにより、アプリと、ローカルの Git リポジトリと関連付けられた heroku​ という名前の Git リモートが作成されます。

デフォルトでは、アプリの名前はランダムに生成されます。パラメータを渡すと、独自のアプリ名を指定できます。

CLI コマンドの代わりに Heroku Dashboard 経由でアプリを作成した場合、heroku git:remote --app example-app​ でローカルリポジトリにリモートを追加します。

コードをデプロイします。

$ git push heroku main
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Gradle app detected
remote: -----> Spring Boot detected
remote: -----> Installing OpenJDK 17... done
remote: -----> Building Gradle app...
remote: -----> executing ./gradlew build -x check
remote:        Downloading https://services.gradle.org/distributions/gradle-7.6.1-bin.zip
remote:        ...........10%............20%...........30%............40%............50%...........60%............70%............80%...........90%............100%
remote:        To honour the JVM settings for this build a single-use Daemon process will be forked. See https://docs.gradle.org/7.6.1/userguide/gradle_daemon.html#sec:disabling_the_daemon.
remote:        Daemon will be stopped at the end of the build
remote:        > Task :compileJava
remote:        > Task :processResources
remote:        > Task :classes
remote:        > Task :resolveMainClassName
remote:        > Task :bootJar
remote:        > Task :jar
remote:        > Task :assemble
remote:        > Task :build
remote:
remote:        BUILD SUCCESSFUL in 1m 9s
remote:        5 actionable tasks: 5 executed
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 85.6M
remote: -----> Launching...
remote:        Released v5
remote:        https://peaceful-inlet-84135.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/peaceful-inlet-84135.git
 * [new branch]      main -> main

デフォルトでは、アプリは Eco dyno でデプロイされます。dyno は、Procfile​ で指定されているコマンドを実行する軽量の Linux コンテナです。デプロイ後に、1 つの web​ dyno​ がアプリを実行していることを確認します。実行されている dyno の数を確認するには、heroku ps​ コマンドを使います。

$ heroku ps
Eco dyno hours quota remaining this month: 1000h 0m (100%)
Eco dyno usage for this app: 0h 0m (0%)
For more information on Eco dyno hours, see:
https://devcenter.heroku.com/articles/eco-dyno-hours

=== web (Eco): java -jar build/libs/java-getting-started-gradle-1.0.0-SNAPSHOT.jar (1)
web.1: up 2023/03/09 17:00:28 +0100 (~ 1m ago)

実行中の web​ dyno がリクエストに応答します。アプリ名で生成された URL にあるアプリを開きます。次のショートカットを使うと、簡単に Web サイトを開くことができます。

$ heroku open

Eco dyno は、アイドル状態 (トラフィックを何も受信しない状態など) が 30 分続くとスリープします。このスリープ動作により、スリープ解除するときの最初のリクエスト時に数秒の遅延が発生します。その後のリクエストは正常に処理されます。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間​を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。

dyno がスリープしないようにするには、「dyno タイプ​」で紹介されている Basic または Professional の dyno タイプにアップグレードしてください。

​アプリをスケールする

Heroku でアプリケーションを水平方向にスケーリングすることは、実行中の dyno の数を変更することを意味します。

Web dyno の数を 0 にスケールしてみます。

$ heroku ps:scale web=0

ブラウザを更新するか、heroku open​ を実行して、もう一度アプリにアクセスします。リクエストに応答できる Web dyno がアプリにないので、エラーメッセージが表示されます。

もう一度スケールしてみましょう。

$ heroku ps:scale web=1

大規模な dyno にアップグレードすることによって、垂直方向のスケーリングを行うこともできます。詳細は、「dyno タイプ​」および「Dyno formation のスケーリング​」を参照してください。

​ログを表示する

Heroku では、アプリとプラットフォームのコンポーネントの両方の出力ストリームがすべて単一チャネルの時系列ログに集約されます。

実行中のアプリに関する情報を表示するには、heroku logs --tail​ コマンドを使います。

$ heroku logs --tail
2023-03-09T16:03:23.130513+00:00 app[web.1]: 2023-03-09T16:03:23.130Z  INFO 2 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 41040 (http)
2023-03-09T16:03:23.141029+00:00 app[web.1]: 2023-03-09T16:03:23.140Z  INFO 2 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-09T16:03:23.141265+00:00 app[web.1]: 2023-03-09T16:03:23.141Z  INFO 2 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.5]
2023-03-09T16:03:23.218914+00:00 app[web.1]: 2023-03-09T16:03:23.218Z  INFO 2 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-09T16:03:23.220624+00:00 app[web.1]: 2023-03-09T16:03:23.220Z  INFO 2 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 976 ms
2023-03-09T16:03:23.469655+00:00 app[web.1]: 2023-03-09T16:03:23.469Z  INFO 2 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
2023-03-09T16:03:23.692938+00:00 app[web.1]: 2023-03-09T16:03:23.692Z  INFO 2 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 41040 (http) with context path ''
2023-03-09T16:03:23.707694+00:00 app[web.1]: 2023-03-09T16:03:23.707Z  INFO 2 --- [           main] c.heroku.java.GettingStartedApplication  : Started GettingStartedApplication in 1.927 seconds (process running for 2.33)
2023-03-09T16:03:23.940755+00:00 heroku[web.1]: State changed from starting to up
2023-03-09T16:03:24.673236+00:00 app[web.1]: 2023-03-09T16:03:24.672Z  INFO 2 --- [io-41040-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-03-09T16:03:24.673549+00:00 app[web.1]: 2023-03-09T16:03:24.673Z  INFO 2 --- [io-41040-exec-3] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-03-09T16:03:24.674938+00:00 app[web.1]: 2023-03-09T16:03:24.674Z  INFO 2 --- [io-41040-exec-3] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2023-03-09T16:03:24.948408+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-inlet-84135.herokuapp.com request_id=e010a5e5-f212-4e0b-a624-c96f7421c98f fwd="85.222.134.1" dyno=web.1 connect=0ms service=304ms status=200 bytes=8917 protocol=https
2023-03-09T16:03:25.162539+00:00 heroku[router]: at=info method=GET path="/stylesheets/main.css" host=peaceful-inlet-84135.herokuapp.com request_id=dcbe440f-82c5-4442-80bc-be7be0b5cd61 fwd="85.222.134.1" dyno=web.1 connect=0ms service=10ms status=304 bytes=208 protocol=https
2023-03-09T16:03:25.335819+00:00 heroku[router]: at=info method=GET path="/lang-logo.png" host=peaceful-inlet-84135.herokuapp.com request_id=071b67a6-1e22-4cfe-b57b-c49db6b5af19 fwd="85.222.134.1" dyno=web.1 connect=0ms service=3ms status=304 bytes=208 protocol=https
2023-03-09T16:03:25.534061+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=peaceful-inlet-84135.herokuapp.com request_id=cc651ead-23ce-4c43-a3ce-4edc93450b14 fwd="85.222.134.1" dyno=web.1 connect=0ms service=82ms status=404 bytes=333 protocol=https

ブラウザで再びアプリケーションを表示すると、別のログメッセージが生成されます。

ログのストリーム出力を停止するには、CTRL+C​ を押します。

デフォルトで、Heroku では、アプリの最新ログが 1500 行、保存されます。長期の保存のために、ログ記録アドオン​をプロビジョニングするか、独自のログドレインを実装することができます。次のステップでは、ログ記録アドオンをアプリに追加します。

​アドオンをプロビジョニングする

アドオンは、アプリケーションにデータベース、ログ記録、監視などの追加サービスを提供するクラウドのサービスです。

ログの永続化、検索、アラートなどの機能を提供するいくつかのログ記録アドオンを利用できます。Papertrail​ は、無料プランで使えるそのようなアドオンです。

次のようにして、アドオンをプロビジョニングします。

$ heroku addons:create papertrail
Creating papertrail on ⬢ peaceful-inlet-84135... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-slippery-84785 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation

このコマンドを使用して、アドオンのプロビジョニングを行い、アプリケーションのためにアドオンを設定します。このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスする度にログメッセージが生成され、Papertrail のアドオンに送られます。Papertrail のコンソールにアクセスし、ログメッセージを確認します。

$ heroku addons:open papertrail

ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。

次のようにして、アプリのアクティブなアドオンをすべて一覧表示できます。

$ heroku addons

サンプルアプリに対してこのコマンドを実行すると、その Papertrail アドオンが一覧表示されます。

​データベースを使用する

データベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。コストを抑制するために、完了したらすぐにデータベースを削除してください。低料金プラン​について確認してください。資格のある学生の皆様は、Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

Heroku には Postgres と Redis のマネージドデータサービスがあり、add-on marketplace​ には MongoDB や MySQL などの追加のデータサービスがあります。

heroku addons:create​ コマンドを使用して、アプリ用に Postgres データベースをプロビジョニングします。

$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ peaceful-inlet-84135... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-fitted-70383 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-fitted-70383 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation

heroku addons​ コマンドを使用すると、アプリに対してプロビジョニングされるデータベースの概要が示されます。

$ heroku addons

Add-on                                       Plan         Price     State
───────────────────────────────────────────  ───────────  ────────  ───────
heroku-postgresql (postgresql-fitted-70383)  essential-0  $5/month  created
 └─ as DATABASE

papertrail (papertrail-slippery-84785)       choklad      free      created
 └─ as PAPERTRAIL

The table above shows add-ons and the attachments to the current app (peaceful-inlet-84135) or other apps.

アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL​) が表示されます。

$ heroku config
=== peaceful-inlet-84135 Config Vars
DATABASE_URL:         postgres://avhrhofbiyvpct:3ab23026d0fc225bde4544cedabc356904980e6a02a2418ca44d7fd19dad8e03@ec2-23-21-4-7.compute-1.amazonaws.com:5432/d8e8ojni26668k
PAPERTRAIL_API_TOKEN: ChtIUu9fHbij1cBn7y6z

heroku pg​ コマンドを使用すると、アプリの Heroku Postgres データベースについて、より詳細な情報が表示されます。

$ heroku pg
=== DATABASE_URL
Plan:                  Essential 0
Status:                Available
Connections:           0/20
PG Version:            15.5
Created:               2024-05-01 16:00 UTC
Data Size:             8.6 MB/1.00 GB (0.84%) (In compliance)
Tables:                0
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-fitted-70383

アプリに対してこのコマンドを実行すると、アプリに essential-0​ Postgres データベースがあり、テーブルがないことが示されます。

デプロイしたサンプルアプリにはデータベース機能が備わっています。これにはアプリの URL に /database​ パスを追加することでアクセスできます。

$ heroku open /database

次のように表示されます。

Database Output

* Read from DB: 2023-03-09 16:58:55.816605
* Read from DB: 2023-03-09 16:58:56.728701
* Read from DB: 2023-03-09 16:58:57.064755

ローカル環境に Postgres がインストールされている​という前提で、heroku pg:psql​ コマンドを使ってリモートデータベースに接続し、すべての行を表示します。

$ heroku pg:psql
--> Connecting to postgresql-fitted-70383
psql (15.2, server 14.7 (Ubuntu 14.7-1.pgdg20.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

peaceful-inlet-84135::DATABASE=> SELECT * FROM ticks;
            tick
----------------------------
 2023-03-09 16:58:55.816605
 2023-03-09 16:58:56.728701
 2023-03-09 16:58:57.064755
(3 rows)

peaceful-inlet-84135::DATABASE=> \q

次の情報は、サンプルアプリでデータベース機能を実装する方法を示しています。このステップで、サンプルアプリのコードを変更しないでください。

サンプルアプリのコードは、次のようになっています。

private final DataSource dataSource;

@Autowired
public GettingStartedApplication(DataSource dataSource) {
    this.dataSource = dataSource;
}

@GetMapping("/database")
String database(Map<String, Object> model) {
    try (Connection connection = dataSource.getConnection()) {
        final var statement = connection.createStatement();
        statement.executeUpdate("CREATE TABLE IF NOT EXISTS ticks (tick timestamp)");
        statement.executeUpdate("INSERT INTO ticks VALUES (now())");

        final var resultSet = statement.executeQuery("SELECT tick FROM ticks");
        final var output = new ArrayList<>();
        while (resultSet.next()) {
            output.add("Read from DB: " + resultSet.getTimestamp("tick"));
        }

        model.put("records", output);
        return "database";

    } catch (Throwable t) {
        model.put("message", t.getMessage());
        return "error";
    }
}

database​ メソッドでは、/database​ ルートを使用してアプリにアクセスしたとき、新しい行が tick​ テーブルに追加されます。次に、出力に表示するすべての行を返します。

サンプルアプリのコードで示す DataSource​ は、Spring Boot フレームワークによって自動的に設定および挿入されます。これはデータベース接続設定のための src/main/resources/application.properties​ ファイル内の値を参照します。

サンプルアプリでは、データベースへの接続のプールを設定するために、spring.datasource.url​ が JDBC_DATABASE_URL​ 環境変数内の値に設定されています。

spring.datasource.url: ${JDBC_DATABASE_URL}

アプリに自動的に追加される公式の Heroku Gradle buildpack では、この JDBC_DATABASE_URL​ 環境変数が設定​されています。この変数は動的であり、heroku config​ を実行しても環境設定の一覧に表示されません。次のコマンドを実行すると表示できます。

$ heroku run echo \$JDBC_DATABASE_URL

詳細は、「Heroku PostgreSQL​」を参照してください。Redis または他のデータアドオン​も、heroku addons:create​ によってインストールできます。

​ローカル環境を準備する

以下のステップでは、アプリをローカルで操作し、変更内容を Heroku にプッシュする方法について学習します。このステップでは、依存関係をローカルにインストールすることから開始します。

ローカルディレクトリで ./gradlew build​ を実行します。このコマンドにより依存関係がインストールされ、アプリをローカルで実行できるようシステムが準備されます。

$ ./gradlew build

BUILD SUCCESSFUL in 800ms
5 actionable tasks: 5 executed

Maven のプロセスで、依存関係を使用して JAR がコンパイルおよびビルドされ、アプリケーションの target​ ディレクトリに格納されます。この処理は、pom.xml​ の spring-boot-maven-plugin​ によって提供されます。

依存関係がインストールされたら、アプリをローカルで実行できます。ただし、アプリでは Postgres データベースが必要です。ローカルの Postgres データベースを作成し、ローカルの .env​ ファイルを更新します。アプリをローカルで実行するために使用される heroku local​ により、アプリのルートディレクトリにある .env​ ファイルに基づき環境が自動的に設定されます。JDBC_DATABASE_URL​環境変数にローカルの Postgres データベースの接続文字列を設定します。

JDBC_DATABASE_URL=jdbc:postgresql://localhost:5432/java_database_name

これで、アプリを実行してデータベースに接続するためのローカル環境の準備ができました。

​アプリをローカルで実行する

アプリをローカルで実行する前に ./gradlew build​ がすでに実行されていることを確認します。

heroku local​ CLI コマンド​を使用して、アプリケーションをローカルで開始します。

$ heroku local --port 5001
...
5:26:58 PM web.1 |  2023-03-09T17:26:58.009+01:00  INFO 39665 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 5001 (http)
5:26:58 PM web.1 |  2023-03-09T17:26:58.014+01:00  INFO 39665 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
5:26:58 PM web.1 |  2023-03-09T17:26:58.014+01:00  INFO 39665 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.5]
5:26:58 PM web.1 |  2023-03-09T17:26:58.055+01:00  INFO 39665 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
5:26:58 PM web.1 |  2023-03-09T17:26:58.056+01:00  INFO 39665 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 497 ms
5:26:58 PM web.1 |  2023-03-09T17:26:58.175+01:00  INFO 39665 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
5:26:58 PM web.1 |  2023-03-09T17:26:58.278+01:00  INFO 39665 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 5001 (http) with context path ''
5:26:58 PM web.1 |  2023-03-09T17:26:58.288+01:00  INFO 39665 --- [           main] c.heroku.java.GettingStartedApplication  : Started GettingStartedApplication in 0.931 seconds (process running for 1.119)

Heroku プラットフォームと同じように、heroku local​ も Procfile​ を確認して実行するコマンドを判断します。

Web ブラウザで http://localhost:5001​ を開き、アプリがローカルで実行中であることを確認します。

アプリの /database​ ルートにローカルでアクセスする必要がある場合、URL にアクセスする前にローカルの Postgres データベースが実行中であることを確認してください。

アプリのローカルでの実行を停止するには、ターミナルウィンドウに戻り、CTRL+C​ を押して終了します。

​ローカルの変更をプッシュする

このステップでは、ローカルでアプリに変更を加え、変更を Heroku にデプロイする方法について学びます。以下の依存関係と、それを使用するコードを追加します。

build.gradle.kts​ を編集し、dependencies​ 要素内に次のコードを追加して、jscience​ の依存関係を追加します。

build.gradle.kts​ ファイル内で、次の依存関係を dependencies​ 要素に追加します。

implementation("org.jscience:jscience:4.3.1")

src/main/java/com/heroku/java/GettingStartedApplication.java​ ファイル内で、ライブラリに対する次のインポートステートメントを追加します。

import org.jscience.physics.amount.Amount;
import org.jscience.physics.model.RelativisticModel;
import javax.measure.unit.SI;

次の convert​ メソッドを GettingStartedApplication.java​ に追加します。

@GetMapping("/convert")
String convert(Map<String, Object> model) {
    RelativisticModel.select();
    var energy = Amount.valueOf("12 GeV");

    model.put("result", "E=mc^2: " + energy + " = " + energy.to(SI.KILOGRAM));
    return "convert";
}

最後に、上記の内容で src/main/resources/templates/convert.html​ ファイルを作成します。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:replace="~{fragments/layout :: layout (~{::body},'hello')}">
<body>

<div class="container">
    <p th:text="${result}"/>
</div>

</body>
</html>

GettingStartedApplication.java​ の最終的なソースコードはこのようになります​。変更内容が同じようになっていることを確認します。ローカルで行ったすべての変更の差分はこちら​です。

ローカルで変更をテストします。

$ ./gradlew build

BUILD SUCCESSFUL in 734ms
6 actionable tasks: 6 executed

$ heroku local --port 5001
...
6:05:29 PM web.1 |  2023-03-09T18:05:29.514+01:00  INFO 69174 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 492 ms
6:05:29 PM web.1 |  2023-03-09T18:05:29.628+01:00  INFO 69174 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
6:05:29 PM web.1 |  2023-03-09T18:05:29.726+01:00  INFO 69174 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 5001 (http) with context path ''
6:05:29 PM web.1 |  2023-03-09T18:05:29.736+01:00  INFO 69174 --- [           main] c.heroku.java.GettingStartedApplication  : Started GettingStartedApplication in 0.911 seconds (process running for 1.099)

http://localhost:5001/convert​ でアプリケーションの /convert​ パスにアクセスすると、科学的な換算式が表示されます。

E=mc^2: 12 GeV = (2.139194076302506E-26 ± 1.4E-42) kg

テスト後に、変更内容をデプロイします。Heroku のデプロイは、ほとんどの場合、このパターンで行います。まず、git add​ コマンドを使用して、編集したファイルをコミットのためにステージングします。

$ git add .

次に、変更内容をリポジトリにコミットします。

$ git commit -m "Add convert endpoint"

前と同じ方法でデプロイします。

$ git push heroku main

最後に、そのルートでブラウザを開いて、更新されたコードが正しくデプロイされていることを確認します。

$ heroku open /convert

​環境設定を定義する

Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定​に保存することで、アプリの設定を外部に置くことができます。

ランタイムでは、環境設定は環境変数としてアプリに提供されます。例として、GettingStartedApplication.java​ を編集し、環境変数 ENERGY​ から energy の値を取得するメソッドを追加します。

src/main/java/com/heroku/java/GettingStartedApplication.java​ ファイル内で、convert​ メソッドを変更します。

@GetMapping("/convert")
String convert(Map<String, Object> model) {
    RelativisticModel.select();

    final var result = java.util.Optional
            .ofNullable(System.getenv().get("ENERGY"))
            .map(Amount::valueOf)
            .map(energy -> "E=mc^2: " + energy + " = " + energy.to(SI.KILOGRAM))
            .orElse("ENERGY environment variable is not set!");

    model.put("result", result);
    return "convert";
}

./gradlew build​ を実行して、この変更を統合するようアプリを再コンパイルします。

heroku local​ は、アプリのルートディレクトリにある .env​ ファイルに基づいて、ローカル環境を自動的に設定します。サンプルアプリには、すでに以下の内容の .env​ ファイルがあります。

ENERGY=20 GeV

アプリのローカル実行​ ステップで設定した場合、ローカルの .env​ ファイルには、JDBC_DATABASE_URL​ 変数も含まれています。

.env​ ファイルをバージョン管理にコミットしないでください。多くの場合、このファイルには機密性の高い資格情報が入っているためです。.env​は、リポジトリの .gitignore​ ファイルに入れてください。サンプルアプリのリポジトリには、このチュートリアルステップの例としての .env​ ファイルのみを格納します。

heroku local --port 5001​ でアプリを実行して http://localhost:5001/convert​ にアクセスすると、換算値として 20 GeV が表示されます。

ローカルで期待通り機能することがわかったので、Heroku 上で実行するアプリの環境設定としてこの変数を設定します。以下を実行します。

$ heroku config:set ENERGY="20 GeV"
Setting ENERGY and restarting ⬢ peaceful-inlet-84135... done, v9
ENERGY: 20 GeV

heroku config​ を使用してアプリの環境設定を表示し、正しく操作したことを確認します。

$ heroku config
=== peaceful-inlet-84135 Config Vars
DATABASE_URL:         postgres://avhrhofbiyvpct:3ab23026d0fc225bde4544cedabc356904980e6a02a2418ca44d7fd19dad8e03@ec2-23-21-4-7.compute-1.amazonaws.com:5432/d8e8ojni26668k
ENERGY:               20 GeV
PAPERTRAIL_API_TOKEN: ChtIUu9fHbij1cBn7y6z

ローカルでの変更内容を Heroku にデプロイし、/convert​ ルートにアクセスして動作中の変更内容を確認します。

$ git add .
$ git commit -m "Use ENERGY environment variable"
$ git push heroku main
$ heroku open /convert

​One-off Dyno を開始する

heroku run​ コマンドを使用して、One-off dyno​ 内のアプリでメンテナンスや管理のタスクを実行できます。このコマンドでは、アプリの環境で試行錯誤するためにローカルのターミナルにアタッチされた REPL プロセスや、デプロイされたアプリケーションコードを起動することもできます。

$ heroku run java -version
Running java -version on ⬢ peaceful-inlet-84135... up, run.4406 (Eco)
openjdk version "17.0.6" 2023-01-17 LTS
OpenJDK Runtime Environment Zulu17.40+19-CA (build 17.0.6+10-LTS)
OpenJDK 64-Bit Server VM Zulu17.40+19-CA (build 17.0.6+10-LTS, mixed mode, sharing)

Error connecting to process​ というエラーが表示された場合は、ファイアウォールを設定します​。

必ず exit​ と入力してシェルを閉じ、dyno を終了してください。

次のステップ

これで完了です。ここまでは、アプリのデプロイ、アプリの設定変更、アプリのスケール、ログの表示、アドオンのアタッチ、ローカルでの実行方法を説明しました。

引き続き Heroku を活用するためにお勧めするリソースを以下に紹介します。

  • 「Heroku の仕組み​」では、アプリの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
  • 「Java カテゴリ​」では、Java アプリケーションの開発とデプロイに関する詳細を確認できます。
  • 「デプロイカテゴリ​」では、デプロイを効率的かつ簡単に行うことができるようにする、多くの強力な統合や機能を紹介しています。

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices