熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java的“靜態庫鏈接”

2013-11-23 19:15:54  來源: Java核心技術 

  Java的庫組織方式就是動態鏈接從一個Java的jar包運行有可能要接一堆classpath就知道和基於靜態鏈接的C語言要實現動態鏈接要做額外的事情相似Java要想實現類似C的靜態鏈接也要做很多額外的事

  用類似Fat Jar的方法把所有的依賴庫打包的最後的庫中其實不是靜態鏈接——C的靜態鏈接只把需要的代碼復制過來不是眉毛胡子一把抓按說以Java的思想靜態鏈接不是很必要因此也就沒有原生支持但實踐和理論畢竟差距很遠不是每個庫都是標准庫假設你從別人的庫中引用了幾個類為了支持你的程序你必須提供別人的庫(假設這個庫並不流行)再假設你自己寫了一個庫以後再開發類似的程序就從庫中派生當然你不想把所有的代碼都發行出去這個問題在Netbeans上更為明顯Netbeans提供了一個swing框架用起來當然很方便但是當發行程序的時候你就會發現Netbeans很負責任的把依賴庫放到發行目錄的lib下居然有將近M(禁掉粗口)光寫一個窗口就要M!

  ProGuard不光是個混淆器它也能解決靜態鏈接的問題用它自己的話說是 It detects and removes unused classes fields methods and attributes下面給出的是在Netbeans中用的Ant腳本修改項目的buildxml添加

  <target name=postjar>
           <taskdef resource=proguard/ant/taskproperties classpath=${libsproguardclasspath} />
           <copyfile src=${distjar} dest=${distdir}/prejar/>
           <proguard warn=false obfuscate=false>
               <libraryjar path=${javahome}/lib/rtjar />
               <injar path=${javacclasspath} filter=!METAINF/MANIFESTMF />
               <injar path=${distdir}/prejar/>
               <outjar path=${distjar}/>
               <keep name=${mainclass}>
                   <method name=main/>
               </keep>
               <keep name=orgjdesktopbeansbindingextBeanAdapterProvider/>
               <keepclasseswithmembernames>
                   <method name=getServiceNames/>
               </keepclasseswithmembernames>
               <keepclasseswithmembernames>
                   <method name=addPropertyChangeListener/>
               </keepclasseswithmembernames>
           </proguard>
       </target>

  <target name=postjar>
            <taskdef resource=proguard/ant/taskproperties classpath=${libsproguardclasspath} />
            <copyfile src=${distjar} dest=${distdir}/prejar/>
            <proguard warn=false obfuscate=false>
                <libraryjar path=${javahome}/lib/rtjar />
                <injar path=${javacclasspath} filter=!METAINF/MANIFESTMF />
                <injar path=${distdir}/prejar/>
                <outjar path=${distjar}/>
                <keep name=${mainclass}>
                    <method name=main/>
                </keep>
                <keep name=orgjdesktopbeansbindingextBeanAdapterProvider/>
                <keepclasseswithmembernames>
                    <method name=getServiceNames/>
                </keepclasseswithmembernames>
                <keepclasseswithmembernames>
                    <method name=addPropertyChangeListener/>
                </keepclasseswithmembernames>
            </proguard>
        </target>Netbeans自帶ProGuard混淆器libsproguardclasspath就是ProGuard的位置關掉了警告因為我的應用共享了JME的庫關掉了混淆這樣更能看出去掉了哪些類後面的keep只要看著ProGuard的提示加就可以了——既然是一一對應的解決方案為什麼ProGuard不提供個自動選項期望能早日加上


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26546.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.