Spring で作られた API を Quarkus で起動する

2021年1月10日

前回 こちらで Quarkus の Spring Extension で簡単な API を作成しました。

https://byceclorets.com/2020/10/25/quarkus-spring-extension-%e3%81%a7%e7%b0%a1%e5%8d%98%e3%81%aa-api-%e3%82%92%e4%bd%9c%e6%88%90%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/

Spring で使っている アノテーションなどはそのままで Quarkus として起動できました。 という事は実装コードを変えずに元々 Spring で作られた API ( 前回と同じ Book API ) を Quarkus で起動できるだろうという事でそれを試していきます。

pom

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <scope>runtime</scope>
    </dependency>

このように springframework を使っている部分を

    <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-spring-web</artifactId>
    </dependency>
    <dependency>
       <groupId>io.quarkus</groupId>
       <artifactId>quarkus-spring-di</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-spring-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-jdbc-postgresql</artifactId>
    </dependency>

こちらの Quarkus が提供している方に変えていきます。

application.properties

あとは DB アクセスのための情報を明記している application.properties の部分を変更します。

spring boot では

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/examdb
spring.datasource.username=tsukasa
spring.datasource.password=password

これを以下のように

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=tsukasa
quarkus.datasource.password=password
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/examdb

変更するだけ。

あとはこれで

$ mvn quarkus:dev

で起動できます。コードの変更は行っていません。

ただ一箇所詰まったところがあり、

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

pom の parent でこれを指定したままにしていたら、

java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors

[error]: Build step io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor#parsePersistenceXmlDescriptors threw an exception: java.lang.IllegalAccessError: class io.quarkus.hibernate.orm.deployment.QuarkusPersistenceXmlParser tried to access private method 'void org.hibernate.jpa.boot.internal.PersistenceXmlParser.<init>(org.hibernate.boot.registry.classloading.spi.ClassLoaderService, javax.persistence.spi.PersistenceUnitTransactionType)’ (io.quarkus.hibernate.orm.deployment.QuarkusPersistenceXmlParser and org.hibernate.jpa.boot.internal.PersistenceXmlParser are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @190fba99)

こんな感じでエラーが出ました。正直こいつはなんで出るか自分は分かってないです。ただこの parent タグを残して置いたら io.quarkus.hibernate.orm.deployment.QuarkusPersistenceXmlParser が org.hibernate.jpa.boot.internal.PersistenceXmlParser の private メソッドにアクセスしようとしているというエラーが出て起動できなくなりました。

spring-boot-starter-parent を消すとそれに依存しているいくつかの dependency がインストールでき無くなるかもしれませんが親から継承しているのは version くらいだったので個別に version 指定するだけでいけました。

pom の切り貼りでこのように Quarkus で起動できるように変更できますが、この辺意外と詰まる事があるかもしれません。

以上!


学習書籍


Quarkus Cookbook【電子書籍】[ Alex Soto Bueno ]

Spring Boot2徹底活用 現場至上主義 [ 廣末丈士 ]

【中古】 Apache Maven2.0入門 Java・オープンソース・ビルドツール /野瀬直樹,横田健彦【著】 【中古】afb