Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

io.quarkus.builder.ChainBuildException: Cycle detected #860

Closed
guitcastro opened this issue May 2, 2023 · 16 comments · Fixed by #963
Closed

io.quarkus.builder.ChainBuildException: Cycle detected #860

guitcastro opened this issue May 2, 2023 · 16 comments · Fixed by #963
Milestone

Comments

@guitcastro
Copy link

Hello, I am trying to add the extension on a new project (ext version version 2.0.1 and quarkus 3.0.1-Final). The code is generated but the build fail with:

Execution failed for task ':infrastructure:quarkusAppPartsBuild'.

There was a failure while executing work items
A failure occurred while executing io.quarkus.gradle.tasks.worker.BuildWorker
> io.quarkus.builder.ChainBuildException: Cycle detected:
io.quarkiverse.cxf.deployment.CxfClientProcessor#collectClients produced class io.quarkiverse.cxf.deployment.ClientSeiBuildItem
to io.quarkiverse.cxf.deployment.QuarkusCxfProcessor#generateClasses produced class io.quarkus.arc.deployment.GeneratedBeanBuildItem
to io.quarkus.arc.deployment.BeanArchiveProcessor#build produced class io.quarkus.arc.deployment.BeanArchiveIndexBuildItem
to io.quarkus.arc.deployment.LookupConditionsProcessor#suppressConditionsGenerators produced class io.quarkus.arc.deployment.SuppressConditionGeneratorBuildItem
to io.quarkus.arc.deployment.ArcProcessor#initialize produced class io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem
to io.quarkus.arc.deployment.ArcProcessor#registerBeans produced class io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem
to io.quarkus.vertx.deployment.VertxProcessor#collectEventConsumers produced class io.quarkus.vertx.deployment.EventConsumerBusinessMethodItem
to io.quarkus.vertx.deployment.VertxProcessor#build produced class io.quarkus.vertx.deployment.VertxBuildItem
to io.quarkus.reactive.pg.client.deployment.ReactivePgClientProcessor#build produced class io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem
to io.quarkus.deployment.steps.NativeImageConfigBuildStep#build produced class io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem
to io.quarkiverse.cxf.deployment.CxfClientProcessor#collectClients

@ghermaniov
Copy link

ghermaniov commented May 3, 2023

Hi,

I am having the same issue (ext version version 2.0.2 and quarkus 3.0.1-Final). This is my stack trace:

Cycle detected: io.quarkus.arc.deployment.ArcProcessor#registerBeans produced class io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem to io.quarkus.amazon.s3.deployment.S3Processor#discover produced class io.quarkus.amazon.common.deployment.RequireAmazonClientBuildItem to io.quarkus.amazon.s3.deployment.S3Processor#setup produced class io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem to io.quarkus.deployment.steps.NativeImageConfigBuildStep#build produced class io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem to io.quarkiverse.cxf.deployment.CxfClientProcessor#collectClients produced class io.quarkiverse.cxf.deployment.ClientSeiBuildItem to io.quarkiverse.cxf.deployment.QuarkusCxfProcessor#generateClasses produced class io.quarkus.arc.deployment.GeneratedBeanBuildItem to io.quarkus.arc.deployment.BeanArchiveProcessor#build produced class io.quarkus.arc.deployment.BeanArchiveIndexBuildItem to io.quarkus.arc.deployment.AutoInjectFieldProcessor#autoInjectQualifiers produced class io.quarkus.arc.deployment.AutoInjectAnnotationBuildItem to io.quarkus.arc.deployment.AutoAddScopeProcessor#annotationTransformer produced class io.quarkus.arc.deployment.AnnotationsTransformerBuildItem to io.quarkus.arc.deployment.ArcProcessor#initialize produced class io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem to io.quarkus.undertow.deployment.UndertowBuildStep#registerContext produced class io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem$ContextConfiguratorBuildItem to io.quarkus.arc.deployment.ArcProcessor#registerBeans

@ppalaga
Copy link
Contributor

ppalaga commented May 3, 2023

Is this just an empty project with no Java code? Could you please paste your pom.xml?

@guitcastro
Copy link
Author

@ppalaga No it's a gradle project with kotlin code.

The build.gradle.kts:


plugins {
    id("org.jetbrains.kotlin.plugin.allopen").version("1.8.20")
    id ("org.kordamp.gradle.jandex") version "0.12.0"
    id("io.quarkus")
    id ("java-test-fixtures")
}

repositories {
    mavenCentral()
}

allOpen {
    annotation("jakarta.ws.rs.Path")
    annotation("jakarta.persistence.Entity")
}

tasks.quarkusDependenciesBuild {
    dependsOn("jandex")
}

tasks.compileTestKotlin {
    dependsOn("jandex")
}

tasks.jacocoTestReport {
    dependsOn("jandex")
}

dependencies {
    implementation("io.quarkiverse.cxf:quarkus-cxf:2.0.2")
    implementation(project(":domain"))

    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")

    implementation("io.quarkus:quarkus-liquibase")
    implementation("io.quarkus:quarkus-jdbc-postgresql")

    implementation("com.sun.xml.ws:rt:4.0.1")
    implementation("io.quarkus:quarkus-reactive-pg-client")
    implementation("io.vertx:vertx-lang-kotlin-coroutines:4.4.0")
    implementation("org.ufoss.kotysa:kotysa-vertx-sqlclient:2.4.0")
    implementation("io.smallrye.reactive:mutiny-kotlin:2.2.0")

    val quarkusPlatformGroupId: String by project
    val quarkusPlatformArtifactId: String by project
    val quarkusPlatformVersion: String by project
    implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
    
    testImplementation("io.quarkus:quarkus-junit5")
    testImplementation("io.quarkus:quarkus-jdbc-h2")

    testFixturesApi(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
    testFixturesApi("io.quarkus:quarkus-test-common")
    testFixturesApi("org.testcontainers:cockroachdb:1.17.6")
    testFixturesApi("com.github.tomakehurst:wiremock:2.27.2")
}

@ppalaga
Copy link
Contributor

ppalaga commented May 3, 2023

project with kotlin code

So there is some code. Could you please post some minimal reproducer then?

@guitcastro
Copy link
Author

@ppalaga Sure, here is it. I have find out that the error occurs if I add the implementation("io.quarkus:quarkus-reactive-pg-client").

So if you clone the repository and comment implementation("io.quarkus:quarkus-reactive-pg-client") in the infrascture module it will compile. If you leave, it will fail

@patr1kt0th
Copy link

Hi guys. Same here, just with Maven and version 2.0.2 of quarkus-cxf and 3.0.2-Final of quarkus. My stack trace:

2023-05-05 18:01:33,859 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.ChainBuildException: Cycle detected:
		   io.quarkus.arc.deployment.BeanArchiveProcessor#build produced class io.quarkus.arc.deployment.BeanArchiveIndexBuildItem
		to io.quarkus.arc.deployment.AutoProducerMethodsProcessor#annotationTransformer produced class io.quarkus.arc.deployment.AnnotationsTransformerBuildItem
		to io.quarkus.arc.deployment.ArcProcessor#initialize produced class io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem
		to io.quarkus.arc.deployment.ArcProcessor#registerBeans produced class io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem
		to io.quarkus.amazon.s3.deployment.S3Processor#discover produced class io.quarkus.amazon.common.deployment.RequireAmazonClientBuildItem
		to io.quarkus.amazon.s3.deployment.S3Processor#setup produced class io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem
		to io.quarkus.deployment.steps.NativeImageConfigBuildStep#build produced class io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem
		to io.quarkiverse.cxf.deployment.CxfClientProcessor#collectClients produced class io.quarkiverse.cxf.deployment.CxfClientBuildItem
		to io.quarkiverse.cxf.deployment.CxfClientProcessor#generateClientProducers produced class io.quarkus.arc.deployment.GeneratedBeanBuildItem
		to io.quarkus.arc.deployment.BeanArchiveProcessor#build
	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:335)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:86)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:447)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:59)
	at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:149)
	at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:104)
	at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
	at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.ChainBuildException: Cycle detected:
		   io.quarkus.arc.deployment.BeanArchiveProcessor#build produced class io.quarkus.arc.deployment.BeanArchiveIndexBuildItem
		to io.quarkus.arc.deployment.AutoProducerMethodsProcessor#annotationTransformer produced class io.quarkus.arc.deployment.AnnotationsTransformerBuildItem
		to io.quarkus.arc.deployment.ArcProcessor#initialize produced class io.quarkus.arc.deployment.ContextRegistrationPhaseBuildItem
		to io.quarkus.arc.deployment.ArcProcessor#registerBeans produced class io.quarkus.arc.deployment.BeanRegistrationPhaseBuildItem
		to io.quarkus.amazon.s3.deployment.S3Processor#discover produced class io.quarkus.amazon.common.deployment.RequireAmazonClientBuildItem
		to io.quarkus.amazon.s3.deployment.S3Processor#setup produced class io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem
		to io.quarkus.deployment.steps.NativeImageConfigBuildStep#build produced class io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem
		to io.quarkiverse.cxf.deployment.CxfClientProcessor#collectClients produced class io.quarkiverse.cxf.deployment.CxfClientBuildItem
		to io.quarkiverse.cxf.deployment.CxfClientProcessor#generateClientProducers produced class io.quarkus.arc.deployment.GeneratedBeanBuildItem
		to io.quarkus.arc.deployment.BeanArchiveProcessor#build
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:375)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheckProduce(BuildChainBuilder.java:348)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:379)
	at io.quarkus.builder.BuildChainBuilder.cycleCheck(BuildChainBuilder.java:339)
	at io.quarkus.builder.BuildChainBuilder.build(BuildChainBuilder.java:249)
	at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:142)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:331)
	... 9 more

And here's my list of extensions (I noticed a missing * before quarkus-cxf, but no idea what it means and why it's missing):

✬ ArtifactId                                         Extension Name
✬ quarkus-amazon-s3                                  Amazon S3
✬ quarkus-container-image-jib                        Container Image Jib
  quarkus-cxf                                        Quarkus CXF
✬ quarkus-micrometer-registry-prometheus             Micrometer Registry Prometheus
✬ quarkus-qute                                       Qute
✬ quarkus-rest-client-reactive                       REST Client Reactive
✬ quarkus-resteasy-reactive-jackson                  RESTEasy Reactive Jackson
✬ quarkus-smallrye-fault-tolerance                   SmallRye Fault Tolerance
✬ quarkus-smallrye-health                            SmallRye Health
✬ quarkus-smallrye-openapi                           SmallRye OpenAPI
✬ quarkus-smallrye-opentracing                       SmallRye OpenTracing
✬ quarkus-smallrye-reactive-messaging-kafka          SmallRye Reactive Messaging - Kafka Connector

After I comment out the quarkus-cxf dependency, everything works fine.

@patr1kt0th
Copy link

Hm, I just figured out, that after I remove the quarkus-amazon-s3 and url-connection-client dependencies, my project starts fine with quarkus-cxf. So for me, it currently looks like quarkus-cxf and quarkus-amazon-s3 (or url-connection-client) are not playing along well.

@ghermaniov based on your stack trace you're also using S3, right? If so, did you try to remove it?

@shumonsharif
Copy link
Contributor

@ppalaga The patch below addresses the cyclic dependency issues being described.

However, I'm not familiar enough with the Proxy related changes that were added, and I couldn't find any test cases covering them, so not entirely sure if this is the ideal solution.

Index: extensions/core/deployment/src/main/java/io/quarkiverse/cxf/deployment/CxfClientProcessor.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/extensions/core/deployment/src/main/java/io/quarkiverse/cxf/deployment/CxfClientProcessor.java b/extensions/core/deployment/src/main/java/io/quarkiverse/cxf/deployment/CxfClientProcessor.java
--- a/extensions/core/deployment/src/main/java/io/quarkiverse/cxf/deployment/CxfClientProcessor.java	(revision 46033d79fc3d689407642ed65f6087a0ff5414f1)
+++ b/extensions/core/deployment/src/main/java/io/quarkiverse/cxf/deployment/CxfClientProcessor.java	(date 1683479821733)
@@ -54,7 +54,6 @@
 import io.quarkus.deployment.builditem.NativeImageFeatureBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem;
 import io.quarkus.deployment.util.IoUtil;
 import io.quarkus.gizmo.ClassCreator;
@@ -75,7 +74,6 @@
     void collectClients(
             CxfFixedConfig config,
             CombinedIndexBuildItem combinedIndexBuildItem,
-            List<RuntimeInitializedClassBuildItem> runtimeInitializedClasses,
             List<RuntimeInitializedPackageBuildItem> runtimeInitializedPackages,
             BuildProducer<NativeImageFeatureBuildItem> nativeImageFeatures,
             BuildProducer<NativeImageProxyDefinitionBuildItem> proxies,
@@ -83,9 +81,6 @@
             BuildProducer<ClientSeiBuildItem> clientSeis) {
         IndexView index = combinedIndexBuildItem.getIndex();
 
-        final Set<String> rtInitClasses = runtimeInitializedClasses.stream()
-                .map(RuntimeInitializedClassBuildItem::getClassName)
-                .collect(Collectors.toSet());
         final Set<String> rtInitPackages = runtimeInitializedPackages.stream()
                 .map(RuntimeInitializedPackageBuildItem::getPackageName)
                 .collect(Collectors.toSet());
@@ -121,7 +116,6 @@
                                 Optional.ofNullable(clientConfig.native_).map(native_ -> native_.runtimeInitialized)
                                         .orElse(false),
                                 wsClassInfo,
-                                rtInitClasses,
                                 rtInitPackages,
                                 index);
                         proxies.produce(new NativeImageProxyDefinitionBuildItem(proxyInfo.interfaces));
@@ -469,7 +463,6 @@
         public static ProxyInfo of(
                 boolean refersToRuntimeInitializedClasses,
                 ClassInfo wsClassInfo,
-                Set<String> rtInitClasses,
                 Set<String> rtInitPackages,
                 IndexView index) {
             final List<String> result = new ArrayList<>();
@@ -480,8 +473,7 @@
 
             if (!refersToRuntimeInitializedClasses) {
                 /* Try to auto-detect unless the user decided himself */
-                Predicate<String> isRuntimeInitializedClass = className -> rtInitClasses.contains(className)
-                        || rtInitPackages.contains(getPackage(className));
+                Predicate<String> isRuntimeInitializedClass = className -> rtInitPackages.contains(getPackage(className));
                 refersToRuntimeInitializedClasses = refersToRuntimeInitializedClasses(
                         wsClassInfo,
                         isRuntimeInitializedClass,

@ppalaga
Copy link
Contributor

ppalaga commented May 8, 2023

Thanks for the investigation, @shumonsharif! This proxy juggling was added to solve #580 The idea is to try to figure out automatically whether the the SEI method signatures refer to any class that requires runtime initialization and if so, then add a special package-visible interface to the proxy and register that package for late initialization. That was the most viable strategy how I could move GraalVM towards making the generated proxy class runtime initialized.

There are two tests supposed to cover this:

  • io.quarkiverse.cxf.client.it.CxfClientTest.clientWithRuntimeInitializedPayload()
  • io.quarkiverse.cxf.it.ws.mtom.awt.server.MtomAwtTest

As it happens none of them actually covers the case that the SEI method refers a class registered for postponed init through RuntimeInitializedClassBuildItem. clientWithRuntimeInitializedPayload relies on appilcation.propeties config

quarkus.cxf.client.clientWithRuntimeInitializedPayload.native.runtime-initialized = true
quarkus.native.additional-build-args=--initialize-at-run-time=io.quarkiverse.cxf.client.it.rtinit.Operands\\,io.quarkiverse.cxf.client.it.rtinit.Result

whereas MtomAwtTest covers the RuntimeInitializedPackageBuildItem.
So a test for this case is missing.

I'd need to ponder a bit on what we should do.

@scrocquesel
Copy link
Member

@knuspertante can you try with this branch ?

@knuspertante
Copy link

Hey @scrocquesel,

yes the build and test works fine with your branch! Thanks for your effort and amazing work!

@scrocquesel
Copy link
Member

Hey @scrocquesel,

yes the build and test works fine with your branch! Thanks for your effort and amazing work!

Good to know, I'll make a release soon.

@scrocquesel
Copy link
Member

Hey @scrocquesel,
yes the build and test works fine with your branch! Thanks for your effort and amazing work!

Good to know, I'll make a release soon.

@knuspertante quarkus-amazon-service 2.3.1 is out. This will fix the cycle when using cfx with aws extension.

@ppalaga If the cycle cannot be easily broken in the CXF extension, here is my understanding of the cycle created when using CXF with amazon-service or reactive-pg-client:

The issue arises when other extensions emit ExtensionSslNativeSupportBuildItem as part of a BuildStep that directly or indirectly consumes GeneratedBeanBuildItem. This often happens because they rely on BeanRegistrationPhaseBuildItem to discover injection points of certain proxy instances and emit ExtensionSslNativeSupportBuildItem as part of the same build step to avoid having one small build step.

The problem with the CXF extension occurs because it emits GeneratedBeanBuildItem as part of a build steps chain that consumes RuntimeInitializedClassBuildItem. The cycle lies in NativeImageConfigBuildStep which consume ExtensionSslNativeSupportBuildItem and emit RuntimeInitializedClassBuildItem.

I believe the easiest is to break the cycle in this build step.

https://github.com/quarkusio/quarkus/blob/5c2df5112331ef170c0b0ad83c84c6f853c2d5d6/core/deployment/src/main/java/io/quarkus/deployment/steps/NativeImageConfigBuildStep.java#L37

To resolve this, it may be beneficial to split this build step into two separate build steps: one for List extensionSslNativeSupport and another for BuildProducer runtimeInit, BuildProducer runtimeReinit.

Alternatively, in order to break the cycle when used with reactive-pg-client, you can request Quarkus core to move emission of ExtensionSslNativeSupportBuildItem to a separate build step. But it is not very pratical.

https://github.com/quarkusio/quarkus/blob/5c2df5112331ef170c0b0ad83c84c6f853c2d5d6/extensions/reactive-pg-client/deployment/src/main/java/io/quarkus/reactive/pg/client/deployment/ReactivePgClientProcessor.java#L108

We maybe re-open quarkusio/quarkus#33955.

@dufoli
Copy link
Contributor

dufoli commented Jun 14, 2023

great analyze.
here are the cxf chain of build item:

GeneratedBeanBuildItem
    ServiceSeiBuildItem
        CombinedIndexBuildItem
    ClientSeiBuildItem
        RuntimeInitializedPackageBuildItem
        RuntimeInitializedClassBuildItem
        CombinedIndexBuildItem
        CxfFixedConfig
    CxfBusBuildItem.
   CxfClientBuildItem
        RuntimeInitializedPackageBuildItem
        RuntimeInitializedClassBuildItem
        CombinedIndexBuildItem
        CxfFixedConfig

and java2wsdl consume GeneratedBeanBuildItem produce GeneratedResourceBuildItem

so I think we can split CxfClientProcessor.collectClients in 2 build step.
For that we will need to split CxfClientBuildItem in 2 parts. one for generateClientProducers on GeneratedBeanBuildItem without proxy and one build item for proxy runtime initialized item.

@ppalaga
Copy link
Contributor

ppalaga commented Aug 15, 2023

Sorry for the delay. After thorough pondering about the root cause and the proposed fixes, I am for fixing the issue in the following way:

  • We will stop trying to autodetect whether a SEI references a runtime initialized class thus avoiding the "cycle detected" failures.
  • The only way how to make such SEIs work will be adding quarkus.cxf.client.myClient.native.runtime-initialized = true to application.properties. This option exists already as a fall-back for cases uncovered by the imperfect auto-detection.
  • I'd prefer avoiding to use -H:+UseNewExperimentalClassInitialization for now, while Quarkus CXF and Quarkus are not properly tested with the option enabled. I'd vote for starting to use it once it becomes default in GraalVM used by Quarkus. After that we can deprecate and remove quarkus.cxf.client.myClient.native.runtime-initialized

What do others think?

@shumonsharif
Copy link
Contributor

What do others think?

Sounds like a very good approach to me - thanks @ppalaga ! Hopefully soon enough the experimental flag will become default.

ppalaga added a commit to ppalaga/quarkus-cxf that referenced this issue Aug 17, 2023
@ppalaga ppalaga added this to the 2.2.2 milestone Sep 20, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants