Apusic jspc预编译提高访问速度

  • Post author:
  • Post category:其他


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



版权声明:本文为sinat_22688841原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。