1. 概要

Bootique は、次世代のスケーラブルなマイクロサービスを構築することを目的とした、非常に軽量なオープンソースのコンテナーレスJVMフレームワークです。 組み込みのJettyサーバー上に構築され、jax-rsRESTハンドラーを完全にサポートします。

この記事では、Bootiqueを使用して簡単なWebアプリケーションを構築する方法を紹介します。

2. Mavenの依存関係

pom.xmlに次の依存関係を追加して、 Bootique の使用を開始しましょう:

<dependency>
    <groupId>io.bootique.jersey</groupId>
    <artifactId>bootique-jersey</artifactId>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>io.bootique</groupId>
    <artifactId>bootique-test</artifactId>
    <scope>test</scope>
</dependency>

ただし、 Bootique では、いくつかの BOM(「部品表」)インポートを宣言する必要もあります。 だから次のセクションを追加する必要があります pom.xml:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.bootique.bom</groupId>
            <artifactId>bootique-bom</artifactId>
            <version>0.23</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Bootique の最新バージョンは、 Central MavenRepositoryで入手できます。

実行可能なjarを構築するために、Bootiquemaven-shade-pluginに依存しています。 そのため、以下の構成も追加する必要があります。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3. アプリケーションの開始

Bootique アプリケーションを起動する最も簡単な方法は、メインメソッドから Bootiqueexec()メソッドを呼び出すことです。

public class App {
    public static void main(String[] args) {
        Bootique.app(args)
          .autoLoadModules()
          .exec();
    }
}

ただし、組み込みサーバーは起動しません。上記のコードを実行すると、次のログが表示されます。

NAME
      com.baeldung.bootique.App

OPTIONS
      -c yaml_location, --config=yaml_location
           Specifies YAML config location, which can be a file path 
           or a URL.

      -h, --help
           Prints this message.

      -H, --help-config
           Prints information about application modules and their 
           configuration options.

      -s, --server
           Starts Jetty server.

これらは、Bootiqueにあらかじめバンドルされている利用可能なプログラム引数に他なりません。

名前は一目瞭然です。 したがって、サーバーを起動するには、 –s[X88X]または–server 引数を渡す必要があり、サーバーはデフォルトポート8080で稼働します。

4. モジュール

Bootique アプリケーションは、「モジュール」のコレクションで作成されます。 Bootique の用語では、「モジュールはコードを含むJavaライブラリです」は、すべてのサービスをモジュールとして扱うことを意味します。 依存性注入にはGoogleGuiceを使用します。

それがどのように機能するかを確認するために、1つのインターフェースを作成しましょう。

public interface HelloService {
    boolean save();
}

次に、実装を作成する必要があります。

public class HelloServiceImpl implements HelloService {
 
    @Override
    public boolean save() {
        return true;
    }
}

モジュールをロードする方法は2つあります。 1つはGuiceModuleインターフェースを使用する方法で、もう1つはBootiqueBQModuleProviderを使用する方法です。 自動読み込みとして知られています。

4.1. Guiceモジュール

ここでは、GuiceModuleインターフェースを使用してインスタンスをバインドできます。

public class ModuleBinder implements Module {
 
    @Override
    public void configure(Binder binder) {
        binder
          .bind(HelloService.class)
          .to(HelloServiceImpl.class);
    }
}

モジュールを定義したら、このカスタムモジュールをBootiqueインスタンスにマップする必要があります。

Bootique
  .app(args)
    .module(module)
    .module(ModuleBinder.class)
  .autoLoadModules()
  .exec();

4.2. BQModuleProvider (自動読み込み)

ここで行う必要があるのは、BQModuleProviderを使用して以前に作成したモジュールバインダーを定義することだけです。

public class ModuleProvider implements BQModuleProvider {
 
    @Override
    public Module module() {
        return new ModuleBinder();
    }
}

この手法の利点は、モジュール情報をBootiqueインスタンスにマップする必要がないことです。

/resources/META-INF/services/io.bootique.BQModuleProvider にファイルを作成し、パッケージ名とBootiqueを含むModuleProviderのフルネームを書き込む必要があります。 が残りを処理します:

com.baeldung.bootique.module.ModuleProvider

これで、 @Inject アノテーションを使用して、実行時にサービスインスタンスを使用できます。

@Inject
HelloService helloService;

ここで注意すべき重要な点の1つは、 Bootique 独自のDIメカニズムを使用しているため、サービスインスタンスをバインドするために Guice@ImplementedByアノテーションを使用する必要がないことです。

5. RESTエンドポイント

JAX-RSAPIを使用してRESTエンドポイントを作成するのは簡単です。

@Path("/")
public class IndexController {
 
    @GET
    public String index() {
        return "Hello, baeldung!";
    }
 
    @POST
    public String save() {
        return "Data Saved!";
    }
}

エンドポイントをBootique独自のJerseyインスタンスにマップするには、JerseyModuleを定義する必要があります。

Module module = binder -> JerseyModule
  .extend(binder)
  .addResource(IndexController.class);

6. 構成

YAMLベースのプロパティファイルで組み込みまたはカスタムの構成情報を提供できます。

たとえば、カスタムポートでアプリケーションを起動し、デフォルトのURIコンテキスト「hello」を追加する場合は、次のYAML構成を使用できます。

jetty:
    context: /hello
    connector:
        port: 10001

ここで、アプリケーションの起動時に、configパラメーターでこのファイルの場所を指定する必要があります。

--config=/home/baeldung/bootique/config.yml

7. ロギング

すぐに使用できるBootiqueには、bootique-logbackモジュールが付属しています。 このモジュールを使用するには、pom.xmlに次の依存関係を追加する必要があります。

<dependency>
    <groupId>io.bootique.logback</groupId>
    <artifactId>bootique-logback</artifactId>
</dependency>

このモジュールにはBootLoggerインターフェースが付属しており、オーバーライドしてカスタムロギングを実装できます。

Bootique.app(args)
  .module(module)
  .module(ModuleBinder.class)
    .bootLogger( new BootLogger() {
      @Override
      public void trace( Supplier<String> args ) {
          // ...
      }
      @Override
      public void stdout( String args ) {
          // ...
      }
      @Override
      public void stderr( String args, Throwable thw ) {
          // ...
      }
      @Override
      public void stderr( String args ) {
          // ...
      }
}).autoLoadModules().exec();

また、config.yamlファイルでロギング構成情報を定義できます。

log:
    level: warn
    appenders:
    - type: file
      logFormat: '%c{20}: %m%n'
      file: /path/to/logging/dir/logger.log

8. テスト

テスト用に、Bootiqueにはbootique-testモジュールが付属しています。 Bootiqueアプリケーションをテストする方法は2つあります。

最初のアプローチは‘foreground’アプローチで、すべてのテストケースをメインのテストスレッドで実行します。

もう1つは、‘background’ アプローチで、テストケースを分離されたスレッドプールで実行します。

「フォアグラウンド」環境は、BQTestFactoryを使用して初期化できます。

@Rule
public BQTestFactory bqTestFactory = new BQTestFactory();

「バックグラウンド」環境は、BQDaemonTestFactoryを使用して初期化できます。

@Rule
public BQDaemonTestFactory bqDaemonTestFactory = new BQDaemonTestFactory();

環境ファクトリの準備ができたら、サービスをテストするための簡単なテストケースを作成できます。

@Test
public void givenService_expectBoolen() {
    BQRuntime runtime = bqTestFactory
      .app("--server").autoLoadModules()
      .createRuntime();
    HelloService service = runtime.getInstance( HelloService.class );
 
    assertEquals( true, service.save() );
}

9. 結論

この記事では、Bootiqueのコアモジュールを使用してアプリケーションを構築する方法を示しました。 bootique-jooq bootique-kotlin bootique-job など、他にもいくつかのBootiqueモジュールを利用できます。 利用可能なモジュールの完全なリストは、こちらで入手できます。

いつものように、完全なソースコードはGitHubで利用できます。