使用父进程Classpath启动Java Subprocess

时间:2010-01-12 15:29:57

标签: java classpath subprocess

我想启动一个java子进程,使用与当前java进程相同的java类路径和动态加载的类。以下是不够的,因为它不包括任何动态加载的类:

String classpath = System.getProperty("java.class.path");

目前,我正在使用以下代码搜索每个所需的课程。但是,在某些机器上,某些类/库失败,源变量为null。是否有更可靠,更简单的方法来获取当前jvm进程使用的lib的位置?

String stax     = ClassFinder.classPath("javax.xml.stream.Location");

public static String classPath(String qualifiedClassName) throws NotFoundException {
    try {
        Class qc = Class.forName( qualifiedClassName );
        CodeSource source = qc.getProtectionDomain().getCodeSource();
        if ( source != null ) {
            URL location = source.getLocation();        
            String f = location.getPath();
            f = URLDecoder.decode(f, "UTF-8"); // decode URL to avoid spaces being replaced by %20
            return f.substring(1);
        } else {
            throw new ClassFinder().new NotFoundException(qualifiedClassName+" (unknown source, likely rt.jar)");
        }
    } catch ( Exception e ) {
      throw new ClassFinder().new NotFoundException(qualifiedClassName);
    }
}

3 个答案:

答案 0 :(得分:2)

请参阅我的previous question,其中包括获取类路径以及如何启动子流程。

答案 1 :(得分:1)

  

我想启动一个java子进程,使用与当前java进程相同的java类路径和动态加载的类。

你的意思是调用一个新的JVM?

鉴于......

  • 可以将各种代理和工具插入到可以在加载时转换类的JVM中
  • 可以使用byte数组并将其转换为类
  • 可能有复杂的类加载器层次结构,类之间具有不同的可见性,并且多次加载相同的类

......没有一般的,神奇的,全能的,万无一失的方法来做到这一点。您应该设计应用程序及其类加载机制以实现此目标。如果您允许使用第三方插件,则必须记录其工作原理以及如何注册其库。

答案 2 :(得分:0)

如果查看Class.getClassLoader的javadoc,您会看到“bootstrap”类加载器通常表示为null。 “String.class.getClassLoader()”将在正常的sun jvm实现上返回null。我认为这个实现细节会延续到CodeSource的内容中。因此,我不认为你需要担心来自引导类加载器的任何类,只要你的子进程使用与当前进程相同的jvm impl。

相关问题