私の Web アプリケーションでは、ソース コードを難読化するために、yGuardを使用して難読化された jar ファイルを取得しました。ここで、この jar ファイルをWEB-INF/libフォルダーに配置し (jsp ファイルが Java ファイルを参照しているため)、以下の ant スクリプトを使用して 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>
しかし、この war ファイルを tomcat にデプロイして index.jsp にアクセスすると、ブラウザで次の例外がスローされます。
javax.servlet.ServletException: java.lang.NoClassDefFoundError: com/Main
今私の質問は次のとおりです。
- 難読化後、jsp ファイルがクラス ファイルの参照を取得できないのはなぜですか?
- 難読化された jar ファイルを war ファイルに含めて完全に機能させる (または上記の問題を解決する) にはどうすればよいですか?