camel-quarkus icon indicating copy to clipboard operation
camel-quarkus copied to clipboard

[Quarkus 2.11.1.Final] Subclass of EndpointRouteBuilder quarkus:dev fail to start due to "Method too large" error

Open jingwang opened this issue 3 years ago • 2 comments

We recently upgraded to camel-quarkus 2.11.0 that is on quarkus 2.11.1.Final. We have noticed that the routes defined in the subclass of EndpointRouteBuilder fail to start with mvn clean quarkus:dev. After some debugging it seems to be caused by including more than a few methods in the subclass. We have managed to reproduce the error with a bare minimum class:

import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class TestRoute extends EndpointRouteBuilder {

    protected int dummy() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }
    protected int dummy1() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    protected int dummy2() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    protected int dummy4() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    protected int dummy5() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    protected int dummy6() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    protected int dummy3() {
        int a = 0;
        a++;
        a++;
        a++;
        a++;
        a++;
        a++;
        return a;
    }

    @Override
    public void configure()  throws Exception {

    }
}

When trying to start up with mvn clean quarkus:dev, gives the following errors:

Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.arc.deployment.ArcProcessor#generateResources threw an exception: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass.<init> (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
	at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
	at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
	at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
	at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
	at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
	at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
	at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
	at java.base/java.lang.Thread.run(Thread.java:829)
	at org.jboss.threads.JBossThread.run(JBossThread.java:501)

	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:330)
	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:95)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:485)
	at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:68)
	at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:148)
	at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:103)
	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.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.arc.deployment.ArcProcessor#generateResources threw an exception: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass.<init> (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
	at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
	at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
	at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
	at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
	at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
	at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
	at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
	at java.base/java.lang.Thread.run(Thread.java:829)
	at org.jboss.threads.JBossThread.run(JBossThread.java:501)

	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:158)
	at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:328)
	... 9 more
Caused by: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass.<init> (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
	at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
	at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
	at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
	at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
	at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
	at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
	at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
	at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
	at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
	at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
	at java.base/java.lang.Thread.run(Thread.java:829)
	at org.jboss.threads.JBossThread.run(JBossThread.java:501)

pom.xml

   ...
    <properties>
        <camel-quarkus.version>2.11.0</camel-quarkus.version>
        <quarkus-plugin.version>2.11.1.Final</quarkus-plugin.version>
        <quarkus.platform.version>2.11.1.Final</quarkus.platform.version>
    </properties>
    ...

Runtime:

> java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment GraalVM CE 22.1.0 (build 11.0.15+10-jvmci-22.1-b06)
OpenJDK 64-Bit Server VM GraalVM CE 22.1.0 (build 11.0.15+10-jvmci-22.1-b06, mixed mode, sharing)

If the size/number of methods is reduced (e.g., commenting out some methods in the example), the application starts up fine.

Note that this works fine if it is a subclass of RouteBuilder.

Previously, the same code worked without errors on quarkus 2.10.0.

jingwang avatar Aug 08 '22 02:08 jingwang

Thanks @jingwang for reporting and it looks more like a quarkus issue?

zhfeng avatar Aug 08 '22 02:08 zhfeng

Thanks @zhfeng for the quick response. I believe it is a quarkus issue - This only happens when running quarkus:dev. mvn clean package runs without a problem.

jingwang avatar Aug 08 '22 02:08 jingwang