Quarkusへの対応

174 views
Skip to first unread message

よし

unread,
Jun 12, 2024, 5:01:42 AM6/12/24
to DBFluteユーザの集い
Quarkusへの対応予定はありますか?

QuarkusのDI機能としてSpringDIとCDIがあるようなので、それぞれの設定でジェネレートしてみましたが、importがエラーになっておりうまく動かないようでした。

Githubのisuuesに以下がありましたがどんな状況でしょうか?

Test: for Quarkus
https://github.com/dbflute/dbflute-core/issues/154

kubo

unread,
Jun 29, 2024, 5:49:32 AM6/29/24
to dbf...@googlegroups.com
jfluteです。

よしさん、こんにちは。
ごめんなさい、反応がおくれてしまいました。
(メールがgmailのSpamフォルダーに入ってしまっていて、今見つけました...怖いなこれ)

自分自身はQuarkusへのアプローチはできてないのですが、
知人がQuarkus + DBFluteで実際にサービス動かしてると話を聞いた記憶があります。
ちょっと聞いてみますね。

ちなみに、importエラーについて具体的に教えて頂くことはできますでしょうか?
それがわかればこちらで対応もできるかもしれませんし。





Message has been deleted

よし

unread,
Jul 3, 2024, 11:50:36 PM7/3/24
to DBFluteユーザの集い
jfluteさん、こんにちは。

ご回答ありがとうございます。

>知人がQuarkus + DBFluteで実際にサービス動かしてると話を聞いた記憶があります。
>ちょっと聞いてみますね。

ありがとうございます。
稼働実績あるんですね!

>ちなみに、importエラーについて具体的に教えて頂くことはできますでしょうか?
>それがわかればこちらで対応もできるかもしれませんし。

環境消してしまったので復活させて確認してご連絡したいと思います。

2024年6月29日土曜日 18:49:32 UTC+9 jflute:

よし

unread,
Jul 4, 2024, 12:06:48 AM7/4/24
to DBFluteユーザの集い
 jfluteさん、こんにちは。

対象フレームワークをSpringにしてジェネレートした場合のエラーは以下になります。

クラス:DBFluteBeansJavaConfig
以下でエラー
import org.springframework.context.annotation.ComponentScan;
java: シンボルを見つけられません
  シンボル:   クラス ComponentScan
  場所: パッケージ org.springframework.context.annotation

import org.springframework.context.annotation.Lazy;
java: シンボルを見つけられません
  シンボル:   クラス Lazy
  場所: パッケージ org.springframework.context.annotation

クラス:DBFluteConfig
以下でエラー
import org.springframework.jdbc.datasource.DataSourceUtils;
java: パッケージorg.springframework.jdbc.datasourceは存在しません

クラス:ImplementedBehaviorSelector

return _container.getBean(componentType);
java: org.springframework.core.env.EnvironmentCapableにアクセスできません
  org.springframework.core.env.EnvironmentCapableのクラス・ファイルが見つかりません


pomのdependenciesの内容は以下になります

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-rest-jackson</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>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-spring-di</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.dbflute</groupId>
            <artifactId>dbflute-runtime</artifactId>
            <version>${dbflute.version}</version>
        </dependency>

        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.microprofile.openapi</groupId>
            <artifactId>microprofile-openapi-api</artifactId>
        </dependency>
    </dependencies>


2024年7月4日木曜日 12:50:36 UTC+9 よし:

kubo

unread,
Jul 4, 2024, 12:30:26 AM7/4/24
to dbf...@googlegroups.com
jfluteです。

よしさん、エラー内容ありがとうございます。

(springにした場合)springのパッケージが解決できないんですね。。。

quarkus-spring-web とかがspringへの依存を持つのか?
それとも、quarkusパッケージとして同じクラスを持ってるのか?
その辺の仕組みをどうしてるか次第ですね。

// Spring DI APIのためのQuarkusエクステンション
}

ComponentScanが使えない!?!?



一方で、現場でのQuarkus+DBFluteの話ですが、聞くところもう実務で稼働しているようです。
(しかも複数のサービスで)
ただ、DIコンテナとしてGoogle GuiceとQuarkusを連携させて使っているみたいです。

とりあえずExampleを作ってもらっている最中です。
(現場では動いてるのにExampleにすると動かないとかちょっと試行錯誤しているようで、まだ時間が掛かるかもです)

// dbflute-example-on-quarkus -  make first Quakus environment #1



QuarkusのフォーマルなDI対応と、回避的なDI対応と両面から攻めていくような感じです。
フォーマルなDI対応でも、CDIとSpringと2つあるってことなわけですね(><。


よし

unread,
Jul 4, 2024, 12:36:42 AM7/4/24
to DBFluteユーザの集い
jfluteさん、こんにちは。

対象フレームワークをCDIにしてジェネレートした場合のエラーは以下になります。

javaxで軒並みエラーになっています。

それで、ちょっと調べてみると名前空間が Jakartaに代わっているということですかね?
Java EEからJakarta EEへ
https://blogs.oracle.com/otnjp/post/transition-from-java-ee-to-jakarta-ee-ja


クラス:  DBFluteModule
以下でエラー

import javax.enterprise.context.ApplicationScoped;
java: パッケージjavax.enterprise.contextは存在しません
以降も同様に 存在しませんのエラー

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.UnsatisfiedResolutionException;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Qualifier;

クラス:  ImplementedBehaviorSelector

import javax.enterprise.context.spi.CreationalContext;
java: パッケージjavax.enterprise.context.spiは存在しません
以降も同様に 存在しませんのエラー

import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;


試しに javaxの部分をjakartaに変更すると、インポートエラーはなくなりました。
ただ以下のエラーが残りました

クラス:  DBFluteModule

    public class DBFluteBean<T> implements Bean<T> {
・・・
            this.injectionTarget = beanManager.createInjectionTarget(this.annotatedType);
java: シンボルを見つけられません
  シンボル:   メソッド createInjectionTarget(jakarta.enterprise.inject.spi.AnnotatedType<T>)
  場所: タイプjakarta.enterprise.inject.spi.BeanManagerの変数 beanManager

    public class DBFluteBean<T> implements Bean<T> {
・・・
        @Override
        public boolean isNullable() {
            return false;
        }
java: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません

pomはspringの時と同じ内容です。

2024年7月4日木曜日 13:06:48 UTC+9 よし:

よし

unread,
Jul 4, 2024, 12:46:03 AM7/4/24
to DBFluteユーザの集い
jfluteさん、こんにちは。

>とりあえずExampleを作ってもらっている最中です。
>(現場では動いてるのにExampleにすると動かないとかちょっと試行錯誤しているようで、まだ時間が掛かるかもです)

ありがとうございます。

>QuarkusのフォーマルなDI対応と、回避的なDI対応と両面から攻めていくような感じです。
>フォーマルなDI対応でも、CDIとSpringと2つあるってことなわけですね(><。

Quarkus的にはCDIがフォーマルなDIでSpringはおまけ的にアノテーションが使えるようになっているぐらいの対応のような感じです。

コンテキストと依存性注入(CDI)の紹介
https://ja.quarkus.io/guides/cdi

CDIのエラーを別途お送りしていますが、インポートエラー自体は名前空間が変わっているのが原因っぽいです。

2024年7月4日木曜日 13:30:26 UTC+9 jflute:

kubo

unread,
Jul 4, 2024, 12:51:17 AM7/4/24
to dbf...@googlegroups.com
jfluteです

CDIの方もありがとうございます。

littleAdjustmentMap.dfprop にて、isMigrateOldJavaxToJakarta=true
を入れて自動生成し直してみてください。

jakartaパッケージで出力されるはずです。


isNullable()のオーバーライドエラーは、何かちょっと変わったんですかね...



> Quarkus的にはCDIがフォーマルなDIでSpringはおまけ的にアノテーションが使えるようになっているぐらいの対応のような感じです。

まあ、やっぱりそういうことですよね。
CDIへのちゃんとした対応が一番という感じですが...

身の回りでもCDIに詳しい人(経験した人)が皆無なんですよね苦笑。
情報が全然手に入らなくて...


よし

unread,
Jul 4, 2024, 1:15:09 AM7/4/24
to DBFluteユーザの集い
よしです。

>littleAdjustmentMap.dfprop にて、isMigrateOldJavaxToJakarta=true
>を入れて自動生成し直してみてください。

こういうのがあるんですね、生成しなおしてインポートエラーがなくなりました。

ちょっと調べたところ

beanManager.createInjectionTarget は
 BeanManager.getInjectionTargetFactory(AnnotatedType)
に変更されているようです。

isNullable() に関しては「CDI 1.1 以降は非推奨」ということなので、現在は消えているようです。
※ソースを見てみました

以下のGitHubのissuesに記述がありました。
Removal of deprecated bits for next major version
https://github.com/jakartaee/cdi/issues/472

2024年7月4日木曜日 13:51:17 UTC+9 jflute:

kubo

unread,
Jul 4, 2024, 2:03:51 AM7/4/24
to dbf...@googlegroups.com
jfluteです

> isNullable() に関しては「CDI 1.1 以降は非推奨」ということなので、現在は消えているようです。
> ※ソースを見てみました

おおぉ、ありがとうございます。
そうなんですね。(javax.enterprise.injectめぇ、互換性〜〜)

テンプレート見てみたら、固定でfalseを戻してるのでただ消すだけでも良いかも。

@Override
public boolean isNullable() {
    return false;
}

試しに、生成されたDBFluteModuleからisNullable()削除したらどうなります?
他にエラーとかあります?



よし

unread,
Jul 4, 2024, 2:24:02 AM7/4/24
to DBFluteユーザの集い
よしです。

isNullable はコメントアウトしてもう一つのエラー、 createInjectionTargetが存在しないエラーは、とりあえず以下のように変更してエラー自体はなくなりました。

        public DBFluteBean(final BeanManager beanManager, final Class<T> beanClass, final List<Class<? super T>> superTypes) {
            this.beanClass = beanClass;
            this.superTypes = superTypes;
            this.annotatedType = beanManager.createAnnotatedType(beanClass);
//            this.injectionTarget = beanManager.createInjectionTarget(this.annotatedType);
            this.injectionTarget = beanManager.getInjectionTargetFactory(this.annotatedType).createInjectionTarget(null);
        }

ただ、Bhvをインジェクトすると、起動時にエラーが発生しました。

    @Inject
    FruitBhv fruitBhv;

これはサイトに書かれていた

なお、CDIにより自動でコンテナ管理下にされるのを防ぐため、DBFluteが生成するファイルには beans.xml が含まれません。 CDIを有効化するためには、アプリケーション側で別途 beans.xml を用意し、適切な場所に配置する必要があります。

が、関係していますか?

エラー内容
2024-07-04 15:12:09,148 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (vert.x-worker-thread-1) Failed to start quarkus [Error Occurred After Shutdown]: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
... 12 more

at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331)
at io.quarkus.runner.bootstrap.AugmentActionImpl.reloadExistingApplication(AugmentActionImpl.java:265)
at io.quarkus.runner.bootstrap.AugmentActionImpl.reloadExistingApplication(AugmentActionImpl.java:58)
at io.quarkus.deployment.dev.IsolatedDevModeMain.restartApp(IsolatedDevModeMain.java:191)
at io.quarkus.deployment.dev.IsolatedDevModeMain.restartCallback(IsolatedDevModeMain.java:174)
at io.quarkus.deployment.dev.RuntimeUpdatesProcessor.doScan(RuntimeUpdatesProcessor.java:547)
at io.quarkus.deployment.dev.RuntimeUpdatesProcessor.doScan(RuntimeUpdatesProcessor.java:447)
at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$6.call(VertxHttpHotReplacementSetup.java:161)
at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$6.call(VertxHttpHotReplacementSetup.java:148)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$0(ContextImpl.java:178)
at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:279)
at io.vertx.core.impl.ContextImpl.lambda$internalExecuteBlocking$2(ContextImpl.java:210)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
... 12 more

at io.quarkus.builder.Execution.run(Execution.java:123)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:160)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:327)
... 19 more
Caused by: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1529)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:332)
at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:166)
at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:488)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at java.base/java.lang.Thread.run(Thread.java:1583)
at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.acme.spring.dbflute.exbhv.FruitBhv and qualifiers [@Default]
- injection target: org.acme.spring.test.dbflute.GreetingController#fruitBhv
- declared on CLASS bean [types=[org.acme.spring.test.dbflute.GreetingController, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.spring.test.dbflute.GreetingController]
The following classes match by type, but have been skipped during discovery:
- org.acme.spring.dbflute.exbhv.FruitBhv has no bean defining annotation (scope, stereotype, etc.)


at io.quarkus.arc.processor.Beans.resolveInjectionPoint(Beans.java:519)
at io.quarkus.arc.processor.BeanInfo.init(BeanInfo.java:642)
at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:317)
... 12 more
2024年7月4日木曜日 15:03:51 UTC+9 jflute:

kubo

unread,
Jul 4, 2024, 2:37:14 AM7/4/24
to dbf...@googlegroups.com
jfluteです

> なお、CDIにより自動でコンテナ管理下にされるのを防ぐため、DBFluteが生成するファイルには beans.xml が含まれません。 CDIを有効化するためには、アプリケーション側で別途 beans.xml を用意し、適切な場所に配置する必要があります。

DBFluteのCDI対応は、ユーザーの方にコントリビュートしてもらったもので、
正直その文章も自分はあまり理解していないんですよね。
(昔理解してたとしても忘れちゃいましね...)

一応、Quarkus関係ない「DBFlute+CDI」のExampleとして、以下のプロジェクトがあります。
そこ見ると...

src/main/の方では javax.enterprise.inject.spi.Extension ファイルに、
org.docksidestage.derby.dbflute.allcommon.DBFluteModule が書かれています。

src/test/の方では、beans.xmlがありますが、中がほとんど空っぽですね...


よし

unread,
Jul 4, 2024, 2:54:28 AM7/4/24
to DBFluteユーザの集い
よしです。

>DBFluteのCDI対応は、ユーザーの方にコントリビュートしてもらったもので、
なるほど、そうだったんですね。

>src/main/の方では javax.enterprise.inject.spi.Extension ファイルに、
>org.docksidestage.derby.dbflute.allcommon.DBFluteModule が書かれています。
こちらの環境では
jakarta.enterprise.inject.spi.Extension
が作成されており、内容は以下の通りです。
org.acme.spring.dbflute.allcommon.DBFluteModule

beans.xmlはなかったので、とりあえず Exampleの内容をそのままで作成してみましたが、
エラー内容は同様でした。

とりあえず、 beans.xmlについて調べてみます。


2024年7月4日木曜日 15:37:14 UTC+9 jflute:

よし

unread,
Jul 4, 2024, 4:13:19 AM7/4/24
to DBFluteユーザの集い
よしです。

なかなか、厳しそうですね。。

そもそも、コンテナやLambdaなどで高速に起動したいというのが目的でしたので、
Spring BootのGraalVM ネイティブイメージ化の方を調べてみたいと思います。

jfluteさん、ご対応ありがとうございました。

2024年7月4日木曜日 15:54:28 UTC+9 よし:

kubo

unread,
Jul 4, 2024, 6:18:47 AM7/4/24
to dbf...@googlegroups.com
jfluteです。

やはりCDIをちゃんと理解しないとダメそうですね。

Guiceを使った方も結局CDIが壁でGuiceで代用したという感じのようなので、
CDIがQuarkusへの大きな壁ですね...


> そもそも、コンテナやLambdaなどで高速に起動したいというのが目的でしたので、
> Spring BootのGraalVM ネイティブイメージ化の方を調べてみたいと思います。

こちらりょうかいです。
一方で、DBFlute + Quarkus の example 作りは継続していくと思いますので、
何か進展あったらこのスレッドで共有していくようにします。

こちらこそ色々と情報ありがとうございます。


そして、このMLの最初の投稿でぼくからの返事が1週間帰ってこなければ、
ぼくが見逃してる可能性大なので(gmailのSpamフォルダー問題)、
そのときは(良ければ)Twitterやら直接メールやら何かしらで突っついてくださいm(_ _)m。

一応、定期的にSpamフォルダーはちゃんと見ようってのと、
webサイトの方のGoogle Groupsのページも定期チェックしようって意識を持つようにはしました(^^。



#
# 突然Spamに入るようになったの...
# 最近話題のSPF・DKIM・DMARCとかの話と関係あるだろうか???
# (他のメールもSpamじゃないのにSpamに入ってるの結構あったので)
#






よし

unread,
Jul 8, 2024, 3:45:21 AM7/8/24
to DBFluteユーザの集い
よしです。


> そもそも、コンテナやLambdaなどで高速に起動したいというのが目的でしたので、
> Spring BootのGraalVM ネイティブイメージ化の方を調べてみたいと思います。

こちら、試してみた結果以下のエラーになり動きませんでした。

2024-07-08T16:23:00.848+09:00 ERROR 12 --- [demo] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: Could not initialize class com.example.demo.infrastructure.dbflute.bsentity.dbmeta.OwnerDbm] with root cause

エラーの発生しているソースは以下になります

クラス:DBMetaInstanceHandler

    protected static DBMeta toDBMetaInstance(String dbmetaName) {
        try {
            Class<?> dbmetaType = Class.forName(dbmetaName);
            Method method = dbmetaType.getMethod("getInstance", (Class[])null);
            Object result = method.invoke(null, (Object[])null);
            return (DBMeta)result;
        } catch (Exception e) {
            String msg = "Failed to get the instance: " + dbmetaName;
            throw new IllegalStateException(msg, e);
        }
    }

GraalVM ネイティブイメージの導入
https://spring.pleiades.io/spring-boot/reference/packaging/native-image/introducing-graalvm-native-images.html

上記がGraalVM ネイティブについてのサイトですがいろいろと制限があるようです。
※「GraalVM はコードの動的要素を直接認識しないため、リフレクション、リソース、直列化、動的プロキシについて通知する必要があります。」このあたりですかね。。

こちらもなかなか厳しそうです。

もし何か気づかれるところがありましたらお願いいたします。
※全然急ぎません。

2024年7月4日木曜日 19:18:47 UTC+9 jflute:

kubo

unread,
Jul 8, 2024, 4:01:38 AM7/8/24
to dbf...@googlegroups.com
jfluteです。

パッと見ですが、GraalVMネイティブはリフレクションに制限があるみたいですね。

// ネイティブ・イメージでのリフレクションの使用
ネイティブ・イメージでのリフレクションのサポートは部分的であり、リフレクティブにアクセスされるプログラム要素の事前把握が必要になります。
java.lang.reflect.*を使用してプログラム要素を調べてアクセスしたり、実行時にClass.forName(String)を使用してクラスをロードするには、
それらのプログラム要素の追加メタデータを準備する必要があります。
}

// GraalVMのNative ImageでReflectionを使う
動的に呼び出される可能性のあるクラスやメソッドのために、設定を記述してやる必要があります。
今回作成したサービスクラスに対して設定を記述すると以下のようになります。
}

reflection-config.jsonに、自動生成されたDBMetaのクラスを列挙すればいけるかも?
(forName()で使うだけならname属性(クラス名)だけでいいのかな???)

試しに手書きで動作確認してみると良いかと思います。
DBMetaInstanceHandlerのstaticイニシャライザーにDBMetaのクラスの一覧があるので、
うまく整形すればreflection-config.json作れるかと思います。

それで突破できるようであれば、DBFlute側でGraalVM向けのreflection-config.jsonを自動生成するとか...
(あと、そもそもここでのリフレクションを止めるオプションを追加するとか...)
何かしら対応できるかもしれません。







よし

unread,
Jul 9, 2024, 10:12:52 PM7/9/24
to DBFluteユーザの集い
よしです。

現状、まだうまく動いてはいないのですが、こんな状況です。

・reflection-config.jsonを作成する
こちらは作成したファイルをどこに配置するのかという部分がわからず断念しました。
ビルドのコマンドはMAVENのプラグインを使用した以下の形なのですが、この場合
-H:ReflectionConfigurationFilesというオプションの設定ができませんでした。

mvn -Pnative -DskipTests=true spring-boot:build-image -ntp

・RuntimeHintsRegistrarを使う
ほかに方法がないか調べたところ、カスタムヒントという機能がありました。

カスタムヒント
https://spring.pleiades.io/spring-boot/reference/packaging/native-image/advanced-topics.html#packaging.native-image.advanced.custom-hints
リフレクション、リソース、直列化、プロキシの使用などについて独自のヒントを提供する必要がある場合は、RuntimeHintsRegistrar API を使用できます。
RuntimeHintsRegistrar インターフェースを実装するクラスを作成し、提供された RuntimeHints インスタンスを適切に呼び出します。
}

でこちらを使ったサンプルプロジェクトもあり、こちらは問題なく動作しました。

AOT and Native with Spring Boot 3

使用している部分
@ImportRuntimeHints(DemoControllerRuntimeHints.class)
public class DemoController {
中略
else if (mode.equals("reflection")) {
String implementationName = Optional.ofNullable(getDefaultHelloServiceImplementation())
.orElse(SimpleHelloService.class.getName());
Class<?> implementationClass = ClassUtils.forName(implementationName, getClass().getClassLoader());
Method method = implementationClass.getMethod("sayHello", String.class);
Object instance = BeanUtils.instantiateClass(implementationClass);
return (String) ReflectionUtils.invokeMethod(method, instance, name);
}
中略
static class DemoControllerRuntimeHints implements RuntimeHintsRegistrar {

@Override
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
hints.reflection()
.registerConstructor(
SimpleHelloService.class.getConstructors()[0], ExecutableMode.INVOKE)
.registerMethod(ReflectionUtils.findMethod(
SimpleHelloService.class, "sayHello", String.class), ExecutableMode.INVOKE);
hints.resources().registerPattern("hello.txt");
}

}

こちらを参考に以下のカスタムヒントを追加してみました

    static class DbmetaRegistrar implements RuntimeHintsRegistrar {

        @Override
        public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
            try {
                hints
                        .reflection()
                        .registerMethod(
                                ReflectionUtils.findMethod(OwnerDbm.class, "getInstance", null),
                                ExecutableMode.INVOKE
                        );
            } catch (Exception e) {
                throw new RuntimeException(e);
                // ...
            }
        }
    }

自動生成されるreflect-config.jsonにも以下の設定が追加されました。

  {
    "name": "com.example.demo.infrastructure.dbflute.bsentity.dbmeta.OwnerDbm",
    "methods": [
      {
        "name": "getInstance",
        "parameterTypes": [ ]
      }
    ]
  },

ですが、やはり同じエラーになっている状況です。

2024-07-10T11:07:30.534+09:00 ERROR 13 --- [demo] [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: Could not initialize class com.example.demo.infrastructure.dbflute.bsentity.dbmeta.OwnerDbm] with root cause

2024年7月8日月曜日 17:01:38 UTC+9 jflute:

よし

unread,
Jul 10, 2024, 2:06:46 AM7/10/24
to DBFluteユーザの集い
よしです。

試しにですが、リフレクションを使わない形で以下のコードを入れてみたところ

        final OwnerDbm ownerDbm = OwnerDbm.getInstance();
        log.info(ownerDbm.getTableDbName());

同じエラーが発生しました。
リフレクションの問題ではないような感じです。




2024年7月10日水曜日 11:12:52 UTC+9 よし:

kubo

unread,
Jul 10, 2024, 2:11:58 AM7/10/24
to dbf...@googlegroups.com
よしさん、ありがとうございます。

>        final OwnerDbm ownerDbm = OwnerDbm.getInstance();
>        log.info(ownerDbm.getTableDbName());

もしかしたら内部の初期化で toDBMetaInstance() を使っちゃう場面があるかもなので、
そのメソッドにsysoutとか入れて実行されてないかどうか確認してみるとよいかと思います。

(エラー出てもスタックトレース出てこないんですね。。。ぐぬぬぬ)

よし

unread,
Jul 10, 2024, 2:39:28 AM7/10/24
to DBFluteユーザの集い
よしです。

>もしかしたら内部の初期化で toDBMetaInstance() を使っちゃう場面があるかもなので、
>そのメソッドにsysoutとか入れて実行されてないかどうか確認してみるとよいかと思います。

入れてみました。
ローカルで動かしてみた限りでは「 OwnerDbm.getInstance();」では、「toDBMetaInstance()」は
通らないようです。

>(エラー出てもスタックトレース出てこないんですね。。。ぐぬぬぬ)

あ、スタックトレースはでています。
全体はこんな感じです。
赤字部分がgetInstanceをしているところです

2024-07-10T14:15:55.244+09:00 ERROR 11 --- [demo] [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed:java.lang.NoClassDefFoundError: Could not initialize class com.example.demo.infrastructure.dbflute.bsentity.dbmeta.OwnerDbm] with root cause

java.lang.NoClassDefFoundError: Could not initialize class com.example.demo.infrastructure.dbflute.bsentity.dbmeta.OwnerDbm
at com.example.demo.presentation.api.home.Hello.home(Hello.java:67) ~[com.example.demo.DemoApplication:na]
at java...@17.0.11/java.lang.reflect.Method.invoke(Method.java:568) ~[com.example.demo.DemoApplication:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[com.example.demo.DemoApplication:6.1.10]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[com.example.demo.DemoApplication:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[com.example.demo.DemoApplication:6.1.10]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[com.example.demo.DemoApplication:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[na:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[com.example.demo.DemoApplication:10.1.25]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[na:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[com.example.demo.DemoApplication:6.1.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[na:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[com.example.demo.DemoApplication:6.1.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[na:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[com.example.demo.DemoApplication:6.1.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[com.example.demo.DemoApplication:6.1.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[na:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[na:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[na:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[com.example.demo.DemoApplication:10.1.25]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[na:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[com.example.demo.DemoApplication:10.1.25]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[na:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[na:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[na:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[com.example.demo.DemoApplication:10.1.25]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:904) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[na:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.demo.DemoApplication:10.1.25]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[na:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
at java...@17.0.11/java.lang.Thread.run(Thread.java:840) ~[com.example.demo.DemoApplication:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:915) ~[com.example.demo.DemoApplication:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:890) ~[com.example.demo.DemoApplication:na]

2024年7月10日水曜日 15:11:58 UTC+9 jflute:

kubo

unread,
Jul 10, 2024, 3:10:58 AM7/10/24
to dbf...@googlegroups.com
jfluteです

ふむなるほど、リフレクションはまた別の話かもですね。
(リフレクション部分が実行されたときにまた落ちるかもですが)

DBMetaクラスってシングルトンインスタンスで、staticイニシャライザーでnewされて、
コンストラクター領域で色々と処理をしていますから...
もしかしたらそこで落ちてて、でもそこでの例外は表に出ず、
初期化ができなかったということで java.lang.NoClassDefFoundError...
ってなってたらどうしようと想像しちゃいました。
(もしstatic初期化のエラーが)出てないとかだと厳しい...)

まあでも、普通のJava環境ですが、通常はstaticイニシャライザーでの例外もちゃんと呼び出し側に伝播はします。
java.lang.ExceptionInInitializerError: null
at org.docksidestage.unit.DemoTest.test_demo(DemoTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)


試行錯誤ではありますが、new MemberCB()とか、DBFluteの他のクラスをちょっと触るだけとか、
そのへんも色々とやってみると良いかと思います。(結局、Dbmに辿り着いて落ちちゃうかもですが)


一方で、スタックトレースありがとうございます。
おもしろいですね、graalvmのクラスから実行が始まる様子がわかりますね(^^。


よし

unread,
Jul 10, 2024, 3:20:06 AM7/10/24
to DBFluteユーザの集い
よしです。

jfluteさん、ありがとうございます。

とりあえずはOwnerDbmのソースを少しずつコメントアウトして、
どこでエラーが出なくなるかをちょっと見てみようかと思います。

進展ありましたら、またご報告します。

2024年7月10日水曜日 16:10:58 UTC+9 jflute:

kubo

unread,
Jul 10, 2024, 3:21:48 AM7/10/24
to dbf...@googlegroups.com
jfluteです。

> とりあえずはOwnerDbmのソースを少しずつコメントアウトして、

おお、ありがとうございます。
(ちょっと特殊な作りのクラスで申し訳ないですが...)

よし

unread,
Jul 11, 2024, 3:17:05 AM7/11/24
to DBFluteユーザの集い
よしです。

ひとまず、動くようになりました。

> とりあえずはOwnerDbmのソースを少しずつコメントアウトして、
これはうまくいかなかったのですが、「トレース・エージェント」という機能がありこれを使うことで、動作するようになりました。

トレース・エージェントを使用した構成支援

ネイティブ化していないjarを実行する際に-agentlibというオプションをつけて実行すると、各種ヒントファイルを作成してくれます。
ヒントファイルはsrc/main/resources/META-INF/native-imageに配置すると読み込んでくれるようです。

実行例:
java.exe  -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image/ -jar demo-0.0.1-SNAPSHOT.jar

まだ、ビヘイビアを1つ動かした段階なので、なにか課題が出てくるかもしれませんが、とりあえずこの機能を使って進めてみようと思います。



2024年7月10日水曜日 16:21:48 UTC+9 jflute:

kubo

unread,
Jul 11, 2024, 3:53:55 AM7/11/24
to dbf...@googlegroups.com
jfluteです。

おおぉ、なるほど、トレース・エージェントというものが用意されてるんですね。
「通常のJava VMでの実行のすべての動的機能の使用状況を追跡するエージェント」

LoadReferrerがリフレクションをある程度使っているので、
そこを突破できるかどうか?がポイントな気がします。


よし

unread,
Jul 12, 2024, 3:58:15 AM7/12/24
to DBFluteユーザの集い
よしです。

>LoadReferrerがリフレクションをある程度使っているので、
>そこを突破できるかどうか?がポイントな気がします

LoadReferrerも動きました!

以下の簡単なコードですが、問題なく動いています。

        final ListResultBean<Shipment> shipments = shipmentBhv.selectList(cb
                -> cb.query().addOrderBy_Id_Asc()
        );
        shipmentBhv.loadReservation(shipments,reservationCB -> {
            reservationCB.query().addOrderBy_Id_Asc();
        });



2024年7月11日木曜日 16:53:55 UTC+9 jflute:

kubo

unread,
Jul 12, 2024, 4:00:21 AM7/12/24
to dbf...@googlegroups.com
jfluteです。

おおぉー、LoadReferrer動きましたか。ありがとうございます。

本当にトレース・エージェントがポイントなんですね。
何か副作用があるのか気になりますが、とりあえず良かったという感じで。

よし

unread,
Jul 12, 2024, 4:09:12 AM7/12/24
to DBFluteユーザの集い
よしです。

>何か副作用があるのか気になりますが、とりあえず良かったという感じで。

一度アプリケーションを実行して対象のコードを動かさないといけないのが難点ですね。。

動かすのが漏れてエラーになるとか、ありそうです。

また、何かありましたら投稿します。

ありがとうございました。

2024年7月12日金曜日 17:00:21 UTC+9 jflute:

kubo

unread,
Jul 12, 2024, 8:19:13 AM7/12/24
to dbf...@googlegroups.com
jfluteです。

よしさん、ありがとうございます。
なるほど、実行させることで覚えさせるみたいな感じなんですね。
ぜひ、注目したいので何かありましたら情報共有頂けると嬉しいです。

一方で、Quarkus の example の方は着々進んでいます。
最低限のexampleコードしかないですが、動作する状態まで来たようです。
(Google Guice連携バージョンですが)

※協力してくれているmiyasamaに感謝感謝

よし

unread,
Jul 17, 2024, 4:09:48 AM7/17/24
to DBFluteユーザの集い
よしです。

簡単なCRUD機能のあるアプリケーションに組み込んでみました。
とりあえず問題なく動いています。

>なるほど、実行させることで覚えさせるみたいな感じなんですね。
実際、検索条件なしで画面動かして設定ファイル作った場合、検索条件つけて実行するとエラーになりました。

ただ、ユニットテストでも、オプション付けて実行すると設定ファイルを作ってくれましたので、
テストがソースを網羅していれば大体はそれでいけるかもしれません。

ちなみに起動時間は16秒が8秒に短縮されていました。

>一方で、Quarkus の example の方は着々進んでいます。
>最低限のexampleコードしかないですが、動作する状態まで来たようです。

ありがとうございます。
参考にさせていただきます。

2024年7月12日金曜日 21:19:13 UTC+9 jflute:

kubo

unread,
Jul 17, 2024, 5:28:49 AM7/17/24
to dbf...@googlegroups.com
jfluteです。

おお、よしさん、ありがとうございます。
> ただ、ユニットテストでも、オプション付けて実行すると設定ファイルを作ってくれましたので、
> テストがソースを網羅していれば大体はそれでいけるかもしれません。

なんかこれはこれでおもしろいですね。学習AIみたいな感じで(^^


> ちなみに起動時間は16秒が8秒に短縮されていました。

おおぉ。
これって、普通のVMで起動したSpringBootと、GraalVMで起動したSpringBootを比較してってことでしょうか?





よし

unread,
Jul 17, 2024, 11:58:31 PM7/17/24
to DBFluteユーザの集い
よしです。

>これって、普通のVMで起動したSpringBootと、GraalVMで起動したSpringBootを比較してってことでしょうか?
はい、そうです。
いま、AWSのlambdaで動かすテストをしていて、そこで動かしたときの通常VMとGraalVMの差です。

ちなみにAWSのlambdaにはSnapStartという機能があって、そちらを使うと1~2秒で処理が終わるので、
Lambdaの場合はSnapStartを使った方がいいなという感じです。
SnapStart:Javaの初期化が終わったタイミングのイメージを保存して、初期化済みの状態から起動する機能。

コンテナで動かす場合はGraalVMを使うとよさそうですね。


2024年7月17日水曜日 18:28:49 UTC+9 jflute:

よし

unread,
Jul 18, 2024, 4:12:43 AM7/18/24
to DBFluteユーザの集い
よしです。


>一方で、Quarkus の example の方は着々進んでいます。
>最低限のexampleコードしかないですが、動作する状態まで来たようです。

ソースのreadmeを見させていただきました。
リフレクションを使用しているためNative Imageのビルドはできないようです。

Quarkus利用の目的がNative Imageのビルドでしたので、対応方法がないのか見てみましたところ
Springのときと同じくreflect-config.jsonを作らないといけないようですね。。

ネイティブ・アプリケーションを作成するためのヒント
https://ja.quarkus.io/guides/writing-native-applications-tips#using-a-configuration-file-2

とりあえず、作成していただいたサンプルをNative化できるかやってみようと思います。

2024年7月18日木曜日 12:58:31 UTC+9 よし:

kubo

unread,
Jul 18, 2024, 6:39:54 AM7/18/24
to dbf...@googlegroups.com
jfluteです。

よしさん、ありがとうございます!

> いま、AWSのlambdaで動かすテストをしていて、そこで動かしたときの通常VMとGraalVMの差です。

おおぉ、そういうことだったんですね。
SpringBootの起動が早くなるってのは大きいですねー。

SnapStartも勉強になります、ありがとうございます。


> とりあえず、作成していただいたサンプルをNative化できるかやってみようと思います。

ありがとうございます!

Reply all
Reply to author
Forward
0 new messages