0

I have an app running a simple route with apache camel and springboot, it compiles and runs fine when I run it as a springboot app:

2023-03-30T16:20:18.278Z  INFO 104320 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2023-03-30T16:20:18.278Z  INFO 104320 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2023-03-30T16:20:28.682Z  INFO 104320 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-03-30T16:20:28.756Z  INFO 104320 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-30T16:20:28.756Z  INFO 104320 --- [  restartedMain] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]
2023-03-30T16:20:29.085Z  INFO 104320 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-30T16:20:29.087Z  INFO 104320 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 10804 ms
2023-03-30T16:20:35.686Z  INFO 104320 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2023-03-30T16:20:35.856Z  INFO 104320 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-03-30T16:20:37.557Z  INFO 104320 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel 4.0.0-M2 (camel-1) is starting
2023-03-30T16:20:37.603Z  INFO 104320 --- [  restartedMain] c.s.b.CamelSpringBootApplicationListener : Starting CamelMainRunController to ensure the main thread keeps running
2023-03-30T16:20:37.604Z  INFO 104320 --- [inRunController] org.apache.camel.main.MainSupport        : Apache Camel (Main) 4.0.0-M2 is starting
2023-03-30T16:20:37.670Z  INFO 104320 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Routes startup (started:1)
2023-03-30T16:20:37.670Z  INFO 104320 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   :     Started route1 (file://files/input)
2023-03-30T16:20:37.670Z  INFO 104320 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel 4.0.0-M2 (camel-1) started in 1s928ms (build:443ms init:1s385ms start:100ms)
2023-03-30T16:20:37.682Z  INFO 104320 --- [  restartedMain] com.graalvm.test.TestApplication         : Started TestApplication in 22.772 seconds (process running for 24.892)

But when I try to run it after being compiled as a native app with graalvm and native-image (using gradle nativeCompile) I get the following error:

2023-03-30T15:29:22.078Z  INFO 63467 --- [           main] com.graalvm.test.TestApplication         : No active profile set, falling back to 1 default profile: "default"
2023-03-30T15:29:22.241Z  INFO 63467 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-03-30T15:29:22.283Z  INFO 63467 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-30T15:29:22.283Z  INFO 63467 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]
2023-03-30T15:29:22.346Z  INFO 63467 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-30T15:29:22.346Z  INFO 63467 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 268 ms
2023-03-30T15:29:22.531Z  WARN 63467 --- [           main] w.s.c.ServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationController': Instantiation of supplied bean failed
2023-03-30T15:29:22.531Z  WARN 63467 --- [           main] o.a.c.s.boot.SpringBootCamelContext      : CamelContext has only been running for less than a second. If you intend to run Camel for a longer time then you can set the property camel.springboot.main-run-controller=true in application.properties or add spring-boot-starter-web JAR to the classpath.
2023-03-30T15:29:22.531Z  INFO 63467 --- [           main] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel  (camel-1) is shutting down (timeout:45s)
2023-03-30T15:29:22.531Z  INFO 63467 --- [           main] o.a.c.impl.engine.AbstractCamelContext   : Routes stopped (stopped:0)
2023-03-30T15:29:22.531Z  INFO 63467 --- [           main] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel  (camel-1) shutdown in 0ms (uptime:)
2023-03-30T15:29:22.531Z  INFO 63467 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-03-30T15:29:22.532Z ERROR 63467 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationController': Instantiation of supplied bean failed
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1220) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1158) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[testApp:6.0.7]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[testApp:6.0.7]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[testApp:6.0.7]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[testApp:3.0.5]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[testApp:3.0.5]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[testApp:3.0.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[testApp:3.0.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[testApp:3.0.5]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[testApp:3.0.5]
        at com.graalvm.test.TestApplication.main(TestApplication.java:12) ~[testApp:na]
Caused by: java.lang.RuntimeException: Error loading catalog information from classpath
        at org.apache.camel.main.MainHelper.<init>(MainHelper.java:73) ~[na:na]
        at org.apache.camel.main.BaseMainSupport.<init>(BaseMainSupport.java:114) ~[testApp:4.0.0-M2]
        at org.apache.camel.main.MainSupport.<init>(MainSupport.java:60) ~[testApp:4.0.0-M2]
        at org.apache.camel.main.MainCommandLineSupport.<init>(MainCommandLineSupport.java:47) ~[testApp:4.0.0-M2]
        at org.apache.camel.main.Main.<init>(Main.java:41) ~[testApp:4.0.0-M2]
        at org.apache.camel.spring.boot.CamelSpringBootApplicationController$CamelSpringMain.<init>(CamelSpringBootApplicationController.java:78) ~[na:na]
        at org.apache.camel.spring.boot.CamelSpringBootApplicationController.<init>(CamelSpringBootApplicationController.java:35) ~[testApp:na]
        at org.apache.camel.spring.boot.CamelAutoConfiguration.applicationController(CamelAutoConfiguration.java:197) ~[testApp:na]
        at org.apache.camel.spring.boot.CamelAutoConfiguration__BeanDefinitions.lambda$getApplicationControllerInstanceSupplier$1(CamelAutoConfiguration__BeanDefinitions.java:56) ~[na:na]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:68) ~[testApp:6.0.7]
        at org.springframework.util.function.ThrowingBiFunction.apply(ThrowingBiFunction.java:54) ~[testApp:6.0.7]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.lambda$get$2(BeanInstanceSupplier.java:204) ~[na:na]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[testApp:6.0.7]
        at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[testApp:6.0.7]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.invokeBeanSupplier(BeanInstanceSupplier.java:216) ~[na:na]
        at org.springframework.beans.factory.aot.BeanInstanceSupplier.get(BeanInstanceSupplier.java:204) ~[na:na]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.obtainInstanceFromSupplier(DefaultListableBeanFactory.java:947) ~[testApp:6.0.7]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1214) ~[testApp:6.0.7]
        ... 17 common frames omitted
Caused by: java.lang.NullPointerException: null
        at java.base@17.0.6/java.io.Reader.<init>(Reader.java:168) ~[testApp:na]
        at java.base@17.0.6/java.io.InputStreamReader.<init>(InputStreamReader.java:76) ~[testApp:na]
        at org.apache.camel.main.MainHelper.loadLines(MainHelper.java:445) ~[na:na]
        at org.apache.camel.main.MainHelper.<init>(MainHelper.java:62) ~[na:na]
        ... 34 common frames omitted

My OS: Ubuntu - 20.04.6 LTS

My gradle file is as follows:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.5'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'org.graalvm.buildtools.native' version '0.9.18'
    
}

group = 'com.graalvm'
version = '1.0'
sourceCompatibility = '17'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

graalvmNative {
    binaries {
        main {
            imageName = 'testApp' 
            mainClass = 'com.graalvm.test.TestApplication'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.apache.camel.springboot:camel-core-starter:4.0.0-M2'
    implementation 'org.springframework.boot:spring-boot-starter-web:3.0.5'
    implementation 'org.apache.camel.springboot:camel-spring-boot-bom:4.0.0-M2'
    implementation 'org.apache.camel:camel-file:4.0.0-M2'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

My application.properties:

camel.springboot.main-run-controller=true

I appreciate any help or suggestion

jak
  • 1
  • 1
    I'm not aware on any effort so far to support SpringBoot native compilation in Apache Camel. Looking at the issue, it seems that the application fails while it is trying to read resources from classpath (see https://github.com/apache/camel/blob/394442ac58ccd267fd362ba43f4e97ff4da65074/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java#L58-L77). So I think graalvm should be instructed to include such resources in the generated binary. – Luca Burgazzoli Mar 31 '23 at 06:55

0 Answers0