2013-05-30 1 views
1

Я хотел бы встроить GroovyConsole в существующее приложение java для создания прототипов и отладки проектов.Встраиваемая консоль Groovy - как мне поделиться всем состоянием

Мне бы очень хотелось, чтобы эта консоль имела доступ ко всей моей программе - в основном это означает, что любые синглтоны или фабрики должны возвращать реальный объект, а не создавать новый только для мира GroovyConsole.

Есть ли способ сделать это, или мне нужно вручную передать все объекты по одному с помощью вызовов setVariable()?

+0

Вы можете получить полезный вклад от [здесь] (http://groovy.codehaus.org/Embedding+a+Groovy+Console+in+a+Java+Server+Application). – dmahapatro

+0

Если бы я использовал весну, которая была бы абсолютно идеальной. Это действительно близко, но поскольку я не использую Spring, у меня нет контекста приложения, с которым я могу связываться. –

ответ

2

Это на самом деле очень просто. Скорее всего, вы можете просто создать новую консоль с конструктором no-arg, и она будет работать так, как вы этого хотите. Если ваше приложение использует несколько загрузчиков классов, просто передать в тот, который вы хотите, когда вы создаете экземпляр консоли:

def cl = ... //which ClassLoader you'll need depends on your application 
def console = new Console(cl) 
console.run() 

Это создаст новый Groovy консоли и сказать ему, чтобы использовать любой загрузчик класса, который вы хотите. Это не устанавливает никаких привязок или переменных, но гарантирует, что классы, используемые консолью, точно такие же, как и остальные приложения. Если вы не делаете ничего особенного с загрузчиками классов в своем приложении, простой вызов новой консоли() приведет к тому, что он будет использовать текущий загрузчик классов в качестве родителя.

+0

Ваше последнее утверждение не кажется правильным. Я начал новую консоль без параметров и не смог получить доступ к объектам в остальной части приложения без явного их совместного использования, но я попробую еще раз. Я предполагаю, что остальное правильно, и прохождение в classloader будет работать. –

+0

Да, просто проверил. Если вы передадите getClass(), getClassLoader() вы получите именно то, что я хотел, если вы этого не сделаете, он должен создать свой собственный загрузчик классов. Спасибо за помощь! –