Apusic jspc预编译提高访问速度
众所周知,jsp页面初次访问比较慢,体验很差,解决的方案通常都想到的是预编译jsp页面,以提高页面访问的速度,Apusic服务器提供了对应的jspc功能,可是对应的文档说明非常简单,而且,其编译的jsp只包含jsp、jspx版本,并没有提供jspf等其他后缀版本的编译,而且,此jspc功能编译时并不会输出很多可供参考的debug信息,测试发现,当存在jspf引入,并且依赖其他编译包时,验证结果是经常卡死,页面没有编译或者启动一次编译一次,编译的class文件不能指定路径,只能是javax_之类的文件夹下,由于多次都没有编译成功,所以只能结束jspc功能的探索与冒险。但是访问性能问题终究是要解决的,于是,采用了开源jspc进行编译,一般J2EE容器都提供相应的jspc预编译工具包,可能我这个项目很特别,首先,此项目PRD环境还是运行在jdk6版本上,依赖的EJB等服务也是JDK6,要统一切换JDK8操作性可以,不过需要验证及相应的投入,而且其他旧有的很多依赖还存在,暂时就没有升级。万不得已,只能采用其他容器的jspc工具包,将jsp预编译后上传到PRD环境,进行部署。说起来容易,真正操作起来困难重重,Apusic容器是独立的应用容器,有完整的jsp加载及运行的机制,即使采用的开源jspc工具包预编译页面,加载预编译class文件时出现各种不能cast to的异常,实在没有版本,只能将就着将Apusic加载jsp运行的PageContextImp进行了修改,以达到加载预编译class文件时能够采用jspc编译时依赖的包文件,避免冲突。尽管此方案不建议采用,但是为了访问性,变通一下也是可以的。具体的操作步骤如下:
1.maven的Web项目引用开源的jspc插件,并进行编译配置,只有prd模式下才进行预编译
2.Apusic启用jsp预编译配置,路径%APUSIC_HOME%/domains/${project}/config/web.xml
将jsp.nocompile配置设定为true,
<context-param>
<description>
Do not compile JSP source file, usefull for pre-compiled web
application bundles which no JSP source files shipped with.
</description>
<param-name>jsp.nocompile</param-name>
<param-value>true</param-value>
</context-param>
将非jsp、jspx的jsp文件配置相应的映射
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspf</url-pattern>
</servlet-mapping>
<jsp-property-group>
<description>default JSPF property group</description>
<url-pattern>*.jspf</url-pattern>
<el-ignored>false</el-ignored>
<scripting-invalid>false</scripting-invalid>
<is-xml>true</is-xml>
</jsp-property-group>
3.添加jspc预编译依赖包,测试采用的是,必须jdk6模式下才能编译
<groupId>org.codehaus.mojo.jspc</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>2.0-alpha-3</version>
libs放置到%APUSIC_HOME%/lib/ext下
catalina-6.0.18.jar
jasper-6.0.18.jar
jasper-el-6.0.18.jar
juli-6.0.18.jar
taglibs-standard-impl-1.2.5.jar
4.删除apusic.jar包中com.apusic.web.jsp.runtime对应的两个文件
JspApplicationContextImpl.class
PageContextBase.class
并在%APUSIC_HOME%/lib/下添加apusic-jspc-support-1.0.1.jar
这样做的目的就是使得apusic加载jsp时采用依赖的jspc预编译依赖的包,而不是apusic容器自带的jsp加载类
5.web.xml中需要添加jspc预编译时生成的servlet映射关系,通常在target/web-fragment.xml
6.由于开发环境并不需要进行jspc的处理,因此jspc配置可以配置为PRD环境部署时才进行预编译,maven配置如下:
<profiles>
<profile>
<id>prd</id>
<activation>
<property>
<name>prd</name>
</property>
</activation>
<build>
<plugins>
<!-- jspc config for lower than jdk 1.7 -->
<plugin>
<groupId>org.codehaus.mojo.jspc</groupId>
<artifactId>jspc-maven-plugin</artifactId>
<version>2.0-alpha-3</version>
<executions>
<execution>
<id>jspc</id>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<!--the later mentioned <sources> gets picked-->
<sources>
<directory>${basedir}/src/main/webapp</directory>
</sources>
<!--1.6 doesn't work!? Something lower than 1.5 seems to be the default-->
<verbose>1</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.mojo.jspc</groupId>
<artifactId>jspc-compiler-tomcat6</artifactId>
<version>2.0-alpha-3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Netbean等IDE工具执行时,需呀在配置文件中指定prd进行编译即可
或者mvn -Dprd clean install