2012-09-05 13 views
11

के साथ क्लोजर uberjars को अपनाना, मैं सोच रहा था कि किसी को भी अपने लीनिंगन संकलित uberjars को proguard के साथ obfuscating के साथ कोई अनुभव है। मैंने Google पर समाधान ढूंढने के लिए अपनी पूरी कोशिश की है लेकिन वास्तव में कोई जवाब नहीं मिल सका। मैं सोच रहा हूं कि यह सब संभव है या नहीं।ProGuard

मैं एक डिफ़ॉल्ट लीन परियोजना को अपनाने की कोशिश कर रहा हूं। यहाँ core.clj फ़ाइल है:

(ns proguard.core 
(:gen-class)) 

(defn -main 
    "I don't do a whole lot." 
    [& args] 
    (println "Hello, World!")) 

प्रोजेक्ट फाइल:

(defproject proguard "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.4.0"]] 
    :aot :all 
    :main proguard.core) 

और मेरे ProGuard कॉन्फ़िग फ़ाइल:

-injars clojure/proguard/target/proguard-0.1.0-SNAPSHOT-standalone.jar 
-outjars clojure/test-project 

-libraryjars /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar 

-dontshrink 
-dontoptimize 
-dontusemixedcaseclassnames 
-dontpreverify 
-dontnote 
-printseeds 

-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

-keep class clojure.core__init { public static void load(); } 
-keep class clojure.core_proxy__init { public static void load(); } 
-keep class clojure.core_print__init { public static void load(); } 
-keep class clojure.genclass__init { public static void load(); } 
-keep class clojure.core_deftype__init { public static void load(); } 
-keep class clojure.core.protocols__init { public static void load(); } 
-keep class clojure.gvec__init { public static void load(); } 
-keep class clojure.java.io__init { public static void load(); } 
-keep class clojure.lang__init { public static void load(); } 

-keep class proguard.core__init { 
    public static void load(); 
} 
-keep class proguard.core { 
    public *** super*(...); 
} 

जब भी मैं समझ से परे जार मैं निम्नलिखित चलाने का प्रयास त्रुटियां:

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at clojure.lang.ve.<init>(Unknown Source) 
    at clojure.lang.ve.c(Unknown Source) 
    at clojure.lang.yf.a(Unknown Source) 
    at proguard.core.<clinit>(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: clojure.lang.PersistentList, compiling:(clojure/core.clj:20) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.b(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.bj.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.b(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.xh.a(Unknown Source) 
    at clojure.lang.xh.a(Unknown Source) 
    at clojure.lang.xh.b(Unknown Source) 
    at clojure.lang.xh.d(Unknown Source) 
    at clojure.lang.xh.c(Unknown Source) 
    at clojure.lang.xh.<clinit>(Unknown Source) 
    ... 4 more 
Caused by: java.lang.ClassNotFoundException: clojure.lang.PersistentList 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at clojure.lang.ec.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at clojure.lang.xh.h(Unknown Source) 
    at clojure.lang.bp.b(Unknown Source) 
    at clojure.lang.bp.a(Unknown Source) 
    at clojure.lang.bq.a(Unknown Source) 
    ... 19 more 

मुझे सच में यकीन नहीं है कि मैं यहां क्या कर रहा हूं ... मैंने क्लोजर लक्षित प्रोजेवार्ड ट्यूटोरियल obfuscating with proguard का पालन करने का प्रयास किया है, हालांकि यह एंड्रॉइड और चींटी विशिष्ट है इसलिए मैं सोच रहा हूं कि प्रक्रिया डेस्कटॉप के लिए पूरी तरह से अलग है या नहीं अनुप्रयोग जो लीन का उपयोग करते हैं।

अग्रिम धन्यवाद।

+0

मुझे प्रोजेवार्ड के साथ कोई अनुभव नहीं है, लेकिन स्टैकट्रैक से ऐसा लगता है कि इस obfuscator ने uberjar से क्लोजर रनटाइम को बाहर कर दिया है। आपको अपने प्रोग्राम के काम के लिए क्लोजर.जर से * सभी * कक्षाएं रखना है, न केवल कई '__init' जिन्हें आपके कॉन्फ़िगरेशन से लगता है। मैं अनुमान लगाता हूं और कहता हूं कि आपको क्लोजर.जर को 'लाइब्रेजर' की सूची में जोड़ना होगा। –

+0

अरे, मुझे सही दिशा में इंगित करने के लिए धन्यवाद! पूरे clojure.jar को रहने की जरूरत है। मैं जल्द ही अपने प्रश्न का उत्तर दूंगा। [संपादित करें: हम्म, मुझे लगता है कि मैं ऐसा नहीं कर सकता, क्योंकि सवाल अभी भी बहुत छोटा है ...] – deadringer

+0

आपको अपने प्रश्न का सही उत्तर देना चाहिए कि यह पुराना है।जैसा कि यह खड़ा है, सवाल से पहले जवाब के साथ, यह भ्रमित है। – Tom

उत्तर

13

ऊपर से कॉपी किया गया:

मुश्किल होता uberjars

1. (टिप्पणी के साथ सरल, डिफ़ॉल्ट lein परियोजना,) अपने project.clj फ़ाइल तैयार कर रहा है

यहाँ मेरा की एक प्रति है:

(defproject proguard "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.4.0"]] 
    :main proguard.core 
    ;;; Make sure everything is aot compiled 
    :aot :all 
    ;;; Remove source .clj files from the resulting jar 
    :omit-source true 
) 

यहां इसके लिए और भी कुछ नहीं है ... अल तो सुनिश्चित करें कि (:gen-class) आपके नेमस्पेस घोषणाओं में शामिल है।

lein uberjar के साथ uberjar बनाएं और हम अगले चरण पर हैं।

2. अपने ProGuard कॉन्फ़िग फ़ाइल

एक बार फिर मेरी फ़ाइल की एक प्रतिलिपि तैयार कर रहा है एनोटेशन

# Our uberjar 
-injars clojure/proguard/target/proguard-0.1.0-SNAPSHOT-standalone.jar 
# Our output direcotry 
-outjars clojure/obfuscated 

# Link to rt.jar. I'm on a Mac so your path may differ 
-libraryjars /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar 

# ProGuard options. Detailed explanation here http://proguard.sourceforge.net/index.html#manual/usage.html 
-dontskipnonpubliclibraryclassmembers 
-dontnote 
-printseeds 

# What we will be doing is obfuscating, shrinking and optimizing the jar. 
# If you experience any problems start out with obfuscation and add the 
# -dontoptimize and the -dontshrink flags and see if it works. 

# Tell proguard to leave the clojure runtime alone 
# You would need to add any other classes that you wish to preserve here. 
-keep class clojure.** { *; } 

# Keep our core__init class 
-keep class proguard.core__init { 
    public static void load(); 
} 

# Keep classes that contain a main method (otherwise we won't be able to run the jar) 
-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

Thats इसके साथ इस प्रकार है। अब अपनी नई कॉन्फ़िगरेशन फ़ाइल java -jar proguard.jar @myconfig.pro के साथ प्रोग्रार्ड चलाएं। -printseeds ध्वज के कारण आपको आउटपुट का एक गुच्छा देखना चाहिए (यदि आप देखना चाहते हैं कि कौन से वर्ग प्रोग्रार्ड द्वारा रखे जाएंगे) तो आप निश्चित रूप से हटा सकते हैं।

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