Exemplo n.º 1
0
  /**
   * Same as addExisting, but support classpath behavior if tryUserDir is true. Classpaths are
   * relative to user dir, not the project base. That used to break jspc test
   *
   * @param source the source path
   * @param tryUserDir if true try the user directory if the file is not present
   */
  public void addExisting(Path source, boolean tryUserDir) {
    String[] list = source.list();
    File userDir = (tryUserDir) ? new File(System.getProperty("user.dir")) : null;

    for (int i = 0; i < list.length; i++) {
      File f = resolveFile(getProject(), list[i]);

      // probably not the best choice, but it solves the problem of
      // relative paths in CLASSPATH
      if (tryUserDir && !f.exists()) {
        f = new File(userDir, list[i]);
      }
      if (f.exists()) {
        setLocation(f);
      } else if (f.getParentFile() != null
          && f.getParentFile().exists()
          && containsWildcards(f.getName())) {
        setLocation(f);
        log(
            "adding "
                + f
                + " which contains wildcards and may not"
                + " do what you intend it to do depending on your OS or"
                + " version of Java",
            Project.MSG_VERBOSE);
      } else {
        log("dropping " + f + " from path as it doesn't exist", Project.MSG_VERBOSE);
      }
    }
  }
Exemplo n.º 2
0
  /** 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);
    }
  }