2012-09-05 28 views
11

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.

+0

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'. –

+0

¡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

+0

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

Respuesta

13

Copiado desde arriba:

uberjars ofuscar

1. Preparación de su archivo project.clj

Aquí es una copia de la mía (proyecto simple, Lein defecto, con los comentarios):

(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 
) 

No hay mucho más aquí ... Al así que asegúrese de que (:gen-class) esté incluido en sus declaraciones del espacio de nombres.

Construye el uberjar con lein uberjar y nos vamos al siguiente paso.

2. Preparar el archivo de configuración ProGuard

Una vez más una copia de mi archivo sigue con anotaciones

# 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[]); 
} 

eso es todo. Ahora ejecute Proguard con su nuevo archivo de configuración java -jar proguard.jar @myconfig.pro. Debería ver un montón de resultados debido al indicador -printseeds (que por supuesto puede eliminar si no quiere ver qué clases conservará proguard).

Cuestiones relacionadas