(转)利用Ant与Proguard混淆引用的子工程项目jar包及打war包
生活随笔
收集整理的這篇文章主要介紹了
(转)利用Ant与Proguard混淆引用的子工程项目jar包及打war包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?當前的web項目有引用到子工程項目,而且多個子工程項目也有引用到其它的工程項目,現要求利用Ant自動將web項目打包成war包,其中引用到的子工程項目需打成jar包,而且必須是混淆后的jar包。其中混淆代碼的工具選擇了開源的Proguard(http://proguard.sourceforge.net/),可以運行proguard自帶的proguardgui.jar(圖形化用戶界面)生成proguard配置文件。
?
?
ProGuard是一個免費的java類文件壓縮,優化,混淆器.它探測并刪除沒有使用的類,字段,方法和屬性.它刪除沒有用的說明并使用字節碼得到最大優化.它使用無意義的名字來重命名類,字段和方法.? ProGuard的使用是為了:? 1.創建緊湊的代碼文檔是為了更快的網絡傳輸,快速裝載和更小的內存占用.? 2.創建的程序和程序庫很難使用反向工程.? 3.所以它能刪除來自源文件中的沒有調用的代碼? 4.充分利用java6的快速加載的優點來提前檢測和返回java6中存在的類文件.? 參數:? -include {filename} ? ?從給定的文件中讀取配置參數? -basedirectory {directoryname} ? ?指定基礎目錄為以后相對的檔案名稱? -injars {class_path} ? ?指定要處理的應用程序jar,war,ear和目錄? -outjars {class_path} ? ?指定處理完后要輸出的jar,war,ear和目錄的名稱? -libraryjars {classpath} ? ?指定要處理的應用程序jar,war,ear和目錄所需要的程序庫文件? -dontskipnonpubliclibraryclasses ? ?指定不去忽略非公共的庫類。? -dontskipnonpubliclibraryclassmembers ? ?指定不去忽略包可見的庫類的成員。? 保留選項? -keep {Modifier} {class_specification} ? ?保護指定的類文件和類的成員? -keepclassmembers {modifier} {class_specification} ? ?保護指定類的成員,如果此類受到保護他們會保護的更好? -keepclasseswithmembers {class_specification} ? ?保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。? -keepnames {class_specification} ? ?保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)? -keepclassmembernames {class_specification} ? ?保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)? -keepclasseswithmembernames {class_specification} ? ?保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)? -printseeds {filename} ? ?列出類和類的成員-keep選項的清單,標準輸出到給定的文件? 壓縮? -dontshrink ? ?不壓縮輸入的類文件? -printusage {filename}? -whyareyoukeeping {class_specification} ? ?? 優化? -dontoptimize ? ?不優化輸入的類文件? -assumenosideeffects {class_specification} ? ?優化時假設指定的方法,沒有任何副作用? -allowaccessmodification ? ?優化時允許訪問并修改有修飾符的類和類的成員? 混淆? -dontobfuscate ? ?不混淆輸入的類文件? -printmapping {filename}? -applymapping {filename} ? ?重用映射增加混淆? -obfuscationdictionary {filename} ? ?使用給定文件中的關鍵字作為要混淆方法的名稱? -overloadaggressively ? ?混淆時應用侵入式重載? -useuniqueclassmembernames ? ?確定統一的混淆類的成員名稱來增加混淆? -flattenpackagehierarchy {package_name} ? ?重新包裝所有重命名的包并放在給定的單一包中? -repackageclass {package_name} ? ?重新包裝所有重命名的類文件中放在給定的單一包中? -dontusemixedcaseclassnames ? ?混淆時不會產生形形色色的類名? -keepattributes {attribute_name,...} ? ?保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.? -renamesourcefileattribute {string} ? ?設置源文件中給定的字符串常量? 因為我們開發的是struts2+spring+openjpa的架構的項目,所有需要很詳細的配置,其中proguard需要的injars,outjars還有其它的一些libraryjars在Ant的build.xml文件以參數形式加入。 proguard.pro文件具體內容: -libraryjars ?<java.home>/lib/rt.jar -libraryjars ?<java.home>/lib/jce.jar -libraryjars ?<java.home>/lib/jsse.jar -obfuscationdictionary dictionaries/compact.txt -classobfuscationdictionary dictionaries/shakespeare.txt # -printmapping proguard.map? -overloadaggressively? -defaultpackage ''? # -flattenpackagehierarchy '' # -dontusemixedcaseclassnames # -keeppackagenames -allowaccessmodification? -dontoptimize? # 因為項目中使用到了jpa的Annotation注解,需要保留這個屬性 -keepattributes *Annotation* # Keep web listener-class,自己編寫的web listener,不能混淆,不然啟動服務的時候會報錯 -keep public class com.test.mylistener { public protected *; } # Keep jpa dao, 自身編寫的一些dao接口不能混淆,而且如果是有被spring管理的dao, 也應該不進行混淆 -keep public class com.test.dao.* { public protected *; } # 其中jpa dao中使用到的一些重要接口也能進行混淆 -keep public class com.test.persistence.core.QueryLiteral { public protected *; } -keep public class com.test.persistence.JpaDao { public protected *; } # Keep beans managed by spring framework,spring管理的bean不進行混淆 -keep public class com.test.provider.* { public protected *; } # Keep Network interface -keep public class com.test.loader.Network { public protected *; } # Keep entity classes extends java.io.Serializable # 保留jpa中使用到的所有實體類,不進行混淆 -keep public class * implements java.io.Serializable{? public protected private *;? } -keep public class com.test.entity.* {? public protected private *;? }? # Keep - Applications. Keep all application classes, along with their 'main' methods. -keepclasseswithmembers public class * { public static void main(java.lang.String[]); } # Keep names - Native method names. Keep all native class/method names. -keepclasseswithmembers,allowshrinking class * { native <methods>; } proguard和build.xml文件具體目錄結構: server工程 -src目錄 -build目錄 -proguard目錄 -dictionaries 主要存放混淆時需要用到字典文件,可以使用官網下載到的proguard.zip包中dictionaries的兩個文件(dictionaries/compact.txt,dictionaries/shakespeare.txt) -lib 存放proguard.jar包,這是混淆中使用到的最主要的一個jar包(下載到的proguard.zip中) -proguard.pro ?主要的混淆配置文件 -build.xml Ant的build.xml文件編寫如下: <?xml version="1.0" encoding="UTF-8"?> <project name="com.ibm.crl.scm.crc.server" default="dist" basedir="."> ? <target name="init" description="設置初始化打war包需要的路徑變量"> ? <!-- 你的eclipse工作空間站目錄路徑,以備引用到子工程項目使用--> <property name="workspace" value="${basedir}/../"/> <!-- 需要被打包成war包的主工程項目--> <property name="server.name" value="server"/> <!-- 主工程項目引用到的其它子工程項目--> <property name="childproject1.name" value="childproject1"/> <property name="childproject2.name" value="childproject2"/> <property name="src" value="${basedir}/src"/> <property name="resources" value="${basedir}/resources"/> <property name="lib" value="${basedir}/WebContent/WEB-INF/lib"/> ? <property name="webapp" value="${basedir}/WebContent"/> ? <property name="proguard" value="${basedir}/proguard"/>? <property name="proguard.lib" value="${proguard}/lib"/>? <property name="build.src" value="${basedir}/build/src"/> ? <property name="build.dest" value="${basedir}/build/WEB-INF/classes"/> ? <property name="buildwar.dest" value="${basedir}/build/server"/> ? <property name="war.dest" value="${basedir}/build/war"/> ? <!-- 該目錄是存儲引用到的子工程混淆后的jar包-->? <property name="referenced.lib" value="${basedir}/build/referenced"/> ? <path id="classpath"> ? <fileset dir="${referenced.lib}"> ? <include name="**/*.jar"/> ? </fileset> ? <fileset dir="${lib}"> ? <include name="**/*.jar"/> ? </fileset> ? </path> ? </target> ? <target name="prepare" depends="init" description="創建打包需要的路徑,拷貝源文件到打包路徑下"> ? <mkdir dir="${build.src}"/> ? <mkdir dir="${build.dest}"/> ? <mkdir dir="${buildwar.dest}"/> ? <mkdir dir="${war.dest}"/> ? <mkdir dir="${referenced.lib}"/> ? <copy todir="${build.src}"> ? <fileset dir="${src}"/> ? <fileset dir="${resources}"/> ? </copy> ? <copy todir="${buildwar.dest}"> ? <fileset dir="${webapp}"/> ? </copy> ? </target> ? <!-- 因為當前我們項目中,各個子工程項目有互相引用的情況,打包成jar包就成問題了,所以直接將eclipse自動編譯的.class文件打包成jar包,然后再進行混淆--> <target name="references" depends="prepare" description="將引用到的子工程打包成jar文件"> <jar destfile="${referenced.lib}/${childproject1.name}.jar"> <fileset dir="${workspace}/${childproject1.name}/bin"/> </jar> <jar destfile="${referenced.lib}/${childproject2.name}.jar"> <fileset dir="${workspace}/${childproject2.name}/bin"/> </jar>? </target> <target name="proguard" depends="references" description="混淆引用到的子工程jar文件,并替換"> <taskdef resource="proguard/ant/task.properties" classpath="${proguard.lib}/proguard.jar" /> <proguard configuration="${proguard}/proguard.pro"> <injar file="${referenced.lib}/${childproject1.name}.jar"/> <outjar file="${referenced.lib}/OB_${childproject1.name}.jar"/> <injar file="${referenced.lib}/${childproject2.name}.jar"/> <outjar file="${referenced.lib}/OB_${childproject2.name}.jar"/> <libraryjar dir="${lib}"/> </proguard> <move file="${referenced.lib}/OB_${childproject1.name}.jar" tofile="${referenced.lib}/${childproject1.name}.jar"/> <move file="${referenced.lib}/OB_${childproject2.name}.jar" tofile="${referenced.lib}/${childproject2.name}.jar"/> </target> <target name="build" depends="proguard" description="編譯java文件,拷貝properties屬性配置文件到編譯后的路徑下"> ? <javac srcdir="${build.src}" destdir="${build.dest}"> ? <classpath refid="classpath"/> ? </javac> ? <copy todir="${build.dest}"> ? <fileset dir="${build.src}"> ? <include name="**/*.properties"/> <include name="**/server.keystore"/>? <include name="**/*.xml"/>? </fileset> ? </copy> ? </target> ? <target name="dist" depends="build" description="打war包,不將java文件打入包內"> ? <delete dir="${build.src}"/> ? <war warfile="${war.dest}/${server.name}.war" webxml="${buildwar.dest}/WEB-INF/web.xml"> ? <lib dir="${referenced.lib}/"/> ? <classes dir="${build.dest}"/> ? <fileset dir="${buildwar.dest}"/> ? </war> <antcall target="clean"></antcall> </target> ? <target name="clean" depends="init" description="清除打包用臨時文件"> ? <delete dir="${build.src}"/> ? <delete dir="${basedir}/build/WEB-INF"/> ? <delete dir="${buildwar.dest}"/> ? </target> ? <target name="cleanAll" depends="clean" description="清除所有打包生成文件"> ? <delete dir="${war.dest}"/> ? <delete dir="${referenced.lib}"/> </target>? </project>轉載于:https://www.cnblogs.com/greywolf/archive/2013/04/19/3031242.html
總結
以上是生活随笔為你收集整理的(转)利用Ant与Proguard混淆引用的子工程项目jar包及打war包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【翻译】Ext JS 4.2介绍
- 下一篇: mysql binlog_format