0

私は、いくつかのグルー コードに Perl スクリプトを使用する適切なサイズの Java プロジェクトに取り組んでいます。これらを Groovy スクリプトに置き換える方法を見つけようとしています。これにより、スクリプト作成の利便性が向上しますが、何年にもわたって構築されてきたすべての Java コードへのアクセスが向上します。これは、プロジェクト構造がどのように見えるかの例です。

.
|____core
| |____classes
| | |____com
| |   |____project
| |     |____core
| |       |____CoreClass.class
| |____src
|   |____com
|     |____project
|       |____core
|         |____CoreClass.java
|____scripts
| |____someScript.groovy
|____util
  |____classes
  | |____com
  |   |____project
  |     |____util
  |       |____UtilClass.class
  |____src
    |____com
      |____project
        |____util
          |____UtilClass.java

(注:utilcoreは、プロジェクト内の約 12 個の同様のフォルダーのうちの 2 つにすぎません)

コマンド ラインから実行したいのですがsomeScript.groovy、 と の両方をインスタンス化できる必要がUtilClassありCoreClassます。Groovy スクリプトを使用してクラスパスを設定するさまざまな方法を読みましたが、適切なものは見つかりませんでした。

ここでのポイントは、Perl を使用する現在のシステムよりも使いやすい Groovy の使用方法を見つけることです。そのためには、3つの基準を満たす必要があると考えています。

  • システムや環境を汚染しない

私はプロジェクトをできるだけ自己完結型に保ちたいと思っています。開発者は、プロジェクトをソース管理からチェックアウトして実行someScript.groovyし、プロジェクト内の他のクラスの場所を認識できる必要があります。開発者が CLASSPATH 環境変数をすべてのプロジェクト クラス ディレクトリを指すように設定する必要はありません。

  • 長いコマンド ライン パラメーターがない

スクリプトは、コマンド ラインから簡単に実行できる必要があります。フラグが必要な場合-cp、開発者はプロジェクト内のさまざまなクラス ディレクトリをすべて指定するために小説を入力する必要があります。

  • 定型文なしsomeScript.groovy

クラスローダーのインスタンスを取得し、.javaまたは.classファイルへのパスを指定することを含むいくつかのソリューションを見てきました。これにより、スクリプトは非常に難しく、書くのが面倒になります。

これらの基準は絶対的なものではありません。それらの1つを少し動かさなければならない場合でも、解決策はまだ機能する可能性があります. ここでは Eclipse を使用しているため、Eclipse を介したある種のプロジェクト構成を含むソリューションが適している可能性があります。ボイラープレート コードが必要な場合は、必要なボイラープレート コードを含むバージョンに Eclipse によって自動的にコンパイルされる Groovy ソース ファイルが必要です。

groovy someScript.groovyまたは のいずれかを介してスクリプトを呼び出すことは、someScript.groovyおそらく許容されます。

4

5 に答える 5

0

これが1つの選択肢です:

  1. 最新のGroovyリリースをダウンロードする
  2. bin/, conf/ and lib/ディレクトリをgroovyからプロジェクトルートにコピーします
  3. 編集conf/groovy-starter.conf

次のエントリを追加します

load !{groovy.home}/core/classes
load !{groovy.home}/util/classes
....and all your other directories

実行someScript.groovyするには、プロジェクトルートから次のコマンドを実行します。

bin/groovy scripts/someScript.groovy

これは完全に自己完結型であり、開発者はgroovyをインストールする必要はありません。必要なものはすべてJAVA_HOME設定されています。groovyをアップグレードするときはいつでも、最新のリリースをダウンロードして、bin/およびlib/ディレクトリを置き換えるだけです。

がすでにプロジェクト内のディレクトリである場合lib/は、groovy libの名前をに変更してgroovy-lib/、のエントリを調整するだけconf/groovy-starter.confです(また、スクリプトの1行か2行を調整する必要がある場合もありbin/startGroovyます)。

bin/groovy scripts/someScript.grooyさらに単純化したい場合は、プロジェクトルートにいつでも呼び出すラッパースクリプトを作成できます。

于 2012-06-30T04:27:23.187 に答える
0

1つのオプションは、実行するGroovyスクリプトの名前を受け入れるシェルスクリプトを作成することです。次に、シェルスクリプトはgroovyコマンドを呼び出し、Groovyスクリプトと正しい(相対的な)クラスパスを渡します。

Groovy EclipseプラグインはGroovyスクリプトを実行できるため、別のオプションとして、実行構成をいじって、そこに正しいクラスパスを設定することもできます。

于 2012-06-29T01:59:52.793 に答える
0

以下を使用して、Groovy スクリプトのルート クラスローダーに動的に追加できます。

this.class.classLoader.rootLoader.addURL(new URL('file:///path/to/jar'))

あとは、スクリプトがスクリプト自体の場所を特定するだけです。

scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent

次に、そのツリー内のすべての瓶を見つけます。

于 2012-06-30T04:37:27.470 に答える
0

たとえば、ok /禁止されたパッケージからのクラスのみを受け入れることができる場合(つまり、ioパッケージなどからのファイルがない場合)、派生ローダーを使用することがあります。

package script;

import org.codehaus.groovy.control.CompilationFailedException;

import groovy.lang.GroovyClassLoader;

public class MyGroovyClassLoader extends GroovyClassLoader {

@Override
public Class loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript) throws ClassNotFoundException,
        CompilationFailedException {
    if( ... ! requiredPackaIsOk ... ) 
        throw Exception("class cannot be loaded"); 
    return super.loadClass(name, lookupScriptFiles, preferClassOverScript);
}

@Override
public Class loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve)
        throws ClassNotFoundException, CompilationFailedException {
    if( ... ! requiredPackaIsOk ... ) 
        throw Exception("class cannot be loaded"); 
        return super.loadClass(name, lookupScriptFiles, preferClassOverScript, resolve);
}

@Override
protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
    if( ... ! requiredPackaIsOk ... ) 
        throw Exception("class cannot be loaded"); 
        return super.loadClass(name, resolve);
}

}

于 2015-08-02T21:26:24.057 に答える
0

「lib/」ディレクトリに groovy-all.jar とその他の依存関係を含めないでください。次に、クラスパスを「lib/*」に設定するラッパー .bat および .sh スクリプトを記述します。実行するスクリプトを引数として渡すことができるメインクラス「groovy.lang.GroovyShell」があります。

somescript.sh

#!/bin/bash
java -cp 'lib/*' groovy.lang.GroovyShell somescript.groovy
于 2012-06-29T02:00:14.163 に答える