背景:
tomcat的jspc编译需要引用ant,而且内部是自己扫描的jsp文件。本人做框架时已经有项目里所有的jsp文件路径,不想引用ant包,因此简化了jspc类。
框架传送门:
https://github.com/xiangjiangchuangyuan/struts
https://github.com/xiangjiangchuangyuan/util --此为工具包
调用:
// 判断线上环境,执行预编译 if (jspList.size() > 0 && WebContextUtils.isLinuxOS()) { new JspC(sc, jspList, true).execute(); }
具体代码:
package com.xjcy.struts.context; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.Vector; import javax.servlet.ServletContext; import javax.servlet.jsp.tagext.TagLibraryInfo; import org.apache.jasper.JasperException; import org.apache.jasper.JspCompilationContext; import org.apache.jasper.Options; import org.apache.jasper.compiler.JspConfig; import org.apache.jasper.compiler.JspRuntimeContext; import org.apache.jasper.compiler.TagPluginManager; import org.apache.jasper.compiler.TldCache; import org.apache.jasper.servlet.JspCServletContext; import org.apache.jasper.servlet.TldScanner; import org.apache.log4j.Logger; import org.xml.sax.SAXException; import com.xjcy.util.FileUtils; /*** * 预编译jsp文件,移除ant引用 2018-04-10 * * @author YYDF * */ public class JspC implements Options { static final Logger logger = Logger.getLogger(JspC.class); private String uriRoot; private File scratchDir; private JspCServletContext context; private TldScanner scanner; private TldCache tldCache; private JspRuntimeContext rctxt; private JspConfig jspConfig; private TagPluginManager tagPluginManager; private final List<String> pages = new Vector<>(); private static final String Encoding = "UTF-8"; public JspC(ServletContext sc, boolean clear) { this(sc, null, clear); } public JspC(ServletContext sc, List<String> jspList, boolean clear) { this.uriRoot = sc.getRealPath("/"); String outputDir = sc.getRealPath(StrutsContext.CLASS_PATH); this.scratchDir = new File(outputDir); try { if (jspList != null) { pages.addAll(jspList); logger.debug("Add pages with list " + jspList.size()); } initServletContext(this.getClass().getClassLoader()); if (clear) { File output = new File(outputDir + "/org"); if (output.exists()) { FileUtils.deleteDir(output); logger.debug("Deleted dir " + output.getPath()); } } } catch (JasperException | IOException e) { logger.error("Init context faild", e); } } public void setJspFiles(String jspFiles) { if (jspFiles == null) { return; } StringTokenizer tok = new StringTokenizer(jspFiles, ","); while (tok.hasMoreTokens()) { pages.add(tok.nextToken()); } } public void execute() { long start = System.currentTimeMillis(); Iterator<String> iter = pages.iterator(); while (iter.hasNext()) { processFile(iter.next()); } logger.debug("Jsp servlet build success in " + (System.currentTimeMillis() - start) + " ms"); } protected void initServletContext(ClassLoader loader) throws IOException, JasperException { URL resourceBase = new File(uriRoot).getCanonicalFile().toURI().toURL(); context = new JspCServletContext(new PrintWriter(System.out), resourceBase, loader, false, false); try { scanner = new TldScanner(context, false, false, false); scanner.scan(); } catch (SAXException e) { throw new JasperException(e); } tldCache = new TldCache(context, scanner.getUriTldResourcePathMap(), scanner.getTldResourcePathTaglibXmlMap()); rctxt = new JspRuntimeContext(context, this); jspConfig = new JspConfig(context); tagPluginManager = new TagPluginManager(context); } protected void processFile(String file) { try { String jspUri = file.replace('\\', '/'); JspCompilationContext clctxt = new JspCompilationContext(jspUri, this, context, null, rctxt); logger.debug("Compiling file: " + file); clctxt.createCompiler().compile(true, true); } catch (Exception e) { logger.error("Compile '" + file + "' faild", e); } } @Override public boolean getErrorOnUseBeanInvalidClassAttribute() { // TODO Auto-generated method stub return false; } @Override public boolean getKeepGenerated() { // TODO Auto-generated method stub return false; } @Override public boolean isPoolingEnabled() { // TODO Auto-generated method stub return false; } @Override public boolean getMappedFile() { // TODO Auto-generated method stub return false; } @Override public boolean getClassDebugInfo() { // TODO Auto-generated method stub return false; } @Override public int getCheckInterval() { // TODO Auto-generated method stub return 0; } @Override public boolean getDevelopment() { // TODO Auto-generated method stub return false; } @Override public boolean getDisplaySourceFragment() { // TODO Auto-generated method stub return false; } @Override public boolean isSmapSuppressed() { // TODO Auto-generated method stub return false; } @Override public boolean isSmapDumped() { // TODO Auto-generated method stub return false; } @Override public boolean getTrimSpaces() { return true; } @Override public String getIeClassId() { return "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"; } @Override public File getScratchDir() { return scratchDir; } @Override public String getClassPath() { // TODO Auto-generated method stub return null; } @Override public String getCompiler() { // TODO Auto-generated method stub return null; } @Override public String getCompilerTargetVM() { // TODO Auto-generated method stub return null; } @Override public String getCompilerSourceVM() { // TODO Auto-generated method stub return null; } @Override public String getCompilerClassName() { return "org.apache.jasper.compiler.JDTCompiler"; } @Override public TldCache getTldCache() { return tldCache; } @Override public String getJavaEncoding() { return Encoding; } @Override public boolean getFork() { // TODO Auto-generated method stub return false; } @Override public JspConfig getJspConfig() { return jspConfig; } @Override public boolean isXpoweredBy() { // TODO Auto-generated method stub return false; } @Override public TagPluginManager getTagPluginManager() { return tagPluginManager; } @Override public boolean genStringAsCharArray() { return true; } @Override public int getModificationTestInterval() { // TODO Auto-generated method stub return 0; } @Override public boolean getRecompileOnFail() { // TODO Auto-generated method stub return false; } @Override public boolean isCaching() { // TODO Auto-generated method stub return false; } @Override public Map<String, TagLibraryInfo> getCache() { // TODO Auto-generated method stub return null; } @Override public int getMaxLoadedJsps() { // TODO Auto-generated method stub return 0; } @Override public int getJspIdleTimeout() { // TODO Auto-generated method stub return 0; } @Override public boolean getStrictQuoteEscaping() { // TODO Auto-generated method stub return false; } @Override public boolean getQuoteAttributeEL() { // TODO Auto-generated method stub return false; } }