我有一个runnable jar,里面有几个第三方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选项指定jars,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>发布于 2012-05-29 19:17:01
在proguard中,您必须使用以下命令指定您的第三方库jars:
-libraryjars jar1.jar, jar2.jar, jar3.jar...如果您不像上面那样包含这些jars,那么与它们相关的代码将不会被混淆/优化/缩小,因为它们将无法相对于proguard进行解析。
如果它发出警告是可以的,因为它会找到很多同名的类,这是正常的,但这不会对结果产生任何负面影响。
发布于 2012-06-05 21:29:44
我没有用过proguard,但我用过yguard,概念是一样的。
如果.class文件已经在被处理的jar中,那么就不需要再次添加它们。有关未解析类的错误可能是由于您不使用的一些代码导致的,这取决于不可用的类。如果代码从未被调用过,这不是问题。最好的做法是尝试运行应用程序,查看哪些类不可用,然后添加这些类。我不会依赖proguard的输出来确定是否所有需要的代码都可用。
jar文件中没有jar文件,对吧?那行不通的。
https://stackoverflow.com/questions/10797921
复制相似问题