如何将混淆的 jar 文件包含到 war 文件中 [英] How to include obfuscated jar file into a war file

查看:36
本文介绍了如何将混淆的 jar 文件包含到 war 文件中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的 Web 应用程序中,为了混淆源代码,我使用了 yGuard 并获得了一个混淆的 jar 文件.现在我将此 jar 文件放入 WEB-INF/lib 文件夹(因为我的 jsp 文件引用了 java 文件)并使用以下 ant 脚本打包了 war 文件:

In my web application, to obfuscate the source code, i used yGuard and got an obfuscated jar file. Now i placed this jar file into the WEB-INF/lib folder (as my jsp files have reference to the java files) and packaged the war file using below ant script :

<?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>

但是当我将这个 war 文件部署到 tomcat 并访问 index.jsp 时,它会在浏览器上引发以下异常:

But when i deployed this war file to tomcat and accessed the index.jsp it throws following exception on browser :

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

现在我的问题是:

  • 混淆后为什么jsp文件无法获取class文件的引用?
  • 我应该怎么做才能将混淆后的 jar 文件包含到 war 文件中以使其完美运行(或解决上述问题)?

推荐答案

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

YGaurd is supposed to read your jar for a Main-Class attribute... Your ant to generate the manifest looks correct, does the manifest come out OK?

您还可以在重命名元素中指定一个主类:

You can also specify a mainclass in your rename element: <rename logfile="renamelog.xml" mainclass="${main-class}>

这两种方法都应该防止您的主类被混淆.

Both methods should prevent your main class from being obfuscated.

这篇关于如何将混淆的 jar 文件包含到 war 文件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆