kubernetes-client icon indicating copy to clipboard operation
kubernetes-client copied to clipboard

Java generator from CRD: class not found in quarkus when enabling extraAnnotations

Open spike83 opened this issue 10 months ago • 15 comments

Describe the bug

When generating Java classes from CRD within Quarkus I get ClassNotFound Exceptions.

I was playing around with annotation processing settings but nothing helped.

Every time I enable the extraAnnotations I get exceptions when executing. It is also taking way longer to generate and I even generates the class io/fabric8/kubernetes/api/model/ObjectMetaBuilder that was not found in the target folder.

Fabric8 Kubernetes Client version

7.0.0, 6.13.14

Steps to reproduce

POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>test</groupId>
    <artifactId>test-component</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <compiler-plugin.version>3.13.0</compiler-plugin.version>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
        <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
        <quarkus.platform.version>3.17.3</quarkus.platform.version>
        <kubernetes-client.version>7.0.0</kubernetes-client.version>
        <sundrio.version>0.200.0</sundrio.version>
        <lombok.version>1.18.36</lombok.version>

        <skipITs>true</skipITs>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>${quarkus.platform.artifact-id}</artifactId>
                <version>${quarkus.platform.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-kubernetes-client</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
         <!-- extraAnnotations requires these additional dependencies -->
        <dependency>
          <groupId>io.sundr</groupId>
          <artifactId>builder-annotations</artifactId>
          <version>${sundrio.version}</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>${lombok.version}</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>io.fabric8</groupId>
            <artifactId>generator-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-junit5</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>${quarkus.platform.group-id}</groupId>
                <artifactId>quarkus-maven-plugin</artifactId>
                <version>${quarkus.platform.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                            <goal>generate-code</goal>
                            <goal>generate-code-tests</goal>
                            <goal>native-image-agent</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <parameters>true</parameters>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>io.sundr</groupId>
                            <artifactId>builder-annotations</artifactId>
                            <version>${sundrio.version}</version>
                        </path>
                        <path>
                            <groupId>io.fabric8</groupId>
                            <artifactId>generator-annotations</artifactId>
                            <version>${kubernetes-client.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>java-generator-maven-plugin</artifactId>
                <version>${kubernetes-client.version}</version>
                <configuration>
                    <source>${project.basedir}/test-crd.yaml</source>
                    <alwaysPreserveUnknown>true</alwaysPreserveUnknown>
                    <extraAnnotations>true</extraAnnotations>
                    <generatedAnnotations>true</generatedAnnotations>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            
        </plugins>
    </build>
</project>

test-crd.yaml: I took one of the PrinterColmn from the tests. But it doesn't matter.

src/test/java/MyTest.java:

import org.junit.jupiter.api.Test;

import io.fabric8.kubernetes.client.KubernetesClient;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;

@QuarkusTest
public class MyTest {
    @Inject
    private KubernetesClient kubernetesClient;
    
    @Test
    public void test() {
        System.out.println("pod list:");
        var pods = this.kubernetesClient.pods().list();
        pods.getItems().forEach(pod -> {
            System.out.println(pod.getMetadata().getName());
        });
    }
}

mvn clean test

This causes

13:34:40,619 [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 18.49 s <<< FAILURE! -- in MyTest
13:34:40,620 [ERROR] MyTest.test -- Time elapsed: 1.204 s <<< ERROR!
io.fabric8.kubernetes.client.KubernetesClientException: io/fabric8/kubernetes/api/model/ObjectMetaBuilder
        at io.fabric8.kubernetes.client.dsl.internal.OperationSupport.waitForResult(OperationSupport.java:509)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.list(BaseOperation.java:451)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.list(BaseOperation.java:419)
        at io.fabric8.kubernetes.client.dsl.internal.BaseOperation.list(BaseOperation.java:98)
        at MyTest.test(MyTest.java:15)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:967)
        at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:817)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.lang.NoClassDefFoundError: io/fabric8/kubernetes/api/model/ObjectMetaBuilder
        at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
        at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578)
        at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676)
        at com.fasterxml.jackson.databind.util.ClassUtil.getClassMethods(ClassUtil.java:1317)
        at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector._addMemberMethods(AnnotatedMethodCollector.java:115)
        at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collect(AnnotatedMethodCollector.java:54)
        

And it seems the class was even generated image

Expected behavior

I would think that I can generate the code and run the kubernetes client afterwards.

Runtime

Kubernetes (vanilla)

Kubernetes API Server version

1.25.3@latest

Environment

Linux

Fabric8 Kubernetes Client Logs

No response

Additional context

No response

spike83 avatar Dec 17 '24 12:12 spike83