Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用ProGuard混淆clojure uberjars_Java_Clojure_Obfuscation_Proguard - Fatal编程技术网

Java 用ProGuard混淆clojure uberjars

Java 用ProGuard混淆clojure uberjars,java,clojure,obfuscation,proguard,Java,Clojure,Obfuscation,Proguard,我想知道是否有人有过用proguard混淆leiningen编译的Uberjar的经验。我已经尽了最大努力在谷歌上寻找解决方案,但没有真正找到答案。我想知道这是否有可能 我一直在试图混淆默认的lein项目。下面是core.clj文件: (ns proguard.core (:gen-class)) (defn -main "I don't do a whole lot." [& args] (println "Hello, World!")) 项目文件: (defproj

我想知道是否有人有过用proguard混淆leiningen编译的Uberjar的经验。我已经尽了最大努力在谷歌上寻找解决方案,但没有真正找到答案。我想知道这是否有可能

我一直在试图混淆默认的lein项目。下面是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*(...);
}
每当我尝试运行混淆的jar时,都会出现以下错误:

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
线程“main”java.lang.ExceptionInInitializeError中的异常 在clojure.lang.ve(未知来源) 在clojure.lang.ve.c(未知来源) 在clojure.lang.yf.a(未知来源) 在proguard.core(未知来源) 原因:java.lang.ClassNotFoundException:clojure.lang.PersistentList,编译:(clojure/core.clj:20) at clojure.lang.at.a(未知来源) at clojure.lang.at.b(未知来源) at clojure.lang.at.a(未知来源) 在clojure.lang.bj.a(未知来源) at clojure.lang.at.a(未知来源) at clojure.lang.at.b(未知来源) at clojure.lang.at.a(未知来源) at clojure.lang.at.a(未知来源) at clojure.lang.at.a(未知来源) 在clojure.lang.xh.a(未知来源) 在clojure.lang.xh.a(未知来源) 在clojure.lang.xh.b(未知来源) 在clojure.lang.xh.d(未知来源) 在clojure.lang.xh.c(未知来源) 在clojure.lang.xh(未知来源) ... 4更多 原因:java.lang.ClassNotFoundException:clojure.lang.PersistentList 位于java.net.URLClassLoader$1.run(URLClassLoader.java:202) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(URLClassLoader.java:190) 位于clojure.lang.ec.findClass(未知源) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:306) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:247) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:247) 在clojure.lang.xh.h(未知来源) 在clojure.lang.bp.b(未知来源) 在clojure.lang.bp.a(未知来源) 在clojure.lang.bq.a(未知来源) ... 还有19个 我不确定我到底做错了什么。。。我曾尝试遵循clojure针对proguard的教程,但是它是android和ant特有的,所以我想知道对于使用lein的桌面应用程序,这个过程是否完全不同

提前感谢。

从上面复制:

模糊uberjars

1。准备project.clj文件

这是我的一份副本(简单,默认lein项目,带注释):

这里没有更多的东西了。。。还要确保(
: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[]);
}

就这样。现在使用新的配置文件
java-jar proguard.jar@myconfig.pro
运行proguard。由于
-printseeds
标志,您应该可以看到大量的输出(如果您不想看到proguard将保留哪些类,当然可以删除这些标记)。

我没有使用proguard的经验,但从stacktrace来看,这个模糊器似乎已将clojure运行时从uberjar中排除。为了让程序正常运行,您必须保留clojure.jar中的所有类,而不仅仅是配置中的几个
\uu init
类。我猜一下,你必须将clojure.jar添加到
-libraryjars
列表中。嘿,谢谢你为我指明了正确的方向!整个clojure.jar不需要留在原地。我很快会回答我自己的问题。[编辑:嗯,我想我不能这么做,因为这个问题还太年轻…]你应该正确回答你自己的问题,因为它已经足够大了。就目前情况而言,问题之前的答案令人困惑。我现在已经这么做了。见下面的答案。
# 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[]);
}