`
yangzb
  • 浏览: 3503293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态修改CLASSPATH

    博客分类:
  • Java
阅读更多

  import   java.io.File;  
  import   java.io.IOException;  
  import   java.net.MalformedURLException;  
  import   java.net.URL;  
  import   java.net.URLClassLoader;  
  import   java.util.StringTokenizer;  
  import   java.util.Vector;  
   
  /**  
    *   Class   to   handle   CLASSPATH   construction  
    */  
  public   class   Classpath   {  
   
          Vector   _elements   =   new   Vector();  
   
          public   Classpath()   {}  
   
          public   Classpath(String   initial)   {  
                  addClasspath(initial);  
          }  
   
          public   boolean   addComponent(String   component)   {  
                  if   ((component   !=   null)   &&   (component.length()   >   0))   {  
                          try   {  
                                  File   f   =   new   File(component);  
                                  if   (f.exists())   {  
                                          File   key   =   f.getCanonicalFile();  
                                          if   (!_elements.contains(key))   {  
                                                  _elements.add(key);  
                                                  return   true;  
                                          }  
                                  }  
                          }   catch   (IOException   e)   {}  
                  }  
                  return   false;  
          }  
   
          public   boolean   addComponent(File   component)   {  
                  if   (component   !=   null)   {  
                          try   {  
                                  if   (component.exists())   {  
                                          File   key   =   component.getCanonicalFile();  
                                          if   (!_elements.contains(key))   {  
                                                  _elements.add(key);  
                                                  return   true;  
                                          }  
                                  }  
                          }   catch   (IOException   e)   {}  
                  }  
                  return   false;  
          }  
   
          public   boolean   addClasspath(String   s)   {  
                  boolean   added   =   false;  
                  if   (s   !=   null)   {  
                          StringTokenizer   t   =   new   StringTokenizer(s,   File.pathSeparator);  
                          while   (t.hasMoreTokens())   {  
                                  added   |=   addComponent(t.nextToken());  
                          }  
                  }  
                  return   added;  
          }  
   
          public   String   toString()   {  
                  StringBuffer   cp   =   new   StringBuffer(1024);  
                  int   cnt   =   _elements.size();  
                  if   (cnt   >=   1)   {  
                          cp.append(((File)   (_elements.elementAt(0))).getPath());  
                  }  
                  for   (int   i   =   1;   i   <   cnt;   i++)   {  
                          cp.append(File.pathSeparatorChar);  
                          cp.append(((File)   (_elements.elementAt(i))).getPath());  
                  }  
                  return   cp.toString();  
          }  
   
          public   URL[]   getUrls()   {  
                  int   cnt   =   _elements.size();  
                  URL[]   urls   =   new   URL[cnt];  
                  for   (int   i   =   0;   i   <   cnt;   i++)   {  
                          try   {  
                                  urls[i]   =   ((File)   (_elements.elementAt(i))).toURL();  
                          }   catch   (MalformedURLException   e)   {}  
                  }  
                  return   urls;  
          }  
   
          public   ClassLoader   getClassLoader()   {  
                  URL[]   urls   =   getUrls();  
   
                  ClassLoader   parent   =   Thread.currentThread().getContextClassLoader();  
                  if   (parent   ==   null)   {  
                          parent   =   Classpath.class.getClassLoader();  
                  }  
                  if   (parent   ==   null)   {  
                          parent   =   ClassLoader.getSystemClassLoader();  
                  }  
                  return   new   URLClassLoader(urls,   parent);  
          }  
  }  
  代码:  
   private   Classpath   classPath   =   new   Classpath(System.getProperty("java.class.path"));        
   System.setProperty("java.class.path",   classPath.toString());                  
   ClassLoader   classloader   =   classPath.getClassLoader();  
   Thread.currentThread().setContextClassLoader(classloader);  
  通过修改当前环境的ClassLoader来实现。  

分享到:
评论
2 楼 wolfbrood 2009-02-19  
好文章,现在有一个是我们不能动态的修改classload的内容,比如增加一个path。如果要增加path必须重新new 一个classload
1 楼 yangzb 2008-10-07  
让classpath参数走开

Made In Zeal 转载请保留原始链接:http://www.zeali.net/entry/337
标签 ( Tags ): classpath , classloader , 源代码
对于Java开发人员(尤其是初学者)来说,因为classpath配置问题所导致的代码编译运行出错相当普遍,经验教训足可以专文叙之。实际上,我们可以通过实现自定义的ClassLoader等方法来尽量避免classpath对于系统环境的依赖。

  通过加参数调用 javac,可以在编译时使用自定义的 ClassLoader 来完成类的定位加载:

    javac -J-Djava.system.class.loader=my.ClassLoaderImpl theSource.java

  自定义 ClassLoader 的方式可以参考这里(基本上来说就是通过继承 findClass(String) 方法来使JVM按照自己期望的规则来加载类)。还处于beta阶段的 Mustang Java SE 6 据说将提供新的工具 javax.tools.JavaCompilerTool 来替代 javac ,这个全新的编译工具应该会给程序员更好的编译体验。

  大多数流行的 java IDE 都大大简化了对于 classpath 的配置过程,以至于很多在程序员的开发环境运行良好的代码发布之后才出现各种各样的问题。所以要想让程序包能够顺利的执行于产品环境,我们通常的做法是写一堆的 bat 或 shell 脚本来完成各种运行参数的配置。而这些大段大段的脚本当中,对 classpath 的配置占了相当大的比重。

  因此 Heikki Uusitalo 写了一个 BootLoader 类(原始代码似乎有些问题,这里修改了一下):将这个类作为引导程序去根据自定义的规则来加载所有必需的 jar 包等资源,然后再启动真正的 main 方法。把这个 BootLoader 类单独打包成一个 jar 文件,运行的时候只需要运行它即可。当然你可以根据实际情况修改读取的路径、规则等信息。

view plainprint?

   1. import java.io.*; 
   2. import java.net.*; 
   3. import java.lang.reflect.*; 
   4.  
   5. public class BootLoader 
   6. { 
   7.   public static void main(final String[] args) throws Exception 
   8.   { 
   9.     // check that the lib folder exists 
  10.     File libRoot = new File(LIB_FOLDER); 
  11.     if(!libRoot.exists()) { 
  12.       throw new Exception("No 'lib' folder exists!"); 
  13.     } 
  14.     // read all *.jar files in the lib folder to array 
  15.     File[] libs = libRoot.listFiles(new FileFilter() 
  16.     { 
  17.       public boolean accept(File dir) 
  18.       { 
  19.         String name = dir.getName().toLowerCase(); 
  20.         return name.endsWith("jar") || name.endsWith("zip"); 
  21.       } 
  22.     }); 
  23.  
  24.     URL[] urls = new URL[libs.length]; 
  25.     // fill the urls array with URLs to library files found in libRoot 
  26.     for(int i = 0; i < libs.length; i++) { 
  27.       urls[i] = new URL("file",null,libs[i].getAbsolutePath()); 
  28.     } 
  29.     // create a new classloader and use it to load our app. 
  30.     classLoader = new URLClassLoader(urls, 
  31.                                      Thread.currentThread(). 
  32.                                      getContextClassLoader()); 
  33.     // get the main method in our application to bring up the app. 
  34.     final Method mtd = classLoader.loadClass(APP_MAIN_CLASS).getMethod("main", 
  35.         new Class[] {String[].class}); 
  36.     // Using thread to launch the main 'loop' so that the current Main method 
  37.     // can return while the app is starting 
  38.     new Thread(new Runnable() 
  39.     { 
  40.       public void run() 
  41.       { 
  42.         try { 
  43.           mtd.invoke(null,new Object[] {args}); 
  44.         } // forward the args 
  45.         catch(Exception e) { 
  46.           throw new RuntimeException(e); 
  47.         } 
  48.       } 
  49.     },"AppMain").start(); 
  50.     // Give the app some time to start before returning from main. 
  51.     // This doesn't delay the starting in any way 
  52.     Thread.sleep(1000); 
  53.   } 
  54.  
  55.   private static final String LIB_FOLDER = "lib"; 
  56.   private static final String APP_MAIN_CLASS = "com.my.application.MyTest"; 
  57.   private static ClassLoader classLoader; 
  58. } 

相关推荐

    在linux和windows下动态设置classpath调用java类方法脚本代码

    有时,你可能需要根据实际情况动态地添加或修改classpath。在Java程序中,可以使用`java.lang.ClassLoader`的子类来实现这一点。例如,使用URLClassLoader可以加载指定路径下的类: ```java URL[] urls = { new URL...

    classpath修改,相关jsp页面

    classpath修改,相关jsp页面classpath修改

    Classpath Variable 解决办法

    在Java编程环境中,`Classpath`(类路径)是一个至关重要的概念,它是Java虚拟机(JVM)查找和加载.class文件的路径。当我们在开发和运行Java程序时,正确配置Classpath是确保程序能正常运行的关键步骤。这篇文档将...

    自学如何使用框架的工具classpath

    8. **动态加载**:在某些场景下,如插件系统,你可能需要在运行时动态修改`classpath`,这可以通过`ClassLoader`实现。 9. **理解依赖**:当你添加一个新的框架到项目中,你需要确保所有相关的依赖都被包含在`...

    java classpath 理解

    - 可以使用 `set CLASSPATH=路径`(Windows)或 `export CLASSPATH=路径`(Linux/Mac)来临时修改环境变量中的 classpath。 - 例如:`set CLASSPATH=E:\test`。 2. **持久化设置 Classpath**: - 在 Windows ...

    Path和classpath配置详解

    在Eclipse中,可以通过右键点击项目 -&gt; Build Path -&gt; Configure Build Path来查看和修改项目的Classpath。在IntelliJ IDEA中,可以在Project Structure中调整模块的Classpath设置。 在处理复杂的项目时,有时会...

    java中path和classpath的设置

    2. **修改Classpath变量:** - 在“系统变量”中找到名为`Classpath`的变量,如果没有,则新建一个。 - 设置其值为`. ; D:\Program Files\Java\jdk1.6.0_16\lib\dt.jar ; D:\Program Files\Java\jdk1.6.0_16\lib\...

    path与classpath区别

    一般在编辑Java文件或者C#文件时需要修改,设计到多个文件夹之间的切换时也可以根据自己的需要设置。简单的说就是,如果设置系统变量和用户变量,都叫做设置环境变量,设置系统变量时,该系统的所有帐号的用户都可以...

    GNU Classpath

    这些源代码包含了类库的实现,开发者可以通过阅读和修改源代码来理解和改进GNU Classpath的功能。同时,这个版本可能还包含了构建脚本、文档、测试用例,帮助开发者理解如何编译和测试Classpath,以及如何将其集成到...

    java Classpath全解

    - 编辑 `/etc/profile` 或 `~/.bashrc` 文件,在其中添加或修改 `CLASSPATH` 变量。 - 例如,可以在文件末尾添加以下内容: ```sh export CLASSPATH=/home/local/:/usr/local/ ``` #### 示例代码分析 在提供...

    Spring2.5 自动扫描classpath

    1. **Spring_demo_04_aop_introduction** - 这个例子可能是对Spring的面向切面编程(AOP)的介绍,AOP允许我们在不修改原有代码的情况下,实现如日志记录、性能监控等功能。 2. **Spring_demo_07_dataSource** - ...

    jdk的classpath路径和环境配置

    4. **更新PATH变量**:修改系统的`PATH`变量,添加`%JAVA_HOME%\bin`到系统路径的开头位置,确保Java相关的工具如`javac`和`java`能够被系统识别。 完成上述配置后,可以在命令行中测试JDK是否配置成功,例如通过...

    java动态添加外部jar包到classpath的实例详解

    "java动态添加外部jar包到classpath的实例详解" Java 动态添加外部jar包到classpath是指在Java应用程序中动态地加载外部jar包到classpath中,以便在不重新启动服务器的情况下使用最新的代码。这项技术在项目开发...

    eclipse下的.classpath文件和.project文件

    在Eclipse中,当修改了这两个文件的任何一项内容,Eclipse都会实时更新项目配置,确保开发环境与实际需求保持一致。 至于标签"源码",它提醒我们关注的是项目中的代码组织和管理。在Eclipse中,源码通常按照包...

    java字节码例子 可以动态修改类 bcel

    `bcel`(Byte Code Engineering Library)是一个强大的开源工具,允许开发者对Java字节码进行分析、生成和修改,从而实现动态类修改或者增强。 在Java开发中,动态类修改通常用于AOP(面向切面编程)、代码热部署、...

    felix学习二-发布classpath为bundle

    OSGi的核心概念是“bundle”,即模块化的JAR文件,它们可以有自己的类路径,并能动态地安装、启动、更新和卸载。本篇文章将深入探讨如何将classpath作为bundle发布在Felix框架中。 首先,我们需要了解OSGi的bundle...

    springboot Quartz动态修改cron表达式的方法

    Spring Boot Quartz 动态修改 Cron 表达式的方法 Spring Boot Quartz 动态修改 Cron 表达式的方法主要介绍了如何使用 Spring Boot 和 Quartz Framework 实现动态修改 Cron 表达式的方法。该方法可以使得开发者在不...

    CLASSPATH 和PATH的配置

    ### CLASSPATH 和 PATH 的配置 #### 一、概述 在Java开发环境中,正确配置环境变量是确保程序能够正常编译和运行的关键步骤之一。本文主要介绍如何正确设置`CLASSPATH`与`PATH`这两个重要的环境变量,特别是针对...

    Drools报错:The Eclipse JDT Core jar is not in the classpath

    当出现"The Eclipse JDT Core jar is not in the classpath"这样的错误时,意味着系统在运行时找不到Eclipse JDT Core库,这是一个关键的依赖,因为Drools使用它来编译和加载用户定义的Java代码,特别是那些由DRL...

    path,classpath,java_home设置作用和目的

    - **灵活部署**: 开发者可以通过修改`CLASSPATH`来控制类文件的查找顺序,从而实现更灵活的部署方案。 - **解决类加载错误**: 设置正确的`CLASSPATH`可以避免`ClassNotFoundException`或`NoClassDefFoundError`等类...

Global site tag (gtag.js) - Google Analytics