`

让classpath参数走开

    博客分类:
  • Java
 
阅读更多
转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/337 MaDe1nZEAL
对于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 文件,运行的时候只需要运行它即可。当然你可以根据实际情况修改读取的路径、规则等信息。

  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. }  

分享到:
评论

相关推荐

    浅析Spring配置中的classpath:与classpath*:的区别

    Spring 配置中的classpath:与classpath*:的区别 Spring 配置中的classpath:与classpath*:的区别是 Spring 框架中一个常见的问题。本文主要介绍了这两种路径的区别、使用场景及注意事项,以帮助读者更好地理解和使用...

    关于classpath

    在运行`java`或`javac`命令时,可以添加`-cp`或`-classpath`参数来指定特定的classpath。例如: ``` java -cp .;/path/to/your/library.jar YourMainClass ``` 这里的`.`表示当前目录,`/path/to/your/library.jar`...

    java的classpath的终结者(不会让你失望)

    2. **命令行参数**:在命令行中,可以直接通过 `-classpath` 或 `-cp` 参数来指定`classpath`。这种方式适合于临时或特定需求的情况。 ```plaintext javac -classpath .;C:\Java\jdk1.6.0_25\lib\tools.jar;C:\...

    java classpath 理解

    - 在执行 Java 应用程序时,可以直接通过 `-cp` 或 `-classpath` 参数指定 classpath。 - 例如:`java -cp E:\test\log4j-1.2.16.jar;E:\test\mina-core-2.0.4.jar;E:\test\slf4j-api-1.6.1.jar;E:\test\slf4j-log...

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

    2. **设置`classpath`**:你可以通过`-cp`或`-classpath`命令行选项来设置`classpath`,或者在`JAVA_HOME/bin`目录下的`java.exe`启动脚本中修改`CLASSPATH`环境变量。 3. **路径分隔符**:在Windows上,路径之间...

    Classpath Variable 解决办法

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

    .classpath

    .classpath

    classpath备份

    classpath备份

    Path和classpath配置详解

    首先,让我们来了解一下`Path`。在操作系统层面,Path指的是系统用于寻找可执行文件或命令的路径。当你在命令行中输入一个命令,如`java`,系统会在Path环境变量指定的目录下搜索对应的可执行文件。在Windows系统中...

    path与classpath区别

    path与classpath的区别 path与classpath是Java开发中两个常见的概念,但它们之间的区别却经常被混淆。下面,我们将详细介绍path和classpath的作用、区别以及它们在Java开发中的应用。 path的作用 path是系统用来...

    Java 中的 ClassPath 和 Package

    首先,让我们理解什么是ClassPath。ClassPath是Java虚拟机(JVM)查找类文件的路径。当JVM启动时,它需要知道在哪里能找到应用程序所依赖的类。如果没有正确配置ClassPath,JVM将无法找到所需的类,导致运行时错误,...

    13-Java语言(classpath环境变量)

    2. 命令行参数:在启动Java程序时,可以使用`-cp`或`-classpath`参数来指定classpath,如`java -cp /path/to/library.jar my.app.Main`。 3. CLASSPATH系统属性:在Java代码中,通过`System.setProperty("java.class...

    java Classpath全解

    - 使用 `-classpath` 或 `-cp` 参数来指定当前命令行的 `classpath`。例如: ```sh java -classpath c:\mylib;d:\mylib com.shinechina.MyClass ``` - 上述命令中的 `c:\mylib;d:\mylib` 表示类路径包含两个...

    classpath 和path

    ### classpath与path详解 #### 一、概念介绍 在深入了解`classpath`和`path`之前,我们需要先明确这两个环境变量的基本概念。 ##### path `path`环境变量主要用于指定操作系统可以搜索到可执行文件(例如`.exe`...

    Java命令行classpath的设置

    - 当在命令行中运行Java程序时,可以通过`-cp`或`-classpath`参数来指定类路径。比如: ``` java -cp .;C:\path\to\mylib.jar JavaDBTest ``` 这里的`.`同样代表当前目录,`mylib.jar`是需要引入的库。 在Unix...

    java中path和classpath的设置

    ### Java中的Path与Classpath设置详解 在Java开发过程中,正确配置环境变量是十分重要的一步。其中,`path`和`classpath`是最为关键的两个环境变量,它们直接影响到Java程序能否正常编译和运行。 #### 一、Path 的...

    IKVM.GNU.Classpath

    IKVM.GNU.Classpath是一个专为.NET Framework设计的开源项目,它使得Java应用程序可以在.NET平台上运行。这个项目的核心是IKVM.NET,一个实现了Java虚拟机(JVM)和大部分Java核心类库的.NET版本。IKVM这个名字是...

    Java环境配置与设置JAVA_HOME_CLASSPATH_PATH的目的

    Java 环境配置与设置 JAVA_HOME, CLASSPATH, PATH 的目的 Java 环境配置是 Java 开发的基础,我们需要正确地配置 JAVA_HOME, CLASSPATH, PATH 等环境变量,以便正确地编译和运行 Java 程序。在本节中,我们将详细地...

Global site tag (gtag.js) - Google Analytics