systemclassloader.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 237 行

JAVA
237
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.loader;import com.caucho.config.Config;import com.caucho.config.ConfigException;import com.caucho.vfs.Path;import com.caucho.vfs.Vfs;import java.io.File;import java.io.IOException;import java.net.URLClassLoader;/** * ClassLoader that initalizes the environment and allows byte code * enhancement of classes in the system classpath. * <pre> * java -Djava.system.class.loader=com.caucho.loader.SystemClassLoader ... * </pre> * If the system property "system.conf" is defined, it is used as a path * to a configuration file that initializes the enviornment.  Relative paths * are relative to the current directory (See {@link com.caucho.vfs.Vfs#getPwd()}. * <p/> * Resources defined in system.conf are available to all classes loaded within the jvm. * <pre> * java -Dsystem.conf=tests/system.conf -Djava.system.class.loader=com.caucho.loader.SystemClassLoader ... * </pre> */public class SystemClassLoader  extends EnvironmentClassLoader  implements EnvironmentBean{  private boolean _isInit;  private boolean _hasBootClassPath;  private URLClassLoader _loader;  /**   * Creates a new SystemClassLoader.   */  public SystemClassLoader(ClassLoader parent)  {    super(parent, "system");    String preScan = System.getProperty("caucho.jar.prescan");        if (preScan == null || ! "false".equals(preScan))      DynamicClassLoader.setJarCacheEnabled(true);    String smallmem = System.getProperty("caucho.smallmem");        if (smallmem != null && ! "false".equals(smallmem))      DynamicClassLoader.setJarCacheEnabled(false);  }  public ClassLoader getClassLoader()  {    return this;  }  public void init()  {    if (_isInit)      return;    _isInit = true;    initClasspath();    super.init();    String systemConf = System.getProperty("system.conf");    if (systemConf != null) {      try {        Path path = Vfs.lookup(systemConf);        Config config = new Config();        config.configure(this, path, getSchema());      }      catch (Exception ex) {        ex.printStackTrace();        throw new RuntimeException(ex.toString());      }    }  }  private void initClasspath()  {    boolean isValid = false;        try {      String boot = System.getProperty("sun.boot.class.path");      if (boot != null) {	initClasspath(boot);	_hasBootClassPath = true;	initExtDirs("java.ext.dirs");	initExtDirs("java.endorsed.dirs");      }          initClasspath(System.getProperty("java.class.path"));      isValid = true;    } catch (IOException e) {      e.printStackTrace();    } finally {      if (! isValid)	_hasBootClassPath = false;    }  }  private void initExtDirs(String prop)    throws IOException  {    String extDirPath = System.getProperty(prop);    if (extDirPath == null)      return;    for (String extDir : extDirPath.split(File.pathSeparator, 512)) {      Path dir = Vfs.lookup(extDir);      for (String fileName : dir.list()) {	Path root = dir.lookup(fileName);	try {	  // #2659	  if (root.isDirectory()	      || root.isFile() && (root.getPath().endsWith(".jar")				   || root.getPath().endsWith(".zip"))) {	    addRoot(root);	  }	} catch (Throwable e) {	  _hasBootClassPath = false;	  e.printStackTrace();	}      }    }  }  private void initClasspath(String classpath)  {    String[] classpathElements = classpath.split(File.pathSeparator, 512);    for (String classpathElement : classpathElements) {      Path root = Vfs.lookup(classpathElement);      try {	if (root.exists())	  addRoot(root);      } catch (Throwable e) {	_hasBootClassPath = false;	e.printStackTrace();      }    }  }  @Override  protected void initEnvironment()  {    // disable for terracotta  }  /**   * Load a class using this class loader   *   * @param name the classname to load   * @param resolve if true, resolve the class   *   * @return the loaded classes   */  public Class loadClassImpl(String name, boolean resolve)    throws ClassNotFoundException  {    // The JVM has already cached the classes, so we don't need to    Class cl = findLoadedClass(name);    if (cl != null) {      if (resolve)        resolveClass(cl);      return cl;    }    // This causes problems with JCE    if (_hasBootClassPath) {      String className = name.replace('.', '/') + ".class";      if (findPath(className) == null)	return null;    }    return super.loadClassImpl(name, resolve);  }  protected String getSchema()  {    return "com/caucho/loader/system.rnc";  }  public String toString()  {    return "SystemClassLoader[]";  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?