На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Groovy Classpath & Dynamic class loading

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

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

При разработке небольшой утилиты парсинга и анализа лог-файлов мне необходимо было выбирать нужный jar-файл в зависимости от некоторых условий.


Потому ни один из приведенных способов мне не подошел.
К тому же мне необходимо было искать jar-файлы в директории, в которой находился сам скрипт, в то время как запускаться он мог из любой директории.

Вспомнив про черновик заметки о ClassLoader-ах, которую Юра все никак не соберется дописать и опубликовать,  получилось что-то вроде:

Простой прием, демонстрирующий определение местополжения класса и загрузку дополнительных JAR-ов

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("")

P.S. Кстати запускать groovy-скрипт в UNIX-среде можно точно так же, как и sh, perl, php, python скрипты - указанием в первой строке:
#!/usr/bin/env groovy

Рекомендуем
Популярное
наверх