2012-01-24 185 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文件。我希望我的主要類必須被混淆。 –

相關問題