के साथ क्लोजर 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 का पालन करने का प्रयास किया है, हालांकि यह एंड्रॉइड और चींटी विशिष्ट है इसलिए मैं सोच रहा हूं कि प्रक्रिया डेस्कटॉप के लिए पूरी तरह से अलग है या नहीं अनुप्रयोग जो लीन का उपयोग करते हैं।
अग्रिम धन्यवाद।
मुझे प्रोजेवार्ड के साथ कोई अनुभव नहीं है, लेकिन स्टैकट्रैक से ऐसा लगता है कि इस obfuscator ने uberjar से क्लोजर रनटाइम को बाहर कर दिया है। आपको अपने प्रोग्राम के काम के लिए क्लोजर.जर से * सभी * कक्षाएं रखना है, न केवल कई '__init' जिन्हें आपके कॉन्फ़िगरेशन से लगता है। मैं अनुमान लगाता हूं और कहता हूं कि आपको क्लोजर.जर को 'लाइब्रेजर' की सूची में जोड़ना होगा। –
अरे, मुझे सही दिशा में इंगित करने के लिए धन्यवाद! पूरे clojure.jar को रहने की जरूरत है। मैं जल्द ही अपने प्रश्न का उत्तर दूंगा। [संपादित करें: हम्म, मुझे लगता है कि मैं ऐसा नहीं कर सकता, क्योंकि सवाल अभी भी बहुत छोटा है ...] – deadringer
आपको अपने प्रश्न का सही उत्तर देना चाहिए कि यह पुराना है।जैसा कि यह खड़ा है, सवाल से पहले जवाब के साथ, यह भ्रमित है। – Tom