Spring で作られた API を Quarkus で起動する
前回 こちらで Quarkus の Spring Extension で簡単な API を作成しました。
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
ディスカッション
コメント一覧
まだ、コメントがありません