raphw / byte-buddy

Runtime code generation for the Java virtual machine.
https://bytebuddy.net
Apache License 2.0
6.23k stars 804 forks source link

No classes have been predefined during the image build to load from bytecodes at runtime #1588

Closed funky-eyes closed 6 days ago

funky-eyes commented 7 months ago

-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image I have used the tracing agent to generate all the required classes, but finally this exception is thrown when executing the executable file

{
  "name":"org.apache.seata.config.Configuration",
  "queryAllDeclaredMethods":true,
  "queryAllDeclaredConstructors":true,
  "methods":[{"name":"addConfigListener","parameterTypes":["java.lang.String","org.apache.seata.config.ConfigurationChangeListener"] }, {"name":"getBoolean","parameterTypes":["java.lang.String"] }, {"name":"getBoolean","parameterTypes":["java.lang.String","boolean"] }, {"name":"getBoolean","parameterTypes":["java.lang.String","boolean","long"] }, {"name":"getConfig","parameterTypes":["java.lang.String"] }, {"name":"getConfig","parameterTypes":["java.lang.String","long"] }, {"name":"getConfig","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"getConfig","parameterTypes":["java.lang.String","java.lang.String","long"] }, {"name":"getConfigFromSys","parameterTypes":["java.lang.String"] }, {"name":"getConfigListeners","parameterTypes":["java.lang.String"] }, {"name":"getDuration","parameterTypes":["java.lang.String"] }, {"name":"getDuration","parameterTypes":["java.lang.String","java.time.Duration"] }, {"name":"getDuration","parameterTypes":["java.lang.String","java.time.Duration","long"] }, {"name":"getInt","parameterTypes":["java.lang.String"] }, {"name":"getInt","parameterTypes":["java.lang.String","int"] }, {"name":"getInt","parameterTypes":["java.lang.String","int","long"] }, {"name":"getLatestConfig","parameterTypes":["java.lang.String","java.lang.String","long"] }, {"name":"getLong","parameterTypes":["java.lang.String"] }, {"name":"getLong","parameterTypes":["java.lang.String","long"] }, {"name":"getLong","parameterTypes":["java.lang.String","long","long"] }, {"name":"getShort","parameterTypes":["java.lang.String"] }, {"name":"getShort","parameterTypes":["java.lang.String","short"] }, {"name":"getShort","parameterTypes":["java.lang.String","short","long"] }, {"name":"putConfig","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"putConfig","parameterTypes":["java.lang.String","java.lang.String","long"] }, {"name":"putConfigIfAbsent","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"putConfigIfAbsent","parameterTypes":["java.lang.String","java.lang.String","long"] }, {"name":"removeConfig","parameterTypes":["java.lang.String"] }, {"name":"removeConfig","parameterTypes":["java.lang.String","long"] }, {"name":"removeConfigListener","parameterTypes":["java.lang.String","org.apache.seata.config.ConfigurationChangeListener"] }]
},
{
  "name":"org.apache.seata.config.Configuration$ByteBuddy$AJvD3TW8",
  "fields":[{"name":"invocationHandler$ifs63q0"}],
  "methods":[{"name":"<init>","parameterTypes":[] }]
},
{
  "name":"org.apache.seata.config.file.SimpleFileConfig",
  "methods":[{"name":"<init>","parameterTypes":["java.io.File","java.lang.String"] }]
}
Exception in thread "main" com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime.
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:121)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.PredefinedClassesSupport.throwNoBytecodeClasses(PredefinedClassesSupport.java:76)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.hub.PredefinedClassesSupport.loadClass(PredefinedClassesSupport.java:130)
        at java.base@21.0.1/java.lang.ClassLoader.defineClass(ClassLoader.java:280)
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$DynamicClassLoader.invoker(JavaDispatcher.java:1383)
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:459)
        at net.bytebuddy.utility.dispatcher.JavaDispatcher$InvokerCreationAction.run(JavaDispatcher.java:452)
        at java.base@21.0.1/java.security.AccessController.executePrivileged(AccessController.java:129)
        at java.base@21.0.1/java.security.AccessController.doPrivileged(AccessController.java:319)
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.doPrivileged(JavaDispatcher.java)
        at net.bytebuddy.utility.dispatcher.JavaDispatcher.<clinit>(JavaDispatcher.java:87)
        at net.bytebuddy.description.type.TypeDescription$ForLoadedType.<clinit>(TypeDescription.java:8534)
        at net.bytebuddy.description.type.TypeDescription.<clinit>(TypeDescription.java:68)
        at net.bytebuddy.matcher.ElementMatchers.isFinalizer(ElementMatchers.java:1623)
        at net.bytebuddy.matcher.ElementMatchers.isDefaultFinalizer(ElementMatchers.java:1613)
        at net.bytebuddy.ByteBuddy.<init>(ByteBuddy.java:311)
        at net.bytebuddy.ByteBuddy.<init>(ByteBuddy.java:285)
        at io.seata.config.ConfigurationCache.proxy(ConfigurationCache.java:104)
        at io.seata.config.ConfigurationFactory.buildConfiguration(ConfigurationFactory.java:167)
        at io.seata.config.ConfigurationFactory.getInstance(ConfigurationFactory.java:112)
        at io.seata.core.rpc.netty.NettyBaseConfig.<clinit>(NettyBaseConfig.java:54)
        at java.base@21.0.1/java.lang.Class.ensureInitialized(DynamicHub.java:595)
        at io.seata.core.rpc.netty.TmNettyRemotingClient.getInstance(TmNettyRemotingClient.java:130)
        at io.seata.core.rpc.netty.TmNettyRemotingClient.getInstance(TmNettyRemotingClient.java:113)
        at io.seata.tm.TMClient.init(TMClient.java:46)
        at io.seata.tm.TMClient.init(TMClient.java:34)
        at icu.funkye.ApplicationMain.init(ApplicationMain.java:87)
        at icu.funkye.ApplicationMain.main(ApplicationMain.java:54)
        at java.base@21.0.1/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
raphw commented 7 months ago

Are the created classes really added? It seems like they are missing from the application.

funky-eyes commented 7 months ago

Are the created classes really added? It seems like they are missing from the application.

According to my code and config file, it should be added, can you tell me which class information is missing? Theoretically the tracing agent should be able to catch it, I didn't manually intervene because it must have loaded the relevant class when it started, so it should be traced.

linghengqian commented 7 months ago
linghengqian commented 7 months ago

Test run finished after 5560 ms [ 2 containers found ] [ 0 containers skipped ] [ 2 containers started ] [ 0 containers aborted ] [ 2 containers successful ] [ 0 containers failed ] [ 1 tests found ] [ 0 tests skipped ] [ 1 tests started ] [ 0 tests aborted ] [ 0 tests successful ] [ 1 tests failed ]

raphw commented 7 months ago

Byte Buddy tries to provide different defaults when it detects Graal: GraalImageCode, but possibly those defaults are overridden. In this case you need to contact the library maintainers. Maybe you can initiate the Graal support explicitly, too.

linghengqian commented 7 months ago

Error: Classes that should be initialized at run time got initialized during image building: net.bytebuddy.utility.OpenedClassReader was unintentionally initialized at build time. To see why net.bytebuddy.utility.OpenedClassReader got initialized use --trace-class-initialization=net.bytebuddy.utility.OpenedClassReader To see how the classes got initialized, use --trace-class-initialization=net.bytebuddy.utility.OpenedClassReader

                    3.8s (10.5% of total time) in 51 GCs | Peak RSS: 5.44GB | CPU load: 9.66

======================================================================================================================== Finished generating 'native-tests' in 35.1s. [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 48.480 s (Wall Clock) [INFO] Finished at: 2024-02-19T22:19:35+08:00 [INFO] ------------------------------------------------------------------------

raphw commented 7 months ago

Maybe it's another -H:ClassInitialization that needs to be added? To be perfectly honest, I never fully understood what is going on with these options and just kept adding them until everything worked.

linghengqian commented 7 months ago

Test run finished after 6586 ms [ 2 containers found ] [ 0 containers skipped ] [ 2 containers started ] [ 0 containers aborted ] [ 2 containers successful ] [ 0 containers failed ] [ 1 tests found ] [ 0 tests skipped ] [ 1 tests started ] [ 0 tests aborted ] [ 0 tests successful ] [ 1 tests failed ]

[INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:35 min (Wall Clock) [INFO] Finished at: 2024-02-20T16:34:23+08:00 [INFO] ------------------------------------------------------------------------

linghengqian commented 6 days ago

Having said that, opening this issue does not really help. After all, seata has removed the call to bytebuddy, so it can now compile to graalvm native image normally.