Groovy Classpath & Dynamic class loading
Рубрика: Development, Groovy | 4 June 2008, 11:55 |
Vadim Voituk
В Groovy подключить дополнительные Java-библиотеки и классы можно 3-мя способами:
- Дописыванием пути к jar-у или директории с классами в глобальную переменную CLASSPATH
- Указанием значение параметра -classpath (он же -cp) при запуске groovy, groovysh, и тд.
- Размещением необходимых jar-ов в директории ~/.groovy/lib
При разработке небольшой утилиты парсинга и анализа лог-файлов мне необходимо было выбирать нужный jar-файл в зависимости от некоторых условий.
Потому ни один из приведенных способов мне не подошел.
К тому же мне необходимо было искать jar-файлы в директории, в которой находился сам скрипт, в то время как запускаться он мог из любой директории.
Вспомнив про черновик заметки о ClassLoader-ах, которую Юра все никак не соберется дописать и опубликовать, получилось что-то вроде:
Простой прием, демонстрирующий определение местополжения класса и загрузку дополнительных JAR-ов
[java]
def codebase = this.getClass().getProtectionDomain().getCodeSource().getLocation()
def f = new File(codebase as String)
def url = new URL(f.getParent()+"/commons-lang-2.3.jar")
this.getClass().getClassLoader().getRootLoader().addURL(url)
Class au = Class.forName("org.apache.commons.lang.StringUtils")
assert au.isEmpty(null) && au.isEmpty("")
[/java]
P.S. Кстати запускать groovy-скрипт в UNIX-среде можно точно так же, как и sh, perl, php, python скрипты – указанием в первой строке:
#!/usr/bin/env groovy

Сегодня мне это пригодилось :)
Вадим, спасибо! Расскажу, в чём было дело.
На машину ставится несколько Jetty и все настроены на один и тот же (известный) порт. Один из Jetty запущен. Надо уметь узнавать какой именно.
Делаем такой Groovlet:
response.contentType = “text/plain”
String groovyJarPath = GroovyObject.getProtectionDomain().getCodeSource().getLocation().getFile()
String installationDir = new File(groovyJarPath).parentFile.parentFile.absolutePath
println “installation.dir=$installationDir”
Открываем его в браузере:
http://localhost:8081/groovy/JettyProperties.groovy
и видим:
installation.dir=D:\temp\jetty_server