В моем веб-приложении, чтобы запутать исходный код, я использовал yGuard и получил запутанный файл jar. Теперь я поместил этот jar-файл в папку WEB-INF / lib (так как мои jsp-файлы имеют ссылки на java-файлы) и упаковал военный файл, используя приведенный ниже скрипт ant:
<?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, чтобы он работал идеально (или решил вышеуказанную проблему)?