Groovy Classpath & Dynamic class loading

Рубрика: Development, Groovy | 4 June 2008, 11:55 | Vadim Voituk

В Groovy подключить дополнительные Java-библиотеки и классы можно 3-мя способами:

  1. Дописыванием пути к jar-у или директории с классами в глобальную переменную CLASSPATH
  2. Указанием значение параметра -classpath (он же -cp) при запуске groovy, groovysh, и тд.
  3. Размещением необходимых 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

Пока один комментарий

One Response to “Groovy Classpath & Dynamic class loading”

Комментарии:

  1. Sergey Bondarenko

    Сегодня мне это пригодилось :)
    Вадим, спасибо! Расскажу, в чём было дело.

    На машину ставится несколько 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

Leave a Reply