现在的位置: 首页 > 综合 > 正文

脱离ws_ant直接使用Ant调用WebSphere编译器将jsp编译成class

2012年04月17日 ⁄ 综合 ⁄ 共 3593字 ⁄ 字号 评论关闭

脱离ws_ant直接使用Ant调用WebSphere编译器将jsp编译成class

WAS的编译检查是非常严格的,JSP中往往有些是因为将单引号写成了双引号就会编译不过去,如下:

<sc:hidden name="trsftg"  default="<%=valueGet.get(request,"/DataPacket/Request/Data/trsftg","") %>"/>

此时因为default属性在取值的JAVA代码中内部有双引号,且此时用于包含default属性值是采用的双引号,因而WAS在编译的时候就会报错
应该写成:

<sc:hidden name="trsftg"  default='<%=valueGet.get(request,"/DataPacket/Request/Data/trsftg","") %>'/>

这些虽然都是小问题,但是实际操作的过程中,可能还会经常出错。以下引用了一篇网文,该文说明了如何脱离WAS进行预编译JSP,这样我们可以通过预编译的日志查看原来编译不过去的JSP是什么问题(我是因为没有在WAS中找到JSP的预编译日志才尝试了这种方法),这里讲的是整个工程的预编译,实际操作中可以只拷贝编译不过去的JSP到另外的地方,再执行这样的编译,这样就具有针对性。

原文来自:http://yulimin.javaeye.com/blog/412504,经验证该方法可行,此处做相应的解析说明。

tomcat5下,jsp是通过使用tomcat提供的org.apache.jasper.JspC编译工具将JSP 页面的预编译WAS当中是通过 com.ibm.websphere.ant.tasks.JspC  进行预编译。

完整的Ant脚本 build.xml 文件内容,可将该文件置于任何目录中:

<?xml version="1.0" encoding="GBK"?>    

<project name="WAS JSP PreCompile" default="jspc" basedir=".">   

<!-- 设置washome --> 

<property name="was.home" location="D:/IBM/WebSphere/AppServer"/>    

<!-- location指定当前应用所在的路径,指定到JSP所在目录(WEB-INF的上一级目录) -->

<property name="webapp.path" location="D:/IBM/WebSphere/AppServer/installableApps/DefaultApplication/DefaultWebApplication"/>    

<!-- 这里设置预编译后生成的.class.java的存放路径 -->

    <property name="jspc.path" location="${webapp.path}/jspc"/>    

    <!-- 是否保留生成的.java文件 -->    

    <property name="java.keep" value="true"/>    

    <!-- ;${was.home}/runtimes/com.ibm.ws.webservices.thinclient_6.1.0.jar -->    

    <property name="jsp.classpath" value="${was.home}/lib/bootstrap.jar;${was.home}/lib/startup.jar;${was.home}/lib/j2ee.jar"/>    

    <target name="make-dir">    

        <mkdir dir="${jspc.path}"/>    

    </target>    

    <!-- 定义 WAS JSP 预编译任务 -->    

    <taskdef name="wsjspc" classpath="${was.home}/plugins/com.ibm.ws.runtime_6.1.0.jar" classname="com.ibm.websphere.ant.tasks.JspC"/>    

    <!-- 调用 WAS JSP 预编译工具,进行对 JSP 进行编译 -->    

    <target name="jspc" depends="make-dir">    

        <wsjspc wasHome="${was.home}" src="${webapp.path}" toDir="${jspc.path}" forcecompilation="true" verbose="true" deprecation="false" loglevel="CONFIG" keepgenerated="${java.keep}" classpath="${jsp.classpath}"/>    

    </target>    

    <!-- 当前工程EAR文件所在路径 --> 

    <property name="ear.path" location="D:/project/tmpimps.ear"/>

    <!-- 解压缩EAR文件的存放路径 -->

    <property name="extract.dir" location="${was.home}/temp/DefaultApplication.earextract"/>    

    <!-- 编译整个EAR -->    

    <target name="jspcEar">    

        <mkdir dir="${extract.dir}"/>    

        <wsjspc wasHome="${was.home}" earpath="${ear.path}" forcecompilation="true" extractToDir="${extract.dir}" useThreadTagPool="true" keepgenerated="${java.keep}" jspCompileClasspath="" classpath="${jsp.classpath}" loglevel="CONFIG"/>    

    </target>      

</project>   

注意:就是多了一个包就会编译不出来,汗。。。看我注释掉的那个jar包: 

com.ibm.ws.webservices.thinclient_6.1.0.jar   

转到build.xml所在目录,执行如下命令,并将结果输出到日志文件中便于查看:

ant jspc >jspc.log

即开始编译,但运行仍会提示:

引用

无法语法分析 setupCmdLinE: null/bin/setupCmdLine.bat (系统找不到指定的路径。

无法语法分析 setupCmdLinE: null/bin/setupCmdLine.bat (系统找不到指定的路径。)

直接无视它即可。 

编译成功的话会有: 

1ant jspc

引用

   [wsJspC] _internalCompileApp() returning returnCode: [0] 

   [wsJspC] JSPG0151I: 返回码:

   [wsJspC] JSPG0168I: 批处理编译器成功退出并且没有错误。

2ant jspcEar

引用

[wsJspC] JSPG0186I: 正在保存 D:/IBM/WebSphere/AppServer/temp/DefaultApplication.earextract/DefaultApplication.ear 

[wsJspC] JSPG0187I: 保存已完成。 

[wsJspC] JSPG0168I: 批处理编译器成功退出并且没有错误。

如果有问题最好是通过如何ANT命令检查:

ant -verbose    

来查看详细的错误再进行对应的分析即可。 

BTW:我的测试环境是:Windows XP SP3 + WAS 6.1.0.23 

更多关于wsJspC的信息请参考InfoCenter: 

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/topic/com.ibm.websphere.base.doc/info/aes/ae/rweb_jspant.html

本文出自:冯立彬的博客

抱歉!评论已关闭.