1.maven打包:
一直以來我都沒太注意過在myeclipse下使用run as來clean居然對項目的target目錄沒有進行操作,要讓操作有效,需要進入到maven build...選項下,進行clean,然后再使用process resources來加入配置文件,再使用compile--》package來打包,同時,值得注意的是,maven在進行打包時默認只把java文件打包進war,如果在非資源路徑下,有配置文件,如mybits的mapper.xml文件,需要在maven里邊指定一下,否則打包會失敗。

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
tips:一般如果不特別指定,maven項目在打包后會改變項目名稱,如你的項目原來叫test,打包后會變成test0.0.1-SNAPSHOT,看起來很不爽,為了解決這一問題,需要加入如下配置:
<artifactId>test</artifactId> <build> <finalName>test</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <packagingExcludes>WEB-INF/web.xml</packagingExcludes> </configuration> </plugin> </plugins> </build>
2.progard混淆配置部分:
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.11</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach>
<obfuscate>true</obfuscate>
<attachArtifactClassifier>pg</attachArtifactClassifier>
<options>
<option>-target 1.8</option>
<option>-dontshrink</option>
<option>-dontoptimize</option>
<option>-dontskipnonpubliclibraryclasses</option>
<option>-dontskipnonpubliclibraryclassmembers</option>
<option>-dontusemixedcaseclassnames</option>
<option>-allowaccessmodification</option>
<option>-useuniqueclassmembernames</option>
<option>-keeppackagenames</option>
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>
<!--原生servlet都是通過方法名調用接口的,所以,得保留類名和方法名 -->
<option>-keep class **.list.servlet.**{*;}</option>
<option>-keep class **.zxf.servlet.**{*;}</option>
<option>-keep class **.controller.**</option>
<!-- dao層接口的類名和方法不混淆 -->
<option>-keep class **.dao.**{ <methods>; }</option>
<!-- 不混淆實體類的方法和屬性,因為在配置文件中有引用-->
<option>-keep class **.domain.** {*;}</option>
<!-- 不混淆jsp頁面引入的類和屬性 -->
<option>-keep class com.lum.interface_util.** {*;}</option>
<option>-keep class com.java.zxf.util.ShowString {*;}</option>
</options>
<outjar>classes-autotest.jar</outjar>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<injar>classes</injar>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
3.混淆說明:你在混淆前,需要仔細分析你的項目,看看那些是必須保持類名不變的,那些是類名可以變,方法名可以變的,那些是可以隨意變的,只有在搞清楚這些之后,你的混淆工作才是有保障的,即即實現了混淆,也保證了代碼的可執行性,混淆結果截圖如下:


反編譯后的效果:

5.總結:個人分析得出不能混淆的類主要有這些:①在web.xml里邊配置的servlet,那么servlet的名稱和方法名都不能進行混淆;②與數據庫有交互的,主要包括實體類,dao層(這種是通過mapper.xml形式寫的sql);③在jsp頁面導入的類,如常量類,實體類等,需保證類名和變量名都不能混淆
