Closed moarychan closed 2 years ago
Hey! Did you try to report that issue to the authors of com.azure.spring:spring-cloud-azure-native-configuration
?
Hi @mhalbritter , thanks for your update! I'm involved in this module, but I haven't found the reason and the solution yet! could you help give some suggestions?
This looks like some class loading issue to me, not sure if related to spring native. Can these classes be loaded in a non-spring application running in a native image?
No, I don't know how to do the test, could you help give a reference doc to test the similar library features?
There is no reference documentation for that. I would create a plain java application with maven or gradle, add the com.azure.spring:spring-cloud-azure-native-configuration
as a dependency, write a main
method and then a
System.out.println(new com.azure.spring.cloud.autoconfigure.compatibility.AzureCompatibilityVerifierAutoConfiguration())
in there. This will cause the class to be loaded. Then compile the thing using the Native Build Tools to a native image. Then run that image and see if it crashes the same way. If it does, then it's not related to Spring Native and you can create an issue on the GraalVM repo.
I have tested the class loading withe command mvn clean spring-boot:run
, which will call Class.forName(xxx)
, and the application runs fine. I will follow your proposal to do more tests.
Not only is the class AzureCompatibilityVerifierAutoConfiguration
, but sometimes also occurs in other classes, the class com.azure.spring.cloud.autoconfigure.compatibility.ContextBootstrapInitializer
is generated by Spring Native, it's not in the dependency, can this class exception help to figure out what's wrong?
Hi @mhalbritter , after I test your proposal scenario, it builds successfully without any exceptions.
Use Native Build Tools to a native image failed due to the log4j initialization, it has been executed to [2/7] Performing analysis
, it is after the above security exception execution phase.
I tried to fix the exceptions, but I need to research to find more configurations to solve, the test code is hosted in a new branch non-spring-app-build-demo. @mhalbritter Does this test show that it is related to Spring Native side?
Your error above is related to build time initialization.
I fiddled with your sample and the class loading works when putting the code in the main
method. My guess is that the code which Spring Native generates and resides in the same package clashes with the digital signatures which are in the spring-cloud-azure-autoconfigure
JAR.
I can reproduce even on the JVM by creating a class com.azure.spring.cloud.autoconfigure.compatibility.Foobar
and try to new
that in the main
method:
Exception in thread "main" java.lang.SecurityException: class "com.azure.spring.cloud.autoconfigure.compatibility.Foobar"'s signer information does not match signer information of other classes in the same package
at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1158)
at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:902)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1010)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at com.example.issue.azurestoragenative.BuildDemo.main(BuildDemo.java:9)
@sdeleuze Have you seen something like this in the past? This could lead to a problem in SB3/SF6, as AFAIK we generate code in the same package as the spring beans.
Hi @mhalbritter could you please help to find a workable solution?
The only workaround I see here is to remove the digital signatures from the spring-cloud-azure-autoconfigure JAR.
Not seen something like this yet, but worth creating a SB3/SF6 repro and report on Spring Framework bug tracker if confirmed.
Reproducible with Spring AOT: https://github.com/spring-projects/spring-framework/issues/29019
Let's tackle that issue on Spring Framework 6 side.
Describe the issue There's module
com.azure.spring:spring-cloud-azure-native-configuration
to enable the Spring Native support for Spring Cloud Azure libraries, when building executable with Spring native support, the following exceptions have occurred:Fatal error: java.lang.SecurityException: class "com.azure.spring.cloud.autoconfigure.compatibility.AzureCompatibilityVerifierAutoConfiguration"'s signer information does not match signer information of other classes in the same package
Or this class exception,
Error: Error loading a referenced type: java.lang.SecurityException: class "com.azure.spring.cloud.autoconfigure.compatibility.ContextBootstrapInitializer"'s signer information does not match signer information of other classes in the same package
If I run the command
mvn clean package
, then the below similar exception occurs:Caused by: java.lang.SecurityException: class "com.azure.spring.cloud.autoconfigure.compatibility.IssueAzureStorageNativeApplicationTestsContextInitializer"'s signer information does not match signer information of other classes in the same package
.If I run
mvn clean spring-boot:run
, it can run successfully.Before I push the artifacts to Maven, I can run native-image command locally success with local Spring Cloud Azure artifacts, the difference between the artifacts is that the artifacts of Maven have the extra digest information than the local artifacts. Please help to address this exception, thanks!
Steps to reproduce the issue You can follow the sample project readme doc to reproduce this issue, it will connect to the local Azure Storage emulator.
Describe GraalVM and your environment:
More details Here is the details log.