gpt4 book ai didi

spring - 使用带有库的 Proguard 有一个 @Service bean,它应该 Autowiring

转载 作者:行者123 更新时间:2023-12-04 07:59:32 30 4
gpt4 key购买 nike

我有一个库 Common.License ,我正在用 Proguard 混淆它:

<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<obfuscate>true</obfuscate>
<options>
<option>-dontoptimize</option>
<option>-renamesourcefileattribute SourceFile</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option>
<option>-keep public class * { public protected *;}</option>
<option>-keepclassmembernames class * {java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean);}</option>
<option>-keepclassmembernames class * {com.common.license.LicenseSessionStore licenseSessionStore; com.common.license.LicenseStore licenseStore;}</option>
<option>-keepclassmembers enum * {public static **[] values(); public static ** valueOf(java.lang.String);}</option>
<option>-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}</option>
</options>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
</plugin>

这个库有一个用@Service 注释的 Spring bean:
@Service
public class LicenseServiceImpl implements LicenseService {

@Autowired(required = false)
LicenseSessionStore licenseSessionStore;

@Autowired(required = false)
LicenseStore licenseStore;

...

}

我在网络服务 Company.License 中使用这个库,我希望 LicenseService Autowiring :
@Component
public class BackgroundTasks {

@Autowired
ScheduledExecutorService scheduledExecutorService;

@Autowired
LicenseService licenseService;

...

}

所以 Company.License 依赖于 Common.License。如果我混淆了 Common.License 那么 licenseService不会在 BackgroundTasks 中 Autowiring .我可以解决此问题的唯一方法是将 licenseService 显式定义为 bean:
@Bean(name = "licenseService", autowire = Autowire.BY_NAME)
public LicenseService getLicenseService() {
if (licenseService == null) {
licenseService = new LicenseServiceImpl();
}
return licenseService;
}

我不需要像这样明确地将它声明为一个 bean,因为我已经用 @Service 注释了这个类。这应该足以使 licenseService Autowiring 在 BackgroundTasks Spring 神奇地工作。但事实并非如此!

Proguard 专门做了什么使这不起作用?我可以在 Proguard 的配置中做些什么来使其对 Spring 更友好?

授予

最佳答案

非常感谢 Eric Lafortune 在这里帮助我指明了正确的方向:

http://sourceforge.net/projects/proguard/forums/forum/182456/topic/2547498

这是指定插件和所需选项的工作 pom 文件添加:

<plugin>
<groupId>com.pyx4me</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<obfuscate>true</obfuscate>
<options>
<option>-dontoptimize</option>
<option>-keepdirectories</option>
<option>-renamesourcefileattribute SourceFile</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod</option>
<option>-keep public class * { public protected *;}</option>
<option>-keepclassmembernames class * {java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean);}</option>
<option>-keepclassmembernames class * {com.common.license.LicenseService licenseService; com.common.license.LicenseSessionStore licenseSessionStore;}</option>
<option>-keepclassmembers enum * {public static **[] values(); public static ** valueOf(java.lang.String);}</option>
<option>-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}</option>
<option>-keep @org.springframework.beans.factory.annotation.Service class *</option>
<option>-keep @org.springframework.stereotype.Controller class *</option>
<option>-keepclassmembers class * { @org.springframework.beans.factory.annotation.Autowired *; }</option>
</options>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<addMavenDescriptor>false</addMavenDescriptor>
</configuration>
</plugin>

笔记!您需要使用 ProGuard 4.4,最新版本的 ProGuard-Maven-Plugin (2.0.4) 使用 4.3,因此您需要编辑:
{M2_HOME}\repository\com\pyx4me\proguard-maven-plugin\2.0.4\proguard-maven-plugin-2.0.4.pom 

要拥有 4.4 依赖项(像这样):
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard</artifactId>
<version>4.4</version>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

关于spring - 使用带有库的 Proguard 有一个 @Service bean,它应该 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411689/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com