2015-10-17 8 views
9

रखने के लिए ProGuard बताने के लिए मैंने भारी जो वसंत, JAXB का उपयोग करें और एनोटेशन पर निर्भर करता है हमारी वेब आवेदन, और प्रतिबिंब अंधेरा प्रयास करें। मैं इंटरनेट में पाया कुछ वर्गों रखने के लिए कई व्यंजनों लागू, गुण, एनोटेशन और enumerations। लेकिन enumerations के साथ अभी भी समस्या है। मैं सक्षम बनाए रखने की है enum स्थिरांक http://proguard.sourceforge.net/manual/examples.html#enumerations से विन्यास लागू होते हैं:कैसे enum स्थिरांक और क्षेत्रों

-keepclassmembers,allowoptimization enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

पहली नज़र में यह समाधान और निरंतर संरक्षित काम कर रहा है, तो (Class.getEnumConstants()) की तरह दिखता है पर मूल्यों की सही सूची वापस जाएँ। लेकिन मैं NoSuchFieldException मिला जब मैं नाम से है कि में से किसी से क्षेत्र को पुनः प्राप्त करने का प्रयास करें।

समस्या jaxb reflection navigator से आते हैं, कृपया कोड को देखो:

public Field[] getEnumConstants(Class clazz) { 
    try { 
     Object[] values = clazz.getEnumConstants(); 
     Field[] fields = new Field[values.length]; 
     for (int i = 0; i < values.length; i++) { 
      fields[i] = clazz.getField(((Enum) values[i]).name()); 
     } 
     return fields; 
    } catch (NoSuchFieldException e) { 
     // impossible 
     throw new NoSuchFieldError(e.getMessage()); 
    } 
} 

मैं "असंभव" शाखा में वास्तव में गिर जाते हैं। मुझे लगता है कि यह आसान डिबग सत्र स्क्रीनशॉट को देखने के लिए समझ में आता हो जाएगा (वहाँ भी constants सूचीबद्ध): Screenshot of debug session1

और अगर मैं fields प्राप्त की कोशिश, वे के रूप में ए, बी, सी, डी, ई समझ से परे सूचीबद्ध हैं, च: Screenshot of debug session2

मेरे ProGuard विन्यास अब की तरह लग रहे हैं (कुछ पुस्तकालय को निकाल देते लिस्टिंग और विशेष कक्षाएं, खेतों और ProGuard के बारे में शिकायत करते हैं तरीकों KIPP):

-injars core-3.15.rc5.6.jar 
-outjars core-3.15.rc5.6.proguard.jar 

-libraryjars <java.home>/lib/rt.jar 

-libraryjars ... # Other libs listed, strip out for shortness 

-printmapping core-3.15.rc5.6.proguard.map 

-keep public class ru.rlh.egais.portal.backend.controller.rest.** 
-keep public class ru.rlh.egais.portal.backend.integration.soap.service.** 

# http://midgetontoes.com/blog/2015/06/26/tips-for-using-proguard-with-spring-framework 
-optimizations !class/marking/final 

-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF,META-INF/spring.*,spring/* 

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 
# Also tried: 
# -keepattributes ** 

-allowaccessmodification 
-dontshrink 
-dontoptimize 
-dontusemixedcaseclassnames 
-keepdirectories 
-keep @org.springframework.transaction.annotation.Transactional class * 
-keep @org.springframework.stereotype.Service class * 
-keep @org.springframework.stereotype.Repository class * 
-keep @org.springframework.stereotype.Controller class * 
-keep @org.springframework.stereotype.Component class * 
-keep @org.springframework.beans.factory.annotation.Autowired class * 
-keep @org.springframework.web.bind.annotation.ResponseBody class * 
-keep @org.springframework.web.bind.annotation.RequestMapping class * 
-keep @org.springframework.stereotype.Repository class * 
-keep @javax.annotation.Resource class * 
-keep @org.springframework.cache.annotation.EnableCaching class * 
-keep @org.springframework.context.annotation.Configuration class * 

-keepclassmembers class * { 
    @org.springframework.beans.factory.annotation.* *; 
    @org.springframework.beans.factory.annotation.Qualifier *; 
    @org.springframework.beans.factory.annotation.Value *; 
    @org.springframework.beans.factory.annotation.Required *; 
    @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 *; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

तो, मेरे सवाल का कैसे मैं पूरी तरह से सार्वजनिक enum रख सकता है obfuscation से है? दोनों ही मामलों में - अपने स्थिरांक (class.getEnumConstants()) और खेतों (class.getFields()) का उपयोग करें।

उत्तर

19

http://sourceforge.net/p/proguard/discussion/182455/thread/1c28f199/ के लिए धन्यवाद मैं अपने प्रश्न के लिए समाधान (<⁠fields> जोड़ा जाना चाहिए):

-keepclassmembers class * extends java.lang.Enum { 
    <fields>; 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 
+0

किसी भी व्यक्ति के लिए जो इस पर आता है और चींटी समकक्ष चाहता है: _ _ को जोड़ें प्रोजेवार्ड कार्य –

+0

मैं तुम्हें 'maven' कार्य विन्यास के बारे में बात लगता है? प्रारंभिक प्रश्न में मेवेन के बारे में कुछ भी नहीं। मैं 'gradle' का उपयोग करता हूं, लेकिन यह भी दायरे से बाहर है। इसलिए, उत्तर में प्रदान की गई सभी कॉन्फ़िगरेशन 'proguard.conf' वाक्यविन्यास से संबंधित है। – Hubbitus

+0

हबबिटस हां, हालांकि मुझे इस समस्या को हल करने की कोशिश करते हुए तीसरे लिंक के रूप में यह जवाब मिला, लेकिन चींटी (मावेन नहीं) का उपयोग करके, और सीधे प्रोगार्ड का उपयोग नहीं किया। दोनों के बीच अनुवाद तुरंत कम नहीं है, कम से कम मेरे लिए नहीं, इसलिए मैंने एक टिप्पणी जोड़ा ताकि कोई भी जो मेरी स्थितियों के तहत इसे पाता है, में अतिरिक्त जानकारी भी होगी। इसका मतलब यह नहीं था कि आपका जवाब गलत या अधूरा था। मुझे खेद है कि अगर आप अनुमान लगाते हैं। –

4

यह मेरे लिए ठीक काम किया।

-keep public enum com.company.appname.**{ 
    *; 
} 

कहाँ ** पैकेज और सबपैकेज है।

संबंधित मुद्दे