我最近从Apache Tomcat 6.X升级到7.X,再升级到8.0.12。我目前能够在tomcat 8中编译和运行我的应用程序;然而,我的ant预编译jsp的任务已经不起作用了。奇怪的是,如果我切换回tomcat 7而不做任何其他更改,JspC调用就会工作!
以下是蚂蚁任务的错误输出:
2014年9月17日下午4:01:23 org.apache.jasper.servlet.Tld扫描仪扫描Jars信息:至少扫描了一个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(ParserContrler.java:227)网址:org.apache.jasper.compiler.ParserController.parse(ParserContrler.java:100)网址:org.apache.jasper.compiler.compiler.generateJava(compiler.java:199)网址:org.apache.jasper.compiler.compiler.compiler(compiler.java:356)网址:org.apache.jasper.JspC.processFile(JspC.java:1217)网址:org.apache.jasper.JspC.execute(JspC.java:1368)网址:org.apache.tools.ant.UnnknownElement.execute(UnknownElement.java:292)位于sun.reflect.GeneratedMethodAccessor7.invoke(未知源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)位于java.lang.reflect.Method.ioke(Method.java:483)网址:org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtil.java:106)网址:org.apache.tools.ant.Task.aperform(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.slaunching.remote.EclipseDefaultExecutior.executeTargets(EclipseDefaultExecutior.java:36)网址:org.apache.tools.ant.Project.executeTargets(Project.java:1248)网址:org.eclipse.ant.internal.slaunching.remote.InternalAntRunner.run(InternalAntRunner.java:452)网址:org.eclipse.ant.internal.slaunching.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>
我试过使用taglib,并确保它们都被正确声明。据我所知,他们是。我无法解释来自TldCache.java的NullPointerException的原因。是否有其他人经历过这种情况或对可能的解决方案有任何想法?
我发现我在WEB-INF/tags目录中定义了一个.tld文件,该文件在ant目标中被明确排除。从ant目标中删除排除是不起作用的,所以我将.tld定义移动到/WEB-INF/jsps。我还必须恢复jasper taskdef的定义,根据Apache的文档,我将其更改为从catalina-ant.xml
导入。
总之,将.tld从WEB-INF/tags
移动到WEB-INF/jsps
,并在ant中添加了一个jasper taskdef。
蚂蚁的最终任务如下:
<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>