2009-04-07 11 views
2

Eclipseコードビルダー(Hibernate VOからDTOを生成するため)を拡張しようとしています。そのテンプレートシステムにGroovyを使用しています。埋め込みGroovyスクリプトのクラスパスを設定するにはどうすればよいですか?

ほとんどが、それはグルーヴィーなスクリプトを作成するために使用するコードは(私はGroovyのドキュメントに見るものではない)少し奇妙ですが、それは動作します:

GroovyShell shell = new GroovyShell(); 
script = shell.parse(source); 

すると、それ以降:

Binding binding = (bindings == null ? new Binding() : new Binding(bindings)); 
Script scriptInstance = InvokerHelper.createScript(script.getClass(), binding); 
scriptInstance.setProperty("out", out); 
scriptInstance.run(); 
out.flush(); 

これは、プロジェクト内に直接存在しないオブジェクトへの参照にヒットするまでうまくいきます。スクリプトでは、処理中のクラスのプロパティを反復処理します。これを行うと、Groovyはすべてのメソッドを調べ、メソッドパラメータのいずれかのClass定義を見つけることができない場合は、それを排除します。この場合、Hibernateへの参照が見つかるとそれは死ぬでしょうが、もっと多くの情報を得ることができると確信しています。彼らには何もする必要はありませんが、明らかに何が分かっていなくても生きることはできません。

Scriptはクラスパス情報を提供できるクラスローダーを持っていないようですので、私はGroovyShellに提供しようとしました。違いはありません。

これを修正して、Groovyインタプリタが私のプロジェクト参照JARを見つけることができる適切な方法は何ですか?

答えて

2

私はこの正確な問題を抱えていたし、私自身のURLClassLoaderを作成することによってそれを解決して、私がしようとして同じ問題を抱えているクラスパス

// Specify the path you want to add 
URL url = new URL("file://path/to/classes/here"); 

// Create a new class loader as a child of the default system class loader 
ClassLoader loader = new URLClassLoader(System.getClass().getClassLoader()); 

// Get the AddURL method and call it 
Method method = URLClassLoader.class.getDeclaredMethod("addURL",new Class[]{URL.class}); 
method.setAccessible(true); 
method.invoke(loader,new Object[]{ url }); 

GroovyShell shell = new GroovyShell(loader); 
+0

.groovyファイルで直接同様のことができますか? (すなわち、最初にそれらをコンパイルせずに) – hithwen

0

に新しいパスを追加するために保護されたメソッドを呼び出すためにリフレクションを使用してGantスクリプトの自動実行私が見つけた解決策は以下のとおりです。

  1. コピーガント-starter.conf $ GROOVY_HOME/confにからご 自身のディレクトリに(または グルーヴィー-starter.confそれだけで Groovyの場合)。グルービーソース配布に見出さ org.codehaus.groovy.tools.LoaderConfiguration、 へのJavadocに記載されているように

  2. は、「負荷[ディレクトリ]」または が「ロード[JAR]」を追加します。そのファイルの名前にグルービーセット groovy.starter.conf.overrideシステム プロパティを開始する前に

  3. 、 等-Dgroovy.starter.conf.override = [ファイル名]

2

@Jamesと同じですが、反射を使用せずに、特定のフォルダからすべてのjarファイルをロードすることができます:

URLClassLoader classLoader = new URLClassLoader(getExtraJarUrls(), getClass().getClassLoader()); 
GroovyShell shell = new GroovyShell(classLoader, binding, compilerConfiguration); 


private URL[] getExtraJarUrls() throws MalformedURLException 
{ 
    logger.debug("Loading extra jars from {}", EXTRA_JARS_DIR.getAbsolutePath()); 
    URL[] result; 
    File[] files = EXTRA_JARS_DIR.listFiles(new JarFilenameFilter()); 
    if (files != null) 
    { 
     List<URL> urls = new ArrayList<URL>(files.length); 
     for (File file : files) 
     { 
      urls.add(file.toURI().toURL()); 
     } 
     result = urls.toArray(new URL[urls.size()]); 
    } 
    else 
    { 
     result = new URL[0]; 
    } 
    logger.debug("Adding URLs to classloader: {}", Arrays.toString(result)); 
    return result; 
} 

private static class JarFilenameFilter implements FilenameFilter 
{ 
    public boolean accept(File dir, String name) 
    { 
     return name.endsWith(".jar"); 
    } 
} 
関連する問題