Bolt for Java は、最新のプラットフォーム機能を使った Slack アプリの開発をスピーディに行うための抽象レイヤーを提供するフレームワークです。
このガイドでは、初めての Bolt アプリを開発する手順を紹介します。
/hello
コマンドの有効化なお Slack アプリ開発全般についてまだ不慣れな方は、まず「An introduction to Slack apps(英語)」に軽く目を通した方がよいかもしれません。
では、さっそく Bolt を使った Slack アプリ開発を始めましょう!このガイドでは Maven、Gradle を使ったプロジェクトセットアップの手順を説明します。
Maven プロジェクトを作成した後、まずは bolt 依存ライブラリを pom.xml
に追加します。このライブラリ自体は特定の環境に依存していません。ソケットモードを有効にするためには bolt-socket-mode というライブラリとその provided スコープの必要な依存ライブラリも合わせて追加してください。
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>bolt</artifactId>
<version>1.40.3</version>
</dependency>
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>bolt-socket-mode</artifactId>
<version>1.40.3</version>
</dependency>
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.tyrus.bundles</groupId>
<artifactId>tyrus-standalone-client</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
デフォルトでは tyrus-standalone-client が bolt-socket-mode でソケットモードのコネクションを管理するための実装として使用されます。
もし Java-WebSocket を代わりに使いたい場合は、tyrus-standalone-client の代わりにそれを指定した上で���クライアントの初期化時に SocketModeClient.Backend.JavaWebSocket
を指定するようにしてください。
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
また、コンパイラーの source/target 言語の設定を最低でも 1.8 以上にしておく必要があります。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Gradle プロジェクトを作成した後 bolt 関連の依存ライブラリを build.gradle
に追加してください。
dependencies {
implementation("com.slack.api:bolt:1.40.3")
implementation("com.slack.api:bolt-socket-mode:1.40.3")
implementation("javax.websocket:javax.websocket-api:1.1")
implementation("org.glassfish.tyrus.bundles:tyrus-standalone-client:1.19")
implementation("org.slf4j:slf4j-simple:1.7.36")
}
bolt-socket-mode はソケットモードの Slack アプリを起動する手軽な手段です。このモジュールを使えば、開発者は App インスタンスを初期化して処理をスタートする main メソッドを書くだけで WebSocket コネクションを確立することができます。
以下のビルド設定は、そのままコピーして使うことができます。プロジェクトのルートディレクトリに配置してください。
plugins {
id("application")
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.slack.api:bolt-socket-mode:1.40.3")
implementation("javax.websocket:javax.websocket-api:1.1")
implementation("org.glassfish.tyrus.bundles:tyrus-standalone-client:1.19")
implementation("org.slf4j:slf4j-simple:1.7.36")
}
application {
mainClassName = "hello.MyApp"
}
run {
// gradle run -DslackLogLevel=debug
systemProperty "org.slf4j.simpleLogger.log.com.slack.api", System.getProperty("slackLogLevel")
}
このフレームワークを使ったコーディングは想像以上に簡単です。
はじめての Bolt アプリを動かすためにはたった一つのソースコードだけが必要です。必要なことは SocketModeApp を起動させる main メソッドを定義することだけです。
package hello;
import com.slack.api.bolt.App;
import com.slack.api.bolt.socket_mode.SocketModeApp;
public class MyApp {
public static void main(String[] args) throws Exception {
// SLACK_BOT_TOKEN という環境変数が設定されている前提
App app = new App();
app.command("/hello", (req, ctx) -> {
return ctx.ack(":wave: Hello!");
});
// SLACK_APP_TOKEN という環境変数が設定されている前提
new SocketModeApp(app).start();
}
}
Java 10 以上のバージョンを使えば Local Variable Type Inference によって上記のコードはもう少し簡潔になるでしょう。例えば OpenJDK 11 をインストールして、以下のように build.gradle
で Java のバージョンを指定します。お使いの IDE でも同じ設定にします。
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
これによって、同じ型を繰り返し記述する必要がなくなります。
var app = new App();
app.command("/hello", (req, ctx) -> {
return ctx.ack(":wave: Hello!");
});
new SocketModeApp(app).start();
App のデフォルトコンストラクタは、アプリの起動時に、以下の二つの環境変数が設定されていることを期待します。
環境変数名 | 説明 |
---|---|
SLACK_BOT_TOKEN | 開発用ワークスペース(Development Workspace)での有効なボットトークン(形式は xoxb- から始まります)です。このボットトークンを発行するには Slack アプリを開発用ワークスペースにインストールする必要があります。Slack アプリ管理画面にアクセスして、開発中のアプリを選択、左ペインの Settings > Install App から実行します(「Please add at least one feature or permission scope to install your app.」というメッセージが表示されている場合は app_mentions:read bot scope を追加してください)。 複数のワークスペースにインストール可能なアプリとして実行する場合はこの環境変数を設定する必要はありません。そのようなアプリの開発については「アプリの配布 (OAuth)」を参考にしてください。 |
SLACK_APP_TOKEN | この Slack アプリの有効なアプリレベルトークン(形式は xapp- から始まります)です。トークンを発行するには、Slack アプリ管理画面にアクセスして、開発中のアプリを選択、左ペインの Settings > Basic Information > App-Level Tokens へ移動し、connections:write というスコープにしたトークンを作成します。 |
なお、App を別の方法(例: 規定の環境変数名を使わない)で初期化したい場合は AppConfig を自前で初期化するコードを書いてください。
上記の二つの環境変数を設定した上で、ターミナル上でアプリを実行してみましょう。
gradle run
(より詳細なログを表示したい場合は gradle run -DslackLogLevel=debug
)mvn compile exec:java -Dexec.mainClass="hello.MyApp"
(より詳細なログを表示したい場合は -Dorg.slf4j.simpleLogger.defaultLogLevel=debug
を指定)このコマンドは、先ほど定義した main メソッドを実行します。
# https://api.slack.com/apps にアクセスして取得
export SLACK_BOT_TOKEN=xoxb-...your-own-valid-one
export SLACK_APP_TOKEN=xapp-...your-own-valid-one
# main メソッドを実行して WebSocket 接続するプロセスを起動
# Gradle の場合
gradle run
# Maven の場合
mvn compile exec:java -Dexec.mainClass="hello.MyApp"
もしうまくいかない場合は、以下のチェックリストを見直してみてください。
brew install openjdk@11
を実行 / 他の OS 環境の場合は OpenJDK のウェブサイト へアクセス)brew install gradle
を実行 / 他の OS 環境の場合は 公式サイト へアクセス)build.gradle
に bolt-socket-mode と tyrus-standalone-client の依存ライブラリを追加、適切な application プラグイン設定も追加src/main/java/hello/MyApp.java
を作成commands
という Bot Token Scope を追加、connections:write
スコープを設定したアプリレベルトークンを作成、アプリを開発用ワークスペースにインストール/hello
コマンドの有効化Bolt アプリは起動できました!しかし、コードの中で定義した /hello
というスラッシュコマンドはまだ使えません。これを有効にするには以下の手順を行ってください。
/hello
これで /hello
コマンドが開発用ワークスペースで利用できるようになっているはずです。そして、Bolt アプリが正常に動作していれば、コマンド実行に「🍬 はい、アメちゃん!
」という返事が返ってくるはずです。
コードをより簡潔にするために Java の代わりに Kotlin で Bolt アプリを書くことはとても良い選択肢です。このセクションでは、Bolt アプリを Kotlin で開発するための設定手順を紹介します。
ここでのビルド設定のほとんどは Kotlin 言語を有効にするために必要なものです。bolt-socket-mode と tyrus-standalone-client を依存ライブラリを追加していることが唯一 Bolt に固有の設定です。
plugins {
id("org.jetbrains.kotlin.jvm") version "1.7.21"
id("application")
}
repositories {
mavenCentral()
}
dependencies {
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.slack.api:bolt-socket-mode:1.40.3")
implementation("javax.websocket:javax.websocket-api:1.1")
implementation("org.glassfish.tyrus.bundles:tyrus-standalone-client:1.19")
implementation("org.slf4j:slf4j-simple:1.7.36") // または logback-classic など
}
application {
mainClassName = "MyAppKt" // ソースファイル名の末尾、拡張子の代わりに "Kt" をつけた命名になります
}
もしすでに Kotlin に詳しくて、Gradle Kotlin DSL を使いたい場合、もちろんそれも全く問題ありません。
これは Bolt アプリをローカルマシンで起動するために必要最低限のコードを含むソースファイルです。
import com.slack.api.bolt.App
import com.slack.api.bolt.socket_mode.SocketModeApp
fun main() {
val app = App()
// ここで何かする
SocketModeApp(app).start()
}
これで全て完了です。念のため、チェックリストを確認しておきましょう。
brew install openjdk@11
を実行 / 他の OS 環境の場合は OpenJDK のウェブサイト へアクセス)brew install gradle
を実行 / 他の OS 環境の場合は 公式サイト へアクセス)build.gradle
に適切な Kotlin の言語設定と bolt-socket-mode と tyrus-standalone-client を依存ライブラリを追加src/main/kotlin/MyApp.kt
を作成commands
という Bot Token Scope を追加、connections:write
スコープを設定したアプリレベルトークンを作成、アプリを開発用ワークスペースにインストールすべてが OK ✅であれば、あなたのはじめての Kotlin を使った Bolt アプリが正常に起動するはずです。
# https://api.slack.com/apps にアクセスして取得
export SLACK_BOT_TOKEN=xoxb-...your-own-valid-one
export SLACK_APP_TOKEN=xapp-...your-own-valid-one
# main メソッドを実行して、サーバープロセスを起動
gradle run
ここからやることはコードを書いて必要に応じてアプリをリスタートするだけです。Kotlin での Bolt アプリ開発を楽しんでください! 👋
Pro tip: もしあなたがあまり IDE を使うことが好みでないとしても Kotlin を使うなら IntelliJ IDEA を使うことを強くおすすめします。この IDE を使うことがもっともスムースな Kotlin アプリ開発の方法です。
「Bolt の概要」を読んでさらに理解を深めてください。