yguard是一个很好用的java类文件模糊器(obfuscation)。它和ant配合使用,需要修改ant的build.xml文件,把它们集成到一起。需要把生成的class文件打包成jar文件,然后对jar文件进行模糊化。
yguard可以完成以下模糊化工作:
    -模糊化方法(函数)中的变量名
    -模糊化类的成员变量名
    -模糊化方法名
    -模糊化类名
    -模糊化包路径
    -去除class文件的调试信息等等

其中,对模糊化类的成员变量名、方法名、类名,可以分别设置保护级别。设置的修饰符和java的修饰(访问控制)符一致,包括:
    -public
    -protected
    -private
    -none:表示对名称不进行模糊化。注意,本修饰符是yguard特有的,java中没有

以保护方法名为例
    -public表示除了public的方法名不需要混淆外,模糊化其他所有的方法名(即:模糊化protected和private修饰的方法名);
    -protected表示除了public和protected的方法名不进行混淆,其余的方法名都要进行模糊化(即:模糊化private修饰的方法名);
    -private表示对方法名不进行混淆
    -none表示对所有方法名均进行模糊化,包括public的方法名

保护级别在obfuscate部分通过如下参数设置(示例):
<expose>
  <class classes="public" methods="public" fields="public">
  </class>
</expose>

其中的参数说明如下:
    -classes:设置类名保护级别
    -methods:设置方法名保护级别
    -fields:设置类的成员变量保护级别

最新版本及详情请访问<a href="http://www.yworks.com/en/products_yguard_about.htm" target="_blank">yGuard官方网站</a>

 

以下是一个配置样例:
<?xml version="1.0"?>
<project name="ee2ee" default="obfuscate" basedir=".">

  <target name="init">
            <!-- The root directory of the workspace -->
            <property name="ee2ee.home" value="."/>

            <!-- The destination directory for the build -->
            <property name="ee2ee.build" value="${ee2ee.home}/build"/>

            <!-- The source directory for the build -->
            <property name="ee2ee.src" value="../"/>

            <!-- The destination directory for all the compiled classes. -->
            <property name="ee2ee.bin_dir" value="${ee2ee.build}/classes"/>

            <!-- The classpath used for building the workspace. -->
            <property name="ee2ee.classpath" value="../libs/j2ee.jar;${ee2ee.home}/libs/log4j-1.2.6.jar"/>

            <!-- The classpath used for building the workspace. -->
            <property name="jar" value="test.jar"/>

            <!-- The classpath used for building the workspace. -->
            <property name="obfjar" value="test_obf.jar"/>

            <!-- The classpath used for building the workspace. -->
            <property name="obflog" value="test_obflog.xml"/>

            <!-- The root directory of web server context -->
            <property name="webserver.home" value="D:\projects\exam\website\WEB-INF\classes"/>
  </target>

  <target name="compile" depends="init">
    <mkdir dir="${ee2ee.bin_dir}"/>
    <javac srcdir="${ee2ee.src}"
           destdir="${ee2ee.bin_dir}"
           classpath="${ee2ee.classpath}"
           includes="com/ee2ee/*.java"
           debug="on"
           encoding="gb2312"
           failonerror="true"/>
  </target>

  <target name="components" depends="init">
  </target>
 
   <target depends="jar" name="obfuscate">
    <taskdef name="obfuscate" classname="com.yworks.yguard.ObfuscatorTask"
            classpath="yguard.jar"/>
        <!-- the following can be adjusted to your needs -->
        <obfuscate mainclass="com.ee2ee.Obtest" logfile="${obflog}"
                replaceclassnamestrings="true">
           <property name="error-checking" value="pedantic"/>
           <inoutpair in="${jar}" out="${obfjar}"/>
           <expose>
              <class classes="none" methods="none" fields="none">
              </class>
           </expose>
        </obfuscate>
    </target>
  <!-- create .jar -->
    <target name="jar" depends="compile">
            <jar jarfile="${jar}"
                    basedir="${ee2ee.bin_dir}"
                    includes="com/ee2ee/*">
              <fileset dir="${ee2ee.src}">
                <include name="com/ee2ee/**/*.properties"/>
              </fileset>
            </jar>
    </target>

    <!-- run project -->
    <target name="run" depends="obfuscate">
            <java  fork="true">
                    <classpath>
                      <pathelement location="${obfjar}"/>
                    </classpath>
            </java>
    </target>


  <target name="clean" depends="init">
        <delete dir="${ee2ee.build}"/>
  </target>

  <target name="copy" depends="init">
        <copy todir="${webserver.home}">
            <fileset dir="${ee2ee.bin_dir}">
                <include name="com/**/*.class"/>
            </fileset>
        </copy>
  </target>
 
  <!--<target name="core" depends="compile, components"/>-->
  <target name="core" depends="compile"/>

  </project>