Запуск Java-подпроцесса с использованием родительского процесса Classpath - PullRequest
2 голосов
/ 12 января 2010

Я хочу запустить подпроцесс java с тем же путем классов Java и динамически загружаемыми классами, что и текущий процесс java. Следующего недостаточно, потому что оно не включает динамически загружаемые классы:

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

В настоящее время я ищу каждый необходимый класс с кодом ниже. Однако на некоторых машинах это не работает для некоторых классов / библиотек, исходная переменная равна нулю. Есть ли более надежный и простой способ получить расположение библиотек, которые используются текущим процессом jvm?

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 ]

2 голосов
/ 12 января 2010

См. Мой предыдущий вопрос , который описывает получение пути к классам, а также как запустить подпроцесс.

1 голос
/ 12 января 2010

Я хочу запустить подпроцесс java с тем же путем к классам java и динамически загружаемыми классами, что и текущий процесс java.

Ты имеешь в виду вызвать новую JVM?

Учитывая, что ...

  • возможно подключить все виды агентов и инструментов в JVM, которая может преобразовывать классы во время загрузки
  • можно взять массив byte и превратить его в класс
  • возможно иметь сложные иерархии загрузчиков классов с различной видимостью между классами и загружать одни и те же классы несколько раз

... нет общего, волшебного, универсального и надежного способа сделать это. Вы должны разработать свое приложение и механизмы загрузки его классов для достижения этой цели. Если вы разрешите сторонние плагины, вам придется документировать, как это работает и как они должны регистрировать свои библиотеки.

0 голосов
/ 12 января 2010

Если вы посмотрите на javadoc для Class.getClassLoader, вы увидите, что загрузчик классов «начальной загрузки» обычно представлен как ноль. String.class.getClassLoader () вернет значение null в обычных реализациях sun jvm. я думаю, что эта деталь реализации переносится в материал CodeSource. Таким образом, я не думаю, что вам нужно будет беспокоиться о любом классе, который поступает из загрузчика классов начальной загрузки, если ваш подпроцесс использует тот же jvm impl, что и текущий процесс.

...