java - Spring boot - Proguard - ant jar 打包:org.springframework.beans.factory.BeanDefinitionStoreException:
问题描述
我们正在对 Spring Boot 应用程序执行混淆:我们在应用程序中有许多组件,并且我们为组件提供了任何特定名称,因为它们默认采用类名,但在混淆的情况下,我们会出现以下异常
@Component
public class Configuration
我们的项目中有很多组件。
例外:
ERROR - Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.Application]; nested exception is java.lang.IllegalArgumentException: No auto-configuration attributes found. Is com.Application annotated with EnableAutoConfiguration?
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:556)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:185)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at com.Application.main(Application.java:18)
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: java.lang.IllegalArgumentException: No auto-configuration attributes found. Is com.Application annotated with EnableAutoConfiguration?
at org.springframework.util.Assert.notNull(Assert.java:193)
at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getAttributes(AutoConfigurationImportSelector.java:126)
at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.selectImports(AutoConfigurationImportSelector.java:94)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:547)
... 21 common frames omitted
任何人都可以提出比显式添加名称到每个组件更好的方法吗?
**
更新
**
主类文件也有以下注释
@SpringBootApplication(scanBasePackages={
即使我们正在使用简单的演示项目并尝试对其进行混淆
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
一些 proguard 是如何混淆 spring 相关文件的。我明确地保持所有罐子不被混淆。
org.springframework.beans.factory.BeanDefinitionStoreException:无法处理配置类 [com.example.demo.DemoApplication] 的导入候选;嵌套异常是 java.lang.IllegalArgumentException:未找到自动配置属性。com.example.demo.DemoApplication 是否使用 EnableAutoConfiguration 注解?
更新 。添加 proguard.conf 文件
-libraryjars <java.home>/lib/rt.jar
#-include ../build/annotations.pro
-keeppackagenames
-keepdirectories
-dontshrink
-dontoptimize
-dontwarn
#-applymapping input_mapping.dat
#-printmapping final_mapping.dat
#-dontusemixedcaseclassnames
#-forceprocessing
-keepattributes InnerClasses,EnclosingMethod,SourceFile,LineNumberTable,Deprecated,Signature,Exceptions,*Annotations*
#-ignorewarnings
# Keep - Applications. Keep all application classes that have a main method.
-keep class !com.companyname.** { *; }
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.* *;
}
-keepclassmembers class * {
@org.simpleframework.xml.* *;
}
解决方案
推荐阅读
- qt - Qt BLE。只能获得 [custom] 服务中两个特征更改之一的通知
- java - 在 main() 中调用 launch(GUI.class) 后无法执行代码
- symfony - 为什么我的自定义表单主题插入标签两次?
- java - 如何将 Java 项目导出到带有资源的可运行 jar?
- scala - Scala - 模式匹配 - 构造函数无法实例化为预期类型
- java - ArrayIndexOutOfBounds-数组对
- javascript - 使用自定义 javascript/css 更改了光标,但光标出现在大约 100px 右和低于实际指针的位置
- javascript - chrome 扩展即使在弹出窗口关闭时也能运行
- html - 如何将文本放在 HTML 电子邮件代码中的图像上?
- python - Python在列表中查找时间不连续