如何使用ant调用WebSphere的编译器将jsp编译成jar包?
我们现有的项目是运行在tomcat5下,jsp是通过使用tomcat提供的org.apache.jasper.JspC编译工具将JSP 页面的预编译。把所有 JSP 编译后得到的 .class 打包成一个 xxx.jar包,放在我们应用的lib中。然后在 web.xml 中分别设置为 servlet,再映射到某个 xxx.jsp 的 URL 上。build.xml文件如下:<project name="Webapp Precompilation" default="all" basedir=".">
<property name="tomcat.home" location="D:\Tomcat 5.0\"/>
<property name="webapp.path" location="D:\newRoot\procompile\"/>
<property environment="env" />
<target name="jspc">
<taskdef classname="org.apache.jasper.JspC" name="jasper2" >
<classpath id="jspc.classpath">
<pathelement location="C:/Program Files/Java/jdk1.5.0_08/lib/tools.jar"/>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/server/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
<jasper2
validateXml="false"
uriroot="${webapp.path}"
webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml"
outputDir="${webapp.path}/WEB-INF/src" />
</target>
<target name="compile">
<mkdir dir="${webapp.path}/WEB-INF/classes"/>
<mkdir dir="${webapp.path}/WEB-INF/lib"/>
<javac destdir="${webapp.path}/WEB-INF/classes"
optimize="off"
failonerror="false"
srcdir="${webapp.path}/WEB-INF/src"
encoding="UTF-8"
fork="true"
memoryMaximumSize="256m"
nowarn="off"
debug="on"
excludes="**/*.smap">
<classpath>
<pathelement location="${webapp.path}/WEB-INF/classes"/>
<fileset dir="${webapp.path}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</classpath>
<include name="**" />
<exclude name="tags/**" />
</javac>
<jar jarfile="${webapp.path}/WEB-INF/lib/xxx.jar" basedir="${webapp.path}/WEB-INF/classes"/>
</target>
<target name="all" depends="jspc,compile">
</target>
</project>
现如今将该应用放到WAS6.1下运行,报错,查到的原因是使用的xxx.jar包有关(tomcat编译的jar包,was无法识别),我想通过ant调用was提供的编译工具生成一个was可以识别的jar包,怎么编写build.xml文件呢?跪求高手们帮忙解决。 --------------------编程问答-------------------- 你们的这种做法比较罕见的。
猜测是不是CV层的分割没有做清楚,很多Business Logic放在JSP里了,但是business classes又需要访问这些business logic,所以把JSP做成JAR放到lib下。
除此之外,很难理解这么做的原因。按照J2EE的思想,JSP只是View层的东西,为什么要打包成JAR呢?如果为了避免compile-at-first-hit,WAS提供了选项在的deploy的时候,可以把JSP预编译的。
另外,WAS的Ant好像是修改过的,你要用WAS带的ant命令而不是Apache的ant --------------------编程问答-------------------- 我们确实是有很多业务放在了view层(这属于历史遗留问题),不希望客户通过部署文件中的jsp来了解一些业务,
此外,将jsp打成jar包的另一个目的是部署在tomcat下避免compile-at-first-hit;
你提到的was预编译jsp确实可以解决compile-at-first-hit,
但我仍旧希望使用was的编译工具将jsp编译后打成jar包,再在was上发布。
现写了一个build.xml文件,但运行有错,希望大家帮忙解决一下:
<project name="jsp" default="jspc_test" basedir=".">
<property name="was.home" location="D:\IBM2\WebSphere\AppServer"/>
<property name="webapp.path" location="D:\IBM2\ooo"/>
<target name="make-dir">
<mkdir dir="${webapp.path}\ttest\temp-jsp" />
<mkdir dir="${webapp.path}\ttest\war" />
</target>
<target name="jspc_test" depends="make-dir">
<taskdef name="wsjspc" classpath= "${was.home}/plugins/com.ibm.ws.runtime_6.1.0.jar" classname="com.ibm.websphere.ant.tasks.JspC" />
<!-- 此处好像是调用was的编译工具,进行对jsp的编译工作,目前仍未确定-->
<wsjspc wasHome="${was.home}"
src="${webapp.path}"
toDir="${webapp.path}/ttest/temp-jsp"
forcecompilation="true"
verbose="false"
deprecation="false"
loglevel="CONFIG"
/>
</target>
<!--编译java文件-->
<target name="compile">
<mkdir dir="${webapp.path}/WEB-INF/classes"/>
<mkdir dir="${webapp.path}/WEB-INF/lib"/>
<javac destdir="${webapp.path}/WEB-INF/classes"
optimize="off"
debug="on" failonerror="false"
srcdir="${webapp.path}/WEB-INF/src"
encoding="UTF-8"
excludes="**/*.smap">
<classpath>
<pathelement location="${webapp.path}/WEB-INF/classes"/>
<fileset dir="${webapp.path}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/common/classes"/>
<fileset dir="${tomcat.home}/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.home}/shared/classes"/>
<fileset dir="${tomcat.home}/shared/lib">
<include name="*.jar"/>
</fileset>
<fileset dir="${tomcat.home}/bin">
<include name="*.jar"/>
</fileset>
</classpath>
<include name="**" />
<exclude name="tags/**" />
</javac>
<jar jarfile="${webapp.path}/WEB-INF/lib/555.jar" basedir="${webapp.path}/WEB-INF/classes"/>
</target>
<target name="all" depends="jspc_test">
</target>
</project>
使用apache的ant后,错误如下:
D:\ant>ant
Buildfile: build.xml
make-dir:
jspc_test:
无法语法分析 setupCmdLinE: null\bin\setupCmdLine.bat (系统找不到指定的路径。)
无法语法分析 setupCmdLinE: null\bin\setupCmdLine.bat (系统找不到指定的路径。)
[wsJspC] java.lang.NoClassDefFoundError: com/ibm/wsspi/bootstrap/WSPreLaunche
r
[wsJspC] Caused by: java.lang.ClassNotFoundException: com.ibm.wsspi.bootstrap
.WSPreLauncher
[wsJspC] at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
[wsJspC] at java.security.AccessController.doPrivileged(Native Method)
[wsJspC] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[wsJspC] at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
[wsJspC] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
[wsJspC] at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
[wsJspC] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
[wsJspC] Exception in thread "main"
[wsJspC] Java Result: 1
BUILD SUCCESSFUL
Total time: 2 seconds
错误当中的“无法语法分析 setupCmdLinE: null\bin\setupCmdLine.bat (系统找不到指定的路径。)”的bat文件路径是在${was.home}\bin\目录下,但不明白为啥是“null” --------------------编程问答-------------------- 最起码JSP中的逻辑可以挪到custom tag中,毕竟JSP的很多错误是无法再IDE中检测的。 --------------------编程问答-------------------- WAS中的Ant是修改过的,你不能用Apache的ant直接调用build.xml,必须用WAS下的Ant --------------------编程问答-------------------- 无法语法分析 setupCmdLinE: null\bin\setupCmdLine.bat (系统找不到指定的路径。)
应当是少了系统的环境变量设置
WAS_HOME你设置为环境变量就行了。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/topic/com.ibm.websphere.base.iseries.doc/info/iseries/ae/rweb_jspant.html?resultof=%22%4a%73%70%43%22%20%22%6a%73%70%63%22%20
运行ws_ant,不要用自己的ant,如果需要那就只能去剖析ws_ant设置的变量,然后自己去抽取出来了。 --------------------编程问答-------------------- 折腾了一下午,用我下面的代码居然可以了,现在又不行了,真是晕倒。
不用理那个错误,可以用我的 build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="WAS JSP PreCompile" default="jspcEar" basedir=".">
<property name="was.home" location="D:/IBM/WebSphere/AppServer"/>
<property name="webapp.path" location="D:/IBM/WebSphere/AppServer/installableApps/DefaultApplication/DefaultWebApplication"/>
<property name="jspc.path" location="${webapp.path}/jspc"/>
<!-- 是否保留生成的.java文件 -->
<property name="java.keep" value="true"/>
<property name="jsp.classpath" value="${was.home}/plugins/com.ibm.ws.runtime_6.1.0.jar;${was.home}/lib/bootstrap.jar;${was.home}/lib/startup.jar;${was.home}/lib/j2ee.jar;${was.home}/runtimes/com.ibm.ws.webservices.thinclient_6.1.0.jar"/>
<target name="make-dir">
<mkdir dir="${jspc.path}"/>
</target>
<!-- 定义 WAS JSP 预编译任务 -->
<taskdef name="wsjspc" classname="com.ibm.websphere.ant.tasks.JspC" classpath="${jsp.classpath}"/>
<!-- 调用 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>
<property name="ear.path" location="D:/IBM/WebSphere/AppServer/installableApps/DefaultApplication.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>
WAS与WLS的一样,都得先设置一堆的环境变量,然后才能做些ant相关的东西。至少WLS 8.1我碰到是这样的。麻烦,还是不要去折腾这个了。直接用好了。 --------------------编程问答-------------------- Shit,终于试回来了。就是多了一个包就会编译不出来,汗。。。看我注释掉的那个jar包:com.ibm.ws.webservices.thinclient_6.1.0.jar
<?xml version="1.0" encoding="UTF-8"?>
<project name="WAS JSP PreCompile" default="jspc" basedir=".">
<property name="was.home" location="D:/IBM/WebSphere/AppServer"/>
<property name="webapp.path" location="D:/IBM/WebSphere/AppServer/installableApps/DefaultApplication/DefaultWebApplication"/>
<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>
<property name="ear.path" location="D:/IBM/WebSphere/AppServer/installableApps/DefaultApplication.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>
楼主用我的代码试一下
有问题请用 ant -verbose 把错误信息放出来给我看看。
补充:企业软件 , WebSphere