Quarkusへの対応

26 views
Skip to first unread message

よし

unread,
Jun 12, 2024, 5:01:42 AMJun 12
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 AM (9 days ago) Jun 29
to dbf...@googlegroups.com
jfluteです。

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

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

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





Message has been deleted

よし

unread,
Jul 3, 2024, 11:50:36 PM (5 days ago) Jul 3
to DBFluteユーザの集い
jfluteさん、こんにちは。

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

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

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

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

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

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

よし

unread,
Jul 4, 2024, 12:06:48 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (5 days ago) Jul 4
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 AM (4 days ago) Jul 4
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 AM (4 days ago) Jul 4
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 AM (4 days ago) Jul 4
to DBFluteユーザの集い
よしです。

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

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

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

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

kubo

unread,
Jul 4, 2024, 6:18:47 AM (4 days ago) Jul 4
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,
3:45 AM (11 hours ago) 3:45 AM
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,
4:01 AM (10 hours ago) 4:01 AM
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を自動生成するとか...
(あと、そもそもここでのリフレクションを止めるオプションを追加するとか...)
何かしら対応できるかもしれません。







Reply all
Reply to author
Forward
0 new messages