我有可运行的jar,里面有几个第三方罐子。我是否必须使用Proguard的-libraryjar选项指定这些库,即使它们已经包装在主jar文件中了?
目前我犯了这些错误:
Warning: there were 171 unresolved references to classes or interfaces.
Warning: there were 394 instances of library classes depending on program classes.
Warning: there were 1 unresolved references to program class members.
如果我使用-libraryjar选项指定jar,Proguard会警告很多重复的类。
我的蚂蚁构建:
<target name="jar" depends="compile">
<delete file="${destfile}" />
<jar destfile="${destfile}" filesetmanifest="mergewithoutmain" duplicate="preserve">
<manifest>
<attribute name="Main-Class" value="main.Main"/>
<attribute name="Class-Path" value="${classpath}"/>
</manifest>
<fileset dir="${target}" includes="**/*.class" />
<zipfileset excludes="META-INF/*.SF" src="lib1.jar" />
<zipfileset excludes="META-INF/*.SF" src="lib2.jar" />
<zipfileset excludes="META-INF/*.SF" src="lib3.jar" />
</jar>
</target>
<target name="dist" depends="jar">
<taskdef resource="proguard/ant/task.properties" classpath="${proguard}" />
<proguard>
-injars ${destfile}
-outjars ${destfileobfuscated}
-libraryjars C:/Java/jdk1.6.0_25/jre/lib/rt.jar;
C:/Java/jdk1.6.0_25/jre/lib/jsse.jar;
C:/Java/jdk1.6.0_25/jre/lib/jce.jar;
lib1.jar;
lib2.jar;
lib3.jar
-optimizationpasses 5
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-dontskipnonpubliclibraryclassmembers
-keepclasseswithmembers public class * {
public static void main(java.lang.String[]);
}
</proguard>
<move file="${destfileobfuscated}" tofile="${destfile}" />
</target>
答案 0 :(得分:2)
在proguard
中,您必须使用以下命令分配第三方库jar:
-libraryjars jar1.jar, jar2.jar, jar3.jar...
如果你没有像上面那样包含这些罐子,那么与它们相关的代码将不会被混淆/优化/收缩,因为它们在proguard
方面将无法解决。
如果它发出警告就没关系,因为它会找到很多具有相同名称的类,这是正常的,但这不会对结果产生任何负面影响。
答案 1 :(得分:0)
我没有使用过proguard,但是我使用了yguard,概念是一样的。
如果.class文件已经在正在处理的jar中,则无需再次添加它们。有关未解析的类的错误可能是由于您不使用的某些代码,具体取决于不可用的类。如果从未调用过代码,那么这不是问题。最好的办法是尝试运行应用程序并查看哪些类不可用,然后添加它们。我不会依赖proguard的输出来确定是否所有必需的代码都可用。
jar文件中没有jar文件,对吗?那不行。