[ 
https://issues.apache.org/jira/browse/FLINK-35951?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18033255#comment-18033255
 ] 

Edward Zhang commented on FLINK-35951:
--------------------------------------

Considered as a supplementary to 
[FLINK-35913|https://issues.apache.org/jira/browse/FLINK-35913].

> Flink CDC startup exception using jar package
> ---------------------------------------------
>
>                 Key: FLINK-35951
>                 URL: https://issues.apache.org/jira/browse/FLINK-35951
>             Project: Flink
>          Issue Type: Bug
>          Components: Flink CDC
>    Affects Versions: cdc-3.1.1
>         Environment: jdk 17 
> flink 1.18
> flinkcdc 3.0.0
>            Reporter: huxx
>            Priority: Blocker
>         Attachments: image-2024-08-01-15-01-25-795.png, 
> image-2024-08-01-15-10-35-824.png
>
>
> I integrated Flink with SpringBoot to complete my project because I only used 
> a small part of Flink's functionality, namely the data extraction feature in 
> Flink CDC. I don't want to build another Flink environment to manage and 
> maintain, I want to integrate this feature with other businesses and manage 
> it through Spring. I can use the Idea development tool to package and start 
> projects normally. I use the spring boot man plugin tool to package, but when 
> I start it using Java Jar and execute StreamExecutionEnvironment. Execute(), 
> it prompts that the class cannot be found. However, this class does exist and 
> can be packaged
> !image-2024-08-01-15-10-35-824.png!
> {code:java}
> org.apache.flink.runtime.client.JobInitializationException: Could not start 
> the JobMaster.
>         at 
> org.apache.flink.runtime.jobmaster.DefaultJobMasterServiceProcess.lambda$new$0(DefaultJobMasterServiceProcess.java:97)
>         at 
> java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
>         at 
> java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
>         at 
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
>         at 
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
>         at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
>         at java.base/java.lang.Thread.run(Thread.java:833)
> Caused by: java.util.concurrent.CompletionException: 
> java.lang.RuntimeException: java.lang.ClassNotFoundException: 
> org.apache.flink.api.common.ExecutionConfig
>         at 
> java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315)
>         at 
> java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:320)
>         at 
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1770)
>         ... 3 more
> Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: 
> org.apache.flink.api.common.ExecutionConfig
>         at 
> org.apache.flink.util.ExceptionUtils.rethrow(ExceptionUtils.java:321)
>         at 
> org.apache.flink.util.function.FunctionUtils.lambda$uncheckedSupplier$4(FunctionUtils.java:114)
>         at 
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
>         ... 3 more
> Caused by: java.lang.ClassNotFoundException: 
> org.apache.flink.api.common.ExecutionConfig
>         at 
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
>         at 
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
>         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
>         at java.base/java.lang.Class.forName0(Native Method)
>         at java.base/java.lang.Class.forName(Class.java:467)
>         at 
> org.apache.flink.util.InstantiationUtil$ClassLoaderObjectInputStream.resolveClass(InstantiationUtil.java:78)
>         at 
> java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2045)
>         at 
> java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1909)
>         at 
> java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2235)
>         at 
> java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1744)
>         at 
> java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:514)
>         at 
> java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:472)
>         at 
> org.apache.flink.util.InstantiationUtil.deserializeObject(InstantiationUtil.java:539)
>         at 
> org.apache.flink.util.InstantiationUtil.deserializeObject(InstantiationUtil.java:527)
>         at 
> org.apache.flink.util.SerializedValue.deserializeValue(SerializedValue.java:67)
>         at 
> org.apache.flink.runtime.scheduler.DefaultSchedulerFactory.createInstance(DefaultSchedulerFactory.java:101)
>         at 
> org.apache.flink.runtime.jobmaster.DefaultSlotPoolServiceSchedulerFactory.createScheduler(DefaultSlotPoolServiceSchedulerFactory.java:122)
>         at 
> org.apache.flink.runtime.jobmaster.JobMaster.createScheduler(JobMaster.java:379)
>         at 
> org.apache.flink.runtime.jobmaster.JobMaster.<init>(JobMaster.java:356)
>         at 
> org.apache.flink.runtime.jobmaster.factories.DefaultJobMasterServiceFactory.internalCreateJobMasterService(DefaultJobMasterServiceFactory.java:128)
>         at 
> org.apache.flink.runtime.jobmaster.factories.DefaultJobMasterServiceFactory.lambda$createJobMasterService$0(DefaultJobMasterServiceFactory.java:100)
>         at 
> org.apache.flink.util.function.FunctionUtils.lambda$uncheckedSupplier$4(FunctionUtils.java:112)
>         ... 4 more {code}
> I think the root cause lies in this class loader
> It was found that when running locally and packaging with springboot, the 
> classloader for the same class is different. The locally launched classlaoder 
> is sun.misc Launcher$AppClassLoader。
> But after executing the Java jar startup, the class loader is 
> org.springframework.boot.loader LaunchedURLClassLoader, This is because the 
> Spring project has customized the classloader to load files
> After packaging, the class loader of StreamExecutioneEnvironment is loaded by 
> springboot's class loader, but we call the method to pass 
> getSystemclassloader, -->sun.misc Launcher$AppClassLoader, According to the 
> parental delegation mechanism, upward search is definitely not possible
> So I use the constructor of StreamExecutionEnvironment to pass the 
> classloader when calling, passing in the current thread's classloader. As 
> shown in the figure below, the current thread's classloader is Tomcat 
> Embedded Webapp ClassLoader, and the parent classloader is org. 
> springframework. boot. loader LaunchedURLClassLoader, 
> StreamExecutioneEnvironment is created by org.springframework.boot.loader 
> Launched by URLClassLoader
> But after packaging, there is no effect. I don't know how to solve this 
> problem. Do you have any good ideas?
> !image-2024-08-01-15-01-25-795.png!



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to