/** Compile the servlet from .java file to .class file */ protected void generateClass(String[] smap) throws FileNotFoundException, JasperException, Exception { long t1 = 0; if (log.isDebugEnabled()) t1 = System.currentTimeMillis(); List<String> parameters = new ArrayList<String>(20); parameters.add("-encoding"); parameters.add(ctxt.getOptions().getJavaEncoding()); String javaFileName = new File(ctxt.getServletJavaFileName()).getPath(); String classpath = ctxt.getClassPath(); String sep = File.pathSeparator; // System.getProperty("path.separator"); StringBuffer errorReport = new StringBuffer(); StringBuffer info = new StringBuffer(); info.append("Compile: javaFileName=" + javaFileName + "\n"); // Start capturing the System.err output for this thread SystemLogHandler.setThread(); // Initializing classpath String path = System.getProperty("java.class.path"); info.append(" cmd cp=" + path + "\n"); info.append(" ctx cp=" + classpath + "\n"); path += sep; path += classpath; if (log.isDebugEnabled()) log.debug("Using classpath: " + path); parameters.add("-classpath"); parameters.add(path); // Initializing sourcepath parameters.add("-sourcepath"); parameters.add(options.getScratchDir().getPath()); info.append(" work dir=" + options.getScratchDir() + "\n"); // Initialize and set java extensions String extdirs = System.getProperty("java.ext.dirs"); if (extdirs != null) { parameters.add("-extdirs"); parameters.add(extdirs); info.append(" extension dir=" + extdirs + "\n"); } if (ctxt.getOptions().getFork()) { String endorsed = System.getProperty("java.endorsed.dirs"); if (endorsed != null) { parameters.add("-endorseddirs"); // "-J-Djava.endorsed.dirs="+endorsed parameters.add(endorsed); info.append(" endorsed dir=" + endorsed + "\n"); } else { info.append(" no endorsed dirs specified\n"); } } if (ctxt.getOptions().getClassDebugInfo()) parameters.add("-g"); Exception ie = null; // Set the Java compiler to use if (javaCompiler == null) { // assumption, there is no dynamic changing Java compiler String compiler = options.getCompiler(); if (compiler == null) compiler = "com.sun.tools.javac.Main"; // verify compiler try { javaCompiler = Class.forName(compiler); } catch (ClassNotFoundException cnfe) { // try to figure out class path to compiler String compileClassPath = System.getProperty("java.home"); if (compileClassPath == null) try { compileClassPath = System.getenv("JAVA_HOME"); if (compileClassPath == null) compileClassPath = System.getenv("java_home"); } catch (SecurityException se) { } if (compileClassPath != null) { // HACK for now compileClassPath = compileClassPath.replace("jre", "jdk"); compileClassPath += "/lib/tools.jar"; info.append(" checking default compiler in " + compileClassPath + "\n"); try { javaCompiler = Class.forName( compiler, true, new URLClassLoader(new URL[] {new URL("file", "localhost", compileClassPath)})); } catch (Error er) { log.error("Setting up Java compiler error ", er); } catch (Exception ex) { log.error("Setting up Java compiler exception ", ex); } } else info.append(" no Java home path specified\n"); } info.append(" compiler=" + compiler + "\n"); } if (options.getCompilerTargetVM() != null) { parameters.add("-target"); parameters.add(options.getCompilerTargetVM()); info.append(" compilerTargetVM=" + options.getCompilerTargetVM() + "\n"); } if (options.getCompilerSourceVM() != null) { parameters.add("-source"); parameters.add(options.getCompilerSourceVM()); info.append(" compilerSourceVM=" + options.getCompilerSourceVM() + "\n"); } info.append(" JavaPath=" + ctxt.getJavaPath() + "\n"); parameters.add(javaFileName); boolean compilationErrors = false; String errorCapture = null; if (javaCompiler != null) try { Integer success; Method cm = javaCompiler.getMethod("compile", new Class[] {String[].class}); if (ctxt.getOptions().getFork()) { success = (Integer) cm.invoke(null, new Object[] {parameters.toArray(new String[parameters.size()])}); } else { synchronized (javacLock) { success = (Integer) cm.invoke( null, new Object[] {parameters.toArray(new String[parameters.size()])}); } } if (success.intValue() != 0) compilationErrors = true; } catch (Throwable t) { if (t instanceof ThreadDeath) throw (ThreadDeath) t; if (t instanceof InvocationTargetException) t = t.getCause(); if (t instanceof Exception) ie = (Exception) t; else ie = new Exception(t); log.error("Javac exception ", t); log.error("Env: " + info.toString()); } finally { // Stop capturing the System.err output for this thread errorCapture = SystemLogHandler.unsetThread(); } if (compilationErrors && errorCapture != null) { errorReport.append(System.getProperty("line.separator")); errorReport.append(errorCapture); } if (!ctxt.keepGenerated()) { if (new File(javaFileName).delete() == false) log.error("Couldn't delete source: " + javaFileName); } if (compilationErrors || ie != null) { String errorReportString = errorReport.toString(); log.error("Error compiling file: " + javaFileName + " " + errorReportString); JavacErrorDetail[] javacErrors = ErrorDispatcher.parseJavacErrors(errorReportString, javaFileName, pageNodes); if (javacErrors != null) { errDispatcher.javacError(javacErrors); } else { errDispatcher.javacError(errorReportString, ie); } } if (log.isDebugEnabled()) { long t2 = System.currentTimeMillis(); log.debug("Compiled " + ctxt.getServletJavaFileName() + " " + (t2 - t1) + "ms"); } if (ctxt.isPrototypeMode()) { return; } // JSR45 Support if (!options.isSmapSuppressed()) { log.debug("Install Smap " + (smap == null ? "null" : Arrays.toString(smap))); SmapUtil.installSmap(smap); } }
/** Compile the servlet from .java file to .class file */ @Override protected void generateClass(String[] smap) throws FileNotFoundException, JasperException, Exception { long t1 = 0; if (log.isDebugEnabled()) { t1 = System.currentTimeMillis(); } String javaEncoding = ctxt.getOptions().getJavaEncoding(); String javaFileName = ctxt.getServletJavaFileName(); String classpath = ctxt.getClassPath(); String sep = System.getProperty("path.separator"); StringBuilder errorReport = new StringBuilder(); StringBuilder info = new StringBuilder(); info.append("Compile: javaFileName=" + javaFileName + "\n"); info.append(" classpath=" + classpath + "\n"); // Start capturing the System.err output for this thread SystemLogHandler.setThread(); // Initializing javac task getProject(); Javac javac = (Javac) project.createTask("javac"); // Initializing classpath Path path = new Path(project); path.setPath(System.getProperty("java.class.path")); info.append(" cp=" + System.getProperty("java.class.path") + "\n"); StringTokenizer tokenizer = new StringTokenizer(classpath, sep); while (tokenizer.hasMoreElements()) { String pathElement = tokenizer.nextToken(); File repository = new File(pathElement); path.setLocation(repository); info.append(" cp=" + repository + "\n"); } if (log.isDebugEnabled()) log.debug("Using classpath: " + System.getProperty("java.class.path") + sep + classpath); // Initializing sourcepath Path srcPath = new Path(project); srcPath.setLocation(options.getScratchDir()); info.append(" work dir=" + options.getScratchDir() + "\n"); // Initialize and set java extensions String exts = System.getProperty("java.ext.dirs"); if (exts != null) { Path extdirs = new Path(project); extdirs.setPath(exts); javac.setExtdirs(extdirs); info.append(" extension dir=" + exts + "\n"); } // Add endorsed directories if any are specified and we're forking // See Bugzilla 31257 if (ctxt.getOptions().getFork()) { String endorsed = System.getProperty("java.endorsed.dirs"); if (endorsed != null) { Javac.ImplementationSpecificArgument endorsedArg = javac.createCompilerArg(); endorsedArg.setLine("-J-Djava.endorsed.dirs=" + quotePathList(endorsed)); info.append(" endorsed dir=" + quotePathList(endorsed) + "\n"); } else { info.append(" no endorsed dirs specified\n"); } } // Configure the compiler object javac.setEncoding(javaEncoding); javac.setClasspath(path); javac.setDebug(ctxt.getOptions().getClassDebugInfo()); javac.setSrcdir(srcPath); javac.setTempdir(options.getScratchDir()); javac.setOptimize(!ctxt.getOptions().getClassDebugInfo()); javac.setFork(ctxt.getOptions().getFork()); info.append(" srcDir=" + srcPath + "\n"); // Set the Java compiler to use if (options.getCompiler() != null) { javac.setCompiler(options.getCompiler()); info.append(" compiler=" + options.getCompiler() + "\n"); } if (options.getCompilerTargetVM() != null) { javac.setTarget(options.getCompilerTargetVM()); info.append(" compilerTargetVM=" + options.getCompilerTargetVM() + "\n"); } if (options.getCompilerSourceVM() != null) { javac.setSource(options.getCompilerSourceVM()); info.append(" compilerSourceVM=" + options.getCompilerSourceVM() + "\n"); } // Build includes path PatternSet.NameEntry includes = javac.createInclude(); includes.setName(ctxt.getJavaPath()); info.append(" include=" + ctxt.getJavaPath() + "\n"); BuildException be = null; try { if (ctxt.getOptions().getFork()) { javac.execute(); } else { synchronized (javacLock) { javac.execute(); } } } catch (BuildException e) { be = e; log.error(Localizer.getMessage("jsp.error.javac"), e); log.error(Localizer.getMessage("jsp.error.javac.env") + info.toString()); } errorReport.append(logger.getReport()); // Stop capturing the System.err output for this thread String errorCapture = SystemLogHandler.unsetThread(); if (errorCapture != null) { errorReport.append(Constants.NEWLINE); errorReport.append(errorCapture); } if (!ctxt.keepGenerated()) { File javaFile = new File(javaFileName); javaFile.delete(); } if (be != null) { String errorReportString = errorReport.toString(); log.error(Localizer.getMessage("jsp.error.compilation", javaFileName, errorReportString)); JavacErrorDetail[] javacErrors = ErrorDispatcher.parseJavacErrors(errorReportString, javaFileName, pageNodes); if (javacErrors != null) { errDispatcher.javacError(javacErrors); } else { errDispatcher.javacError(errorReportString, be); } } if (log.isDebugEnabled()) { long t2 = System.currentTimeMillis(); log.debug("Compiled " + ctxt.getServletJavaFileName() + " " + (t2 - t1) + "ms"); } logger = null; project = null; if (ctxt.isPrototypeMode()) { return; } // JSR45 Support if (!options.isSmapSuppressed()) { SmapUtil.installSmap(smap); } }