4

我最近从 Apache Tomcat 6.X 升级到 7.X 到 8.0.12。我目前能够在 tomcat 8 中编译和运行我的应用程序;但是,我用于预编译 jsps 的 ant 任务不再有效。奇怪的是,如果我切换回 tomcat 7 而不进行任何其他更改,则 JspC 调用将起作用!

这是 ant 任务的错误输出:

2014 年 9 月 17 日下午 4:01:23 org.apache.jasper.servlet.TldScanner scanJars
    信息:至少有一个 JAR 已扫描 TLD,但未包含 TLD。启用此记录器的调试日志记录以获取已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。
    java.lang.NullPointerException
        在 org.apache.jasper.compiler.TldCache.getTaglibXml(TldCache.java:97)
        在 org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:179)
        在 org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:411)
        在 org.apache.jasper.compiler.Parser.parseDirective(Parser.java:469)
        在 org.apache.jasper.compiler.Parser.parseElements(Parser.java:1428)
        在 org.apache.jasper.compiler.Parser.parse(Parser.java:139)
        在 org.apache.jasper.compiler.ParserController.doParse(ParserController.java:227)
        在 org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
        在 org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:199)
        在 org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
        在 org.apache.jasper.JspC.processFile(JspC.java:1217)
        在 org.apache.jasper.JspC.execute(JspC.java:1368)
        在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        在 sun.reflect.GeneratedMethodAccessor7.invoke(未知来源)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        在 java.lang.reflect.Method.invoke(Method.java:483)
        在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        在 org.apache.tools.ant.Task.perform(Task.java:348)
        在 org.apache.tools.ant.Target.execute(Target.java:435)
        在 org.apache.tools.ant.Target.performTasks(Target.java:456)
        在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        在 org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        在 org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:36)
        在 org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        在 org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:452)
        在 org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:139)

这是蚂蚁任务:

<target name="jspc-tomcat" depends="compile" description="compile jsps using tomcat jspc">
    <copy overwrite="false" file="${webxml.dir}/web.xml" tofile="web/WEB-INF/web.xml" />

    <jasper
        uriroot="web"
        outputDir="${build.dir}/JSP/src" />

    <delete file="web/WEB-INF/web.xml"/>
</target>
<target name="compile-jsps" depends="jspc-tomcat" description="compile jsps using apache tomcat">
    <mkdir dir="${build.dir}/JSP/classes"/>
    <mkdir dir="${build.dir}/JSP/lib"/>
    <javac memoryInitialSize="128m" memoryMaximumSize="512m" destdir="${build.dir}/JSP/classes"
        optimize="off" fork="true"
        debug="on" failonerror="false" source="1.8" target="1.8"
        srcdir="${build.dir}/JSP/src" includeantruntime="false"
        excludes="**/*.smap">
        <classpath>
            <fileset dir="${local.ctx1.home}/lib">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="${local.ctx1.home}/bin">
                <include name="*.jar"/>
            </fileset>
            <pathelement path="${rade2.class.dir}" />
            <path refid="compile_classpath" />
        </classpath>
        <include name="**" />
        <exclude name="tags/**" />
    </javac>
</target>

我尝试过使用标签库并确保它们都被正确声明。据我所知,他们是。我无法解释来自 TldCache.java 的 NullPointerException 的原因。有没有其他人经历过这种情况或对可能的解决方案有任何想法?

4

1 回答 1

2

我发现我在我的 WEB-INF/tags 目录中定义了一个 .tld 文件,该文件被明确排除在 ant 目标中。从 ant 目标中删除排除项不起作用,因此我将 .tld 定义移动到 /WEB-INF/jsps。我还必须恢复我对 jasper taskdef 的定义,我已将其更改为从catalina-ant.xmlApache的文档中导入。

总之,将 .tld 从WEB-INF/tagsto移动WEB-INF/jsps并在 ant 中添加了 jasper taskdef。

最终的ant任务如下:

<target name="jspc-tomcat" depends="compile"
 description="compile jsps using tomcat jspc">
    <copy overwrite="false" file="${webxml.dir}/web.xml"
        tofile="web/WEB-INF/web.xml" />
    <taskdef classname="org.apache.jasper.JspC" name="jasper">
        <classpath id="jspc.classpath">
            <pathelement location="${java.home}/../lib/tools.jar"/>
            <fileset dir="${local.ctx1.home}/bin">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="${local.ctx1.home}/lib">
                <include name="*.jar"/>
            </fileset>
            <pathelement path="${rade2.class.dir}" />
            <path refid="compile_classpath" />
        </classpath>
    </taskdef>

    <jasper
        uriroot="web"
        outputDir="${build.dir}/JSP/src" />

    <delete file="web/WEB-INF/web.xml"/>
</target>
<target name="compile-jsps" depends="jspc-tomcat" description="compile jsps using apache tomcat">
    <mkdir dir="${build.dir}/JSP/classes"/>
    <mkdir dir="${build.dir}/JSP/lib"/>
    <javac memoryInitialSize="128m" memoryMaximumSize="512m" destdir="${build.dir}/JSP/classes"
        optimize="off" fork="true"
        debug="on" failonerror="false" source="1.8" target="1.8"
        srcdir="${build.dir}/JSP/src" includeantruntime="false"
        excludes="**/*.smap">
        <classpath>
            <fileset dir="${local.ctx1.home}/lib">
                <include name="*.jar"/>
            </fileset>
            <fileset dir="${local.ctx1.home}/bin">
                <include name="*.jar"/>
            </fileset>
            <pathelement path="${rade2.class.dir}" />
            <path refid="compile_classpath" />
        </classpath>
        <include name="**" />
        <exclude name="tags/**" />
    </javac>
</target>
于 2014-09-19T20:45:15.717 回答