2012-05-29 125 views
2

我的runnable jar裏面有一些第三方的罐子。我是否必須使用Proguard的-libraryjar選項指定這些庫,即使它們已經打包在主jar文件中?Proguard和第三方庫

目前我這些錯誤:

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選項Proguard的罈子裏很多警告關於重複類。

我的Ant構建:

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

回答

2

proguard您必須指定您的第三方庫罐子下面的命令:

-libraryjars jar1.jar, jar2.jar, jar3.jar... 

如果不包括上述這些罐子,代碼與它們相關的內容將不會被混淆/優化/縮小,因爲它們將在proguard未解決。

可以的,如果它警告的話,因爲它會找到許多具有相同名稱的類,這是正常的,但是這不會對結果產生任何負面影響。

+1

我已經更新了我的問題,請檢查一下螞蟻的構建是否可以。 –

0

我沒有使用過proguard,但我用過yguard,概念是一樣的。

如果.class文件已經在被處理的jar中,那麼就不需要再添加它們。關於未解決的類的錯誤可能是由於某些您不使用的代碼取決於不可用的類。如果代碼從未被調用,這不是問題。最好的辦法是嘗試運行應用程序並查看哪些類不可用,然後添加這些類。我不會依賴proguard的輸出來確定是否所有必需的代碼都可用。

你在jar文件裏面沒有jar文件,對吧?這是行不通的。