Me preguntaba si alguien tiene alguna experiencia con ofuscar sus leiningen compilados uberjars con proguard. Intenté buscar una solución en Google pero no pude encontrar una respuesta. Me pregunto si esto es posible.Ofuscación de clojure uberjars con ProGuard
He estado tratando de ofuscar un proyecto lein predeterminado. Aquí está el archivo core.clj:
(ns proguard.core
(:gen-class))
(defn -main
"I don't do a whole lot."
[& args]
(println "Hello, World!"))
el archivo de proyecto:
(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)
y mi Proguard fichero de configuración:
-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*(...);
}
Siempre que intente ejecutar el frasco ofuscado consigo el siguiente errores:
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
No estoy muy seguro de lo que estoy haciendo mal aquí ... He intentado seguir un tutorial de tutorial de clojure obfuscating with proguard, sin embargo, es específico de android y ant, por lo que me pregunto si el proceso es completamente diferente para el escritorio aplicaciones que usan lein
Gracias de antemano.
No tengo experiencia con proguard, pero desde el stacktrace parece que este ofuscador ha excluido el tiempo de ejecución de clojure del uberjar. Debes mantener * todas * las clases de clojure.jar para que tu programa funcione, no solo varias '' __init' como parece de tu configuración. Adivino y digo que debes agregar clojure.jar a la lista de '-libraryjars'. –
¡Hola, gracias por indicarme la dirección correcta! El conjunto de clojure.jar no necesita permanecer fijo. Voy a responder mi propia pregunta en breve. [EDITAR: hmm, creo que no puedo hacer eso, ya que la pregunta es demasiado joven ...] – deadringer
Deberías responder tu propia pregunta correctamente ahora que ya es lo suficientemente vieja.Tal como está, con la respuesta antes de la pregunta, es confuso. – Tom