【发布时间】:2011-12-07 15:02:15
【问题描述】:
我有一个使用 pdfbox 库的 java 应用程序,它的大小为 10mb。我只使用了这个库的几个类。
我认为 ProGuard 会为我的应用程序生成一个独立的 jar。但是ProGuard生成的jar还是需要/lib文件夹下的pdfbox.jar才能运行。难道我做错了什么?我怎样才能实现我的目标? (省略了我不使用的 99% 的库类)。
cmets 后的注意事项: - 原始 jar 及其库是使用 Netbeans 生成的。我第一次使用 ProGuard GUI,但是在收到关于这个问题的 cmets 之后,我切换到了脚本。结果相同:只有当库位于 jar 旁边的 /lib 文件夹中时,该应用才能运行。
Proguard 脚本:
-injars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\ZoText.jar"
-outjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\ZoText_short.jar"
-libraryjars <java.home>/lib/rt.jar
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\Boilerpipe_short.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\commons-io-2.1.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\commons-lang3-3.0.1.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\guava-10.0.1.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\nekohtml.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\pdfbox-app-1.6.0.jar"
-libraryjars "C:\Users\C. Levallois\Documents\NetBeansProjects\ZoText\dist\lib\xercesImpl.jar"
-printmapping proguard.map
-keep public class proguard.ProGuard {
public static void main(java.lang.String[]);
}
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
【问题讨论】:
-
Proguard 会这样做。你试过吗?你也可以只复制你想要的类并使用它们。
-
我在我的问题中提到了 Proguard,但在您发表评论后,我对其进行了编辑以澄清。谢谢。
-
你能发布你脚本的相关部分吗?
-
我没有脚本,因为它都是基于 GUI 的。根据您的评论,我编辑了我的问题以显示我在 ProGuard 中选择的缩小选项(我基本上保留了默认值)。
-
我从未使用过 Proguard 的 GUI,但我猜想相关位在输入/输出选项卡中。正如 Stephen C 建议的那样,如果您通过脚本运行它,您可能会更幸运地找到帮助(并跟踪未来的问题)。