Проблема пути к классам в Groovy с помощью SystemClassLoader - PullRequest
2 голосов
/ 30 марта 2012

Я пишу скрипт Groovy, который использует сторонний Java-код, который я не могу изменить.Этот код использует (мне кажется, плохо) ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") и ожидает чтения файла.

Все хорошо с Java при использовании java -cp "/path/to/jar/file" ...

Однако сторонний код теперьчтобы быть интегрированным с кучей кода Groovy, который мы уже написали, поэтому мы хотели запустить его из groovy.

Итак, мы написали скрипт Groovy, пусть он вызывает test.groovy, и запустили его как groovy -cp "/path/to/jar/file" test.groovy.

Проблема в том, что код не может получить доступ к файловому ресурсу, так как кажется, что Groovy не загружает свои jar-файлы непосредственно в System ClassLoader.

Для доказательства, с Thread.currentThread().getContextClassLoader().getResourceAsStream("/hard/file/path/in/jar/file")в скрипте Groovy я могу прочитать файл, но с ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") я не могу.

Итак, кто-нибудь знает, как загрузить класс в System ClassLoader из скрипта Groovy, не начав пытатьсягрязные хаки (например, метаклассирование getSystemClassloader для возврата контекстного загрузчика классов)?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вы также можете попробовать добавить jar в системный загрузчик классов, когда ваш скрипт выполняется, например:

ClassLoader.systemClassLoader.addURL new File( '/path/to/jar/file' ).toURI().toURL()

PS: я полагаю, вы имеете в виду ClassLoader.getSystemClassLoader() в своем вопросе, а не System.getSystemClassLoader()

0 голосов
/ 30 марта 2012

Вы можете попробовать поместить jar в папку %GROOVY_HOME%\lib или создать оболочку для вашей команды groovy и изменить переменную %CLASSPATH% перед запуском процесса Groovy.

...