简体   繁体   中英

Spring application failed to start with enabled LoadTime weaving

Good day everyone, I have a spring boot web application for which I have added Load time weaving to be able to use AspectJ aspects for non-managed spring bean. but after that application failed to start. I have looked through many topics regarding the configuration of load time weaving for non-spring beans in the spring project but haven't met if anyone has faced the issue I currently have: My configuration:

gradle dependencies:

dependencies {
   compileOnly ("org.projectlombok:lombok:${lombokVersion}")

   implementation("org.aspectj:aspectjweaver:1.9.9.1")


   implementation ("org.mapstruct:mapstruct:${mapstructVersion}")
   implementation("com.fasterxml.jackson.core:jackson-databind:2.14.0-rc1")
   implementation ("mysql:mysql-connector-java:8.0.30")
   implementation("org.opensearch.client:opensearch-java:2.1.0")
   implementation("software.amazon.awssdk:apache-client:${awsSdkVersion}")
   implementation("software.amazon.awssdk:regions:${awsSdkVersion}")
   implementation("software.amazon.awssdk:auth:${awsSdkVersion}")
   implementation("jakarta.json:jakarta.json-api:2.1.1")
   implementation("commons-io:commons-io:2.11.0")


   implementation ("org.springframework.boot:spring-boot-starter-web")
   implementation ("org.springframework.boot:spring-boot-starter-data-jpa")
   implementation ("org.springframework.boot:spring-boot-starter-security")
   implementation ("org.springframework.boot:spring-boot-starter-validation")
   implementation ("org.springframework.boot:spring-boot-starter-log4j2")

   annotationProcessor ("org.projectlombok:lombok-mapstruct-binding:0.2.0")
   annotationProcessor ("org.mapstruct:mapstruct-processor:${mapstructVersion}")
   annotationProcessor ("org.projectlombok:lombok:${lombokVersion}")

   testImplementation("org.testcontainers:mysql:1.17.5")
   testImplementation ("org.springframework.boot:spring-boot-starter-test")
   testImplementation("com.h2database:h2:2.1.214")

   testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
   testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")

}

The spring boot versions are:

springBootVersion=2.7.4
dependencyManagement=1.0.14.RELEASE

Main application class:

@SuppressWarnings({"checkstyle:FinalClass", "checkstyle:HideUtilityClassConstructor"})
@SpringBootApplication
@EnableGlobalMethodSecurity(securedEnabled = true)
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
@EnableCaching
public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(WhiteCoatApp.class, args);
    }
}

Aspect:

@Aspect
public class DefaultViewsReturnHandler {

    @Around("viewObjects()")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Do something");
        return joinPoint.proceed();

    }

    @Pointcut("execution(* com.project.TestTest.getTestString(..))")
    public void viewObjects() {}
}

Configuration of META-INF/aop.xml

<aspectj>
    <aspects>
        <aspect name="com.project.common.DefaultViewsReturnHandler"/>
    </aspects>

    <weaver options="-verbose -showWeaveInfo">
        <include within="com.project..*"/>
    </weaver>
</aspectj>

And the class itself i would like to apply the aspect to is the simple pojo

public class TestTest {

    private String testString;


    public String getTestString() {
        return "myString";
    }
}

I'm running the application with

-javaagent:libs/spring-instrument-6.0.0.jar

and java 17

But had the error:

[INFO ] 2022-11-17 18:49:51.009 [background-preinit] Version - HV000001: Hibernate Validator 6.2.5.Final
[INFO ] 2022-11-17 18:49:51.326 [main] RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode.
[INFO ] 2022-11-17 18:49:51.359 [main] RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 29 ms. Found 2 JPA repository interfaces.
[ERROR] 2022-11-17 18:49:51.454 [main] SpringApplication - Application run failed
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @5dda768f
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
    at java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[?:?]
    at java.lang.reflect.Method.setAccessible(Method.java:193) ~[?:?]
    at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.23.jar:5.3.23]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:221) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4]
    at com.piecestech.whitecoat.platform.WhiteCoatApp.main(WhiteCoatApp.java:20) ~[main/:?]
[WARN ] 2022-11-17 18:49:51.465 [main] SpringApplication - Unable to close ApplicationContext
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.findLoadedClass(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @5dda768f
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
    at java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[?:?]
    at java.lang.reflect.Method.setAccessible(Method.java:193) ~[?:?]
    at org.springframework.util.ReflectionUtils.makeAccessible(ReflectionUtils.java:577) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.context.support.ContextTypeMatchClassLoader$ContextOverridingClassLoader.isEligibleForOverriding(ContextTypeMatchClassLoader.java:99) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:87) ~[spring-core-5.3.23.jar:5.3.23]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[?:?]
    at org.springframework.core.OverridingClassLoader.loadClass(OverridingClassLoader.java:82) ~[spring-core-5.3.23.jar:5.3.23]
    at org.springframework.context.support.ContextTypeMatchClassLoader.loadClass(ContextTypeMatchClassLoader.java:70) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1594) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1534) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:704) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:674) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1670) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:570) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:542) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:669) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:661) ~[spring-beans-5.3.23.jar:5.3.23]
    at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1300) ~[spring-context-5.3.23.jar:5.3.23]
    at org.springframework.boot.SpringApplication.getExitCodeFromMappedException(SpringApplication.java:867) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.getExitCodeFromException(SpringApplication.java:855) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.handleExitCode(SpringApplication.java:842) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:782) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4]
    at com.piecestech.whitecoat.platform.WhiteCoatApp.main(WhiteCoatApp.java:20) ~[main/:?]

Will appreciate any thoughts on this!

In the AspectJ release notes you can read the following:

Use LTW on Java 16+

Please note that if you want to use load-time weaving on Java 16+, the weaving agent collides with JEP 396 (Strongly Encapsulate JDK Internals by Default) and related subsequent JEPs. Therefore, you need to set the JVM parameter --add-opens java.base/java.lang=ALL-UNNAMED in order to enable aspect weaving. This is due to the fact that the weaver uses internal APIs for which we have not found an adequate replacement yet when defining classes in different classloaders.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM