spring-boot-starter-swagger icon indicating copy to clipboard operation
spring-boot-starter-swagger copied to clipboard

proguard-maven-plugin2.1.1代码混淆和swagger有冲突

Open tomsue opened this issue 5 years ago • 0 comments

这个是错误信息, 源代码如下:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) @Slf4j @EnableEncryptableProperties @ComponentScan({"springfox.documentation.schema","com.ruoyi"}) public class CrmApplication { public static class CustomGenerator implements BeanNameGenerator { @Override public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { return definition.getBeanClassName(); } } public static void main(String[] args) { new SpringApplicationBuilder(CrmApplication.class) .beanNameGenerator(new CustomGenerator()) .run(args); }

pom.xml 的plugin信息

            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals><goal>proguard</goal></goals>
                </execution>
            </executions>
            <configuration>
                <proguardVersion>6.0.2</proguardVersion>
                <injar>classes</injar>
                <outjar>${project.build.finalName}.guard.jar</outjar>
                <outputDirectory>${project.build.directory}</outputDirectory>
                <obfuscate>true</obfuscate>
                <proguardInclude>./proguard.cfg</proguardInclude>
                <options>
                    <!-- 不做收缩(删除注释、未被引用代码)-->
                    <option>-dontshrink</option>
                    <!-- 不做优化(变更代码实现逻辑)-->
                    <option>-dontoptimize</option>
                    <option>-adaptclassstrings</option>

                    <!-- 不混淆所有特殊的类-->
                    <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                        SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option>

                    <option>-keepnames interface **</option>
                    <option>-keepnames @interface **</option>
                    <option>-keepclassmembers enum ** { *; }</option>
                   <!-- 用法如下,保留Application的类名和main方法不混淆:-->
                    <option>-keepnames public class com.ruoyi.CrmApplication { *; }</option>
                    <!-- 混淆这个包下的类     此处需要更改为自己需要混淆的包名-->
                    <option>-keep class !com.ruoyi.** { *; }</option>
                    <option>-keep interface * extends * { *; }</option>

                    <option>-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.web.bind.annotation.PostMapping *;
                        @org.springframework.web.bind.annotation.DeleteMapping *;
                        @org.springframework.context.annotation.Bean *;
                        @javax.annotation.PostConstruct *;
                        @javax.annotation.PreDestroy *;
                        @org.aspectj.lang.annotation.AfterReturning *;
                        @org.aspectj.lang.annotation.Pointcut *;
                        @org.aspectj.lang.annotation.AfterThrowing *;
                        @org.aspectj.lang.annotation.Around *;
                        @javax.jws.WebParam *;
                        @javax.jws.WebService *;
                        }
                    </option>

                    <option>-keep @org.springframework.stereotype.Service class *</option>
                    <option>-keep @org.springframework.stereotype.Controller class * </option>
                    <option>-keep @org.springframework.stereotype.Component class * </option>
                    <option>-keep @org.springframework.stereotype.Repository class *</option>
                </options>
                <libs>
                    <lib>${java.home}/lib/rt.jar</lib>
                    <lib>${java.home}/lib/jce.jar</lib>
                </libs>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>net.sf.proguard</groupId>
                    <artifactId>proguard-base</artifactId>
                    <version>6.0.2</version>
                    <scope>runtime</scope>
                </dependency>
            </dependencies>
        </plugin>

proguard.cfg:

`-target 1.8 -keep class .config. {;} -keep class .domain. {;} -keep class .vo. {;} -keep class .aspectj. {;} -keep interface * extends * { *; } -keep interface * { *; } -dontshrink -dontoptimize -useuniqueclassmembernames -adaptclassstrings -ignorewarnings -dontusemixedcaseclassnames

不路过非公用类文件及成员

-dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers

不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名

-keeppackagenames -keepparameternames

不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射

-keepclassmembers public class * {void set*(); get*();}

保持类protected不被混淆

-keep public class * { public protected *; } -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,Annotation,EnclosingMethod`

版本信息: SpringBoot2.1.9.RELEASE <dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.9.1.RELEASE</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>

错误信息: on: Error creating bean with name 'springfox.documentation.schema.CachingModelDependencyProvider' defined in URL [jar:file:/E:/SVN/Projects/crm-v1_0/CRM/ruoyi-admin/target/ruoyi-admin.jar!/BOOT-INF/lib/springfox-schema-2.9.2.jar!/springfox/documentation/schema/CachingModelDependencyProvider.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springfox.documentation.schema.DefaultModelDependencyProvider' defined in URL [jar:file:/E:/SVN/Projects/crm-v1_0/CRM/ruoyi-admin/target/ruoyi-admin.jar!/BOOT-INF/lib/springfox-schema-2.9.2.jar!/springfox/documentation/schema/DefaultModelDependencyProvider.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springfox.documentation.schema.property.CachingModelPropertiesProvider' defined in URL [jar:file:/E:/SVN/Projects/crm-v1_0/CRM/ruoyi-admin/target/ruoyi-admin.jar!/BOOT-INF/lib/springfox-schema-2.9.2.jar!/springfox/documentation/schema/property/CachingModelPropertiesProvider.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'springfox.documentation.schema.property.ModelPropertiesProvider' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value="optimized")} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140) at com.ruoyi.CrmApplication.main(CrmApplication.java:54) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.base/java.lang.reflect.Method.invoke(Unknown Source) 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:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52

tomsue avatar Jan 03 '20 02:01 tomsue