Proguard + spring boot не может начать инъекцию после путаницы с несколькими модулями, сообщая об ошибке NoSuchBeanDefinitionException, UnsatisfiedDependencyException

1. Описание проблемы

В многомодульном проекте spring boot один из модулей после путаницы с proguard внедряется в основной модуль, и при его запуске сообщается следующая ошибка:

19:46:30.729 [main] ERROR o.s.b.SpringApplication - [reportFailure,860] - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jobHandlerBeanPostProcessor' defined in class path resource [com/xxx/xxx/xxx/config/xxxxJobAutoConfiguration.class]: Unsatisfied dependency expressed through method 'jobHandlerBeanPostProcessor' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.xxx.xxx.service.LesseeFrameworkService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {
    
    }
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:270)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:144)
	at com.xxx.xxx.modules.admin.AdminStartApplication.execute(AdminStartApplication.java:220)
	at com.xxx.xxx.modules.admin.AdminStartApplication.start(AdminStartApplication.java:125)
	at com.xxx.xxx.modules.admin.AdminStartApplication.main(AdminStartApplication.java:67)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.xxx.xxx.service.LesseeFrameworkService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {
    
    }
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
	... 29 common frames omitted
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jobHandlerBeanPostProcessor' defined in class path resource [com/xxx/xxx/xxx/config/xxxxJobAutoConfiguration.class]: Unsatisfied dependency expressed through method 'jobHandlerBeanPostProcessor' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.xxx.xxx.xxx.service.LesseeFrameworkService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {
    
    }
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:270)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:762)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:567)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:144)
	at com.xxx.xxx.modules.admin.AdminStartApplication.execute(AdminStartApplication.java:220)
	at com.xxx.xxx.modules.admin.AdminStartApplication.start(AdminStartApplication.java:125)
	at com.xxx.xxx.modules.admin.AdminStartApplication.main(AdminStartApplication.java:67)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.xxx.xxx.xxx.service.LesseeFrameworkService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {
    
    }
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)

NoSuchBeanDefinitionException, UnsatisfiedDependencyException Этот тип ошибки означает, что инъекция не удалась, и соответствующий bean-компонент не найден, и об ошибке будет сообщено

Два, решение

, после того, как событие раскрыто, резюме выглядит следующим образом, и расследование может быть выполнено следующим образом:

1. Не путайте аннотации, связанные с spring.Если вы перепутаете, такая ситуация может возникнуть легко.Настройте следующие параметры:

# 不混淆所有特殊的类:对异常、注解信息在runtime予以保留,不然影响springboot启动
-keepattributes Exceptions,InnerClasses,Signature?Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,SyntheticjEnclosingMethod

-keepclassmembers class * {
    
    
     @org.springframework.beans.factory.annotation.Autowired *;
     @org.springframework.beans.factory.annotation.Qualifier *;
     @org.springframework.beans.factory.annotation.Value *;
     @org.springframework.beans.factory.annotation.Required *;
     @org.springframework.context.annotation.Bean *;
     @org.springframework.context.annotation.Primary *;
     @org.springframework.boot.context.properties.ConfigurationProperties *;
     @org.springframework.boot.context.properties.EnableConfigurationProperties *;
     @javax.inject.Inject *;
     @javax.annotation.PostConstruct *;
     @javax.annotation.PreDestroy *;
}
-keepclassmembers class * {
    
    
     @org.springframework.beans.factory.annotation.Autowired <fields>;
     @org.springframework.beans.factory.annotation.Autowired <methods>;
     @org.springframework.security.access.prepost.PreAuthorize <methods>;
}

2. После путаницы подтвердите, было ли изменено имя вашего пакета, и вам нужно добавить его, если вы его измените.

@ComponentScan(value = {
    
    "com.xxx","xxx.xxx.xxx"})

3.jar проблема, proguard необходимо поддерживать структуру каталогов

#保持目录结构
-keepdirectories

В противном случае он появится и будет пуст следующим образом:

this.getClassLoader("com/xxxx/xxx")

Здесь я сообщаю об ошибке. В упакованном каталоге \ BOOT-INF \ lib явно есть зависимые файлы jar и файлы классов, что и является вышеуказанной ошибкой. Из информации стека журналов в сочетании с исходным кодом я нашел ее в org.springframework .context.annotation.ClassPathScanningCandidateComponentProvider в scanCandidateComponents в классе ClassPathScanningCandidateComponentProvider
вставьте сюда описание изображения
преобразует сконфигурированное имя пакета в форму пути, перейдите к classpath*: чтобы найти в строке 421 jar-пакет bean-компонента, сообщившего об ошибке, не может быть найдено, скопируйте код, создайте новый тестовый класс:

        //获取Spring资源解析器
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        //获取packageSearchPath下的Resource,这里得到的Resource是Class信息
        Resource[] resources = resourcePatternResolver.getResources("com.xxx.xxx"
                + ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage))
                + DEFAULT_RESOURCE_PATTERN + ClassUtils.CLASS_FILE_SUFFIX);
        Arrays.stream(resources).forEach(resource -> {
    
    
            System.out.println("=======>" + resource.getFilename());
        });

Приобретение тоже пустое, с помощью ClassGraph его можно получить в виде имени пакета

        try (ScanResult scanResult = new ClassGraph().acceptPackages("com.xxx.xxx.xxx").scan()) {
    
    
            scanResult.getAllResources().forEachByteArrayIgnoringIOException((io.github.classgraph.Resource res, byte[] content) -> {
    
    
                String path = res.getPath();
                System.out.println("文件:" + path);
            });
        }

Шаг за шагом протестируйте, вручную распакуйте пакет jar, а затем упакуйте jar с помощью команды jar.

jar -cfM0 xxx.jar .

Это нормально для повторной упаковки. Я уверен, что это причина пакета jar. Я подозреваю, что может быть проблема с каталогом пакета jar. Кажется, что нет проблем с программным обеспечением для сжатия, а затем распечатайте jar с помощью следующего кода, и проблем не возникнет.

        JarFile startJarFile = new JarFile("E:\\xxx\\start-1.0-SNAPSHOT.jar");
        Enumeration<JarEntry> startJarEntrys = startJarFile.entries();
        while (startJarEntrys.hasMoreElements()) {
    
    
            JarEntry entry = startJarEntrys.nextElement();
            System.out.println("startJarEntrys:" + entry.getName());
        }

Зайдите в Интернет, чтобы найти формат пакета jar. . . Это связано с появлением файла MAINFEST.MF. . Наконец, с помощью команды 7zip было обнаружено, что действительно существует проблема с каталогом пакета jar:

7z l xxxx.jar

Неверный каталог пакетов jar:

вставьте сюда описание изображения

Правильный каталог пакетов jar:
вставьте сюда описание изображения

Supongo que te gusta

Origin blog.csdn.net/mashangzhifu/article/details/123112631
Recomendado
Clasificación