Skip to content

QuarkusUnitTest: JAXB class loaded twice using two different class loaders if it is both the return type and an argument of a service method #2010

@ppalaga

Description

@ppalaga

There is a reproducer in https://github.com/ppalaga/quarkus-cxf/commits/i2010/

Steps to reproduce:

git clone https://github.com/ppalaga/quarkus-cxf.git
cd quarkus-cxf
git checkout i2010

# build all
mvnd clean install -DskipTests -Dquarkus.build.skip

# run the failing test
cd extensions/core/deployment
mvnd clean test -Dtest=IncludesConflictJava2WsTest
...

[INFO] Running io.quarkiverse.cxf.deployment.java2ws.IncludesConflictJava2WsTest
[INFO] [stdout] 2026-01-19 13:59:04,596 INFO  [io.quarkiverse.cxf.deployment.Java2WsdlProcessor] (build-13) Running java2ws -wsdl -o /home/ppalaga/orgs/cxf/qcxf/extensions/core/deployment/target/java2ws/IncludesConflictJava2WsTest/FruitWebService.wsdl io.quarkiverse.cxf.deployment.test.FruitWebService
[WARNING] [stderr] Error: java.lang.RuntimeException: org.apache.cxf.service.factory.ServiceConstructionException
[WARNING] [stderr] 
[WARNING] [stderr] Use the verbose setting to show the stacktrace of this error
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.653 s <<< FAILURE! -- in io.quarkiverse.cxf.deployment.java2ws.IncludesConflictJava2WsTest
[ERROR] io.quarkiverse.cxf.deployment.java2ws.IncludesConflictJava2WsTest -- Time elapsed: 2.653 s <<< FAILURE!
java.lang.AssertionError: 

Expecting actual throwable to be an instance of:
  java.lang.IllegalStateException
but was:
  java.lang.RuntimeException: Could not run java2ws -wsdl -o /home/ppalaga/orgs/cxf/qcxf/extensions/core/deployment/target/java2ws/IncludesConflictJava2WsTest/FruitWebService.wsdl io.quarkiverse.cxf.deployment.test.FruitWebService
        at io.quarkiverse.cxf.deployment.Java2WsdlProcessor.java2wsdl(Java2WsdlProcessor.java:147)
        at io.quarkiverse.cxf.deployment.Java2WsdlProcessor.java2wsdl(Java2WsdlProcessor.java:91)
        at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
        at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:898)
        at io.quarkus.builder.BuildContext.run(BuildContext.java:255)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
        at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
        at java.base/java.lang.Thread.run(Thread.java:1583)
        at org.jboss.threads.JBossThread.run(JBossThread.java:501)
Caused by: org.apache.cxf.tools.common.ToolException: org.apache.cxf.service.factory.ServiceConstructionException
        at org.apache.cxf.tools.java2ws.JavaToWSContainer.execute(JavaToWSContainer.java:107)
        at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:105)
        at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:58)
        at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:40)
        at org.apache.cxf.tools.java2ws.JavaToWS.run(JavaToWS.java:79)
        at io.quarkiverse.cxf.deployment.Java2WsdlProcessor.java2wsdl(Java2WsdlProcessor.java:144)
        ... 11 more
Caused by: org.apache.cxf.service.factory.ServiceConstructionException
        at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:360)
        at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:87)
        at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:469)
        at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:693)
        at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:529)
        at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:262)
        at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199)
        at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:103)
        at org.apache.cxf.frontend.AbstractServiceFactory.createService(AbstractServiceFactory.java:78)
        at org.apache.cxf.tools.java2wsdl.processor.JavaToWSDLProcessor.process(JavaToWSDLProcessor.java:102)
        at org.apache.cxf.tools.java2ws.JavaToWSContainer.processWSDL(JavaToWSContainer.java:116)
        at org.apache.cxf.tools.java2ws.JavaToWSContainer.execute(JavaToWSContainer.java:81)
        ... 16 more
Caused by: org.glassfish.jaxb.runtime.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://test.deployment.cxf.quarkiverse.io/}Fruit". Use @XmlType.name and @XmlType.namespace to assign different names to them.
        this problem is related to the following location:
                at io.quarkiverse.cxf.deployment.test.Fruit
                at protected io.quarkiverse.cxf.deployment.test.Fruit io.quarkiverse.cxf.deployment.test.Add.fruit
                at io.quarkiverse.cxf.deployment.test.Add
        this problem is related to the following location:
                at io.quarkiverse.cxf.deployment.test.Fruit
                at private java.util.Set io.quarkiverse.cxf.deployment.test.jaxws_asm.fruitwebservice.AddResponse._return
                at io.quarkiverse.cxf.deployment.test.jaxws_asm.fruitwebservice.AddResponse

        at org.glassfish.jaxb.runtime.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:83)
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:421)
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:255)
        at org.glassfish.jaxb.runtime.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1115)
        at org.glassfish.jaxb.runtime.v2.ContextFactory.createContext(ContextFactory.java:144)
        at org.glassfish.jaxb.runtime.v2.JAXBContextFactory.createContext(JAXBContextFactory.java:44)
        at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:366)
        at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605)
        at org.apache.cxf.common.jaxb.JAXBUtils$3.run(JAXBUtils.java:1187)
        at org.apache.cxf.common.jaxb.JAXBUtils$3.run(JAXBUtils.java:1185)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:571)
        at org.apache.cxf.common.jaxb.JAXBUtils.createContext(JAXBUtils.java:1185)
        at org.apache.cxf.common.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:325)
        at org.apache.cxf.common.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:242)
        at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:499)
        at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:358)
        ... 27 more

        at io.quarkiverse.cxf.deployment.java2ws.IncludesConflictJava2WsTest.lambda$static$1(IncludesConflictJava2WsTest.java:41)

Note that the test passes when the last commit in branch i2010 is reverted

Also note that the same scenario works flawlessly, it it is run directly using Maven, i.e. not via QuarkusUnitTest.

When debugging, one can see that one io.quarkiverse.cxf.deployment.test.Fruit is loaded using the tests class loader and the other one using application class loader.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions