2012-01-24 118 views
2

在我的web应用程序中,为了混淆源代码,我使用了yGuard并且得到了一个混淆的jar文件。现在我把这个jar文件到WEB-INF/lib目录文件夹(如我的JSP文件具有参考java文件)和包装使用以下Ant脚本战争文件:如何将混淆的jar文件包含到war文件中

<?xml version="1.0" encoding="UTF-8"?>  
    <project name="MyWebApp" default="war" basedir="."> 
     <property file="build.properties" /> 
     <property name="war-file-name" value="${project-name}.war" /> 
     <property name="source-directory" value="src" /> 
     <property name="classes-directory" value="WebRoot/WEB-INF/classes" /> 
     <property name="web-directory" value="WebRoot" /> 
     <property name="web-xml-file" value="WebRoot/WEB-INF/web.xml" /> 
     <property name="build-directory" value="build" /> 
     <property name="lib-dir" value="WebRoot/WEB-INF/lib" /> 
     <property name="main-class" value="com.Main"/> 

     <path id="compile.classpath"> 
     <fileset dir="${lib-dir}"> 
      <include name="*.jar"/>   
     </fileset> 
     </path> 

     <target name="clean"> 
     <delete dir="${classes-directory}" />  
     <delete dir="${build-directory}" />     
     </target> 

     <!-- Creates the build, docs and dist directory--> 
     <target name="makedir"> 
     <mkdir dir="${classes-directory}" />  
     <mkdir dir="${build-directory}" /> 
     </target> 

     <target name="compile" depends="clean, makedir"> 
     <javac srcdir="${source-directory}" destdir="${classes-directory}" includeantruntime="false"> 
      <classpath refid="compile.classpath"/> 
     </javac> 
     <copy todir="${classes-directory}"> 
      <fileset dir="src" includes="**/*.properties"/> 
     </copy> 
     </target> 

     <target name="jar" depends="compile"> 
      <jar destfile="${build-directory}/${ant.project.name}.jar" basedir="${classes-directory}"> 
        <manifest> 
         <attribute name="Main-Class" value="${main-class}"/> 
        </manifest> 
      </jar> 
     </target> 

     <path id="external.lib.path"> 
     <fileset dir="${lib-dir}" includes="*.jar"/> 
     </path> 

     <target name="yguard" depends="jar"> 
     <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="yguard.jar"/> 
     <yguard> 

      <inoutpair in="${build-directory}/${ant.project.name}.jar" out="${build-directory}/${ant.project.name}_obf.jar"/> 

     <externalclasses refid="external.lib.path"/> 

      <rename logfile="renamelog.xml"> 
       <keep> 
       <method name="void main(java.lang.String[])"> 
        <patternset> 
        <include name="com.*"/> 
        <include name="misc.*"/> 
        <include name="client.*"/> 
        </patternset> 
       </method> 
       </keep> 
      </rename> 
       </yguard> 

     <copy file="${build-directory}/${ant.project.name}_obf.jar" todir="${lib-dir}"/> 
    </target> 

    <target name="war" depends="yguard"> 
     <war warfile="${build-directory}/${war-file-name}" webxml="${web-xml-file}"> 
     <fileset dir="${web-directory}"> 
      <!-- Need to exclude it since webxml is an attribute of the war tag above --> 
      <exclude name="WEB-INF/web.xml" /> 
      <exclude name="WEB-INF/lib/servlet-api.jar" /> 
      <exclude name="WEB-INF/lib/jsp-api.jar" /> 
      <exclude name="WEB-INF/classes/**/" /> 
     </fileset>   
     </war> 
    </target> 
    </project> 

但是当我部署此战争文件到Tomcat和访问它抛出的index.jsp以下浏览器的例外:

javax.servlet.ServletException: java.lang.NoClassDefFoundError: com/Main 

现在我的问题是:

  • 混淆为什么JSP连接后乐无法获得类文件的参考?
  • 我该怎么做才能将我的模糊jar文件包含到war文件中以完美工作(或解决上述问题)?

回答

0

YGaurd应该读取您的jar的Main-Class属性...您的蚂蚁生成清单看起来是正确的,清单出来了吗?

您也可以在重命名元素指定mainclass: <rename logfile="renamelog.xml" mainclass="${main-class}>

这两种方法应防止主类中被混淆。

+0

感谢您的回复。上面的ant脚本成功地混淆并构建了一个war文件。我希望我的主要类必须被混淆。 –

相关问题