zoukankan      html  css  js  c++  java
  • maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析

    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页面导入的类,如常量类,实体类等,需保证类名和变量名都不能混淆

  • 相关阅读:
    DokuWiki用storage的模式在sae上部署后速度太慢
    让禅道也可以玩BearyChat
    探讨c#中的unchecked是什么意思,起什么作用?
    重温Java的类加载机制
    JVM原理和优化
    为什么使用Redis
    高性能Web服务器Nginx及相关新技术的应用实践-张宴
    潘加宇--领域驱动设计和利润
    程序员跳槽全攻略
    EA强大的画图工具---设计数据库表格
  • 原文地址:https://www.cnblogs.com/g177w/p/10105266.html
Copyright © 2011-2022 走看看