当前位置:软件学习 > 其它软件 >>

如何使用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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,