15

Grape は、クラスパスに jar を追加するのにかなりうまく機能しているようです。また、フェッチや依存関係管理など、他にも多くのことを行います。例えば

#!/home/robert/bin/groovy

import org.apache.commons.lang.StringUtils

@Grab(group='commons-lang', module='commons-lang', version='2.4')

def strings = ['Hello', 'Groovy', 'AVeryLongWord!', 'A simple sentence']
strings.each { String aString ->
    println "$aString: ${StringUtils.abbreviate(aString,10)}"
}

残念ながら、ファイルシステムに動的に追加したい jar がファイルシステムにある場合は、はるかに醜いソリューションに頼る必要があります。

#!/home/robert/bin/groovy

def loader = this.class.classLoader.rootLoader
loader.addURL(new File("/home/robert/somejars/arithmetic-1.1.jar").toURI().toURL())

// can't use traditional package import
arithmeticMainClass = Class.forName("org.scharp.arithmetic.Main")

println "42 - 23 = " + arithmeticMainClass.subtract(42, 23)

// can't use "new" operator
myArithmeticObject = arithmeticMainClass.newInstance()

グレープにファイルシステムから jar を取得させる方法はありますか? そうでない場合、groovy/Java でグレープが行っていることをどうにかして複製できますか?

多くのユーザーが実行できるスクリプトや互換性のない多くの jar に対してこのソリューションが機能するようにしたいので、~/.groovy/lib/ などの共通ディレクトリに jar を追加しても機能しません。

ローカルのjarライブラリ用にローカルのmavenリポジトリを作成できましたが、それはやり過ぎのようです。

4

4 に答える 4

7

これが私がこれを解決した方法です。Grape (Ivy) が何かを必要とする場合、~/.groovy/grapesディレクトリの下にキャッシュします。独自の ivy.xml ファイルを作成し、そこに jar を入れるだけです。Mavenからダウンロードした他のアーティファクトのいくつかを見るだけでそれを理解しました。ここに小さな例があります.....

ここでは Oracle を使用していますが、その jdbc jar ファイルを Groovy スクリプトで「取得」できるようにしたかったのです。残念ながら、この jar を含むリポジトリは Web 上に見つかりませんでした。

  • ステップ 1 : ディレクトリを作成する~/.groovy/grapes/com.oracle
  • ステップ 2 : ディレクトリを作成する~/.groovy/grapes/com.oracle/ojdbc6
  • ステップ 3 : ディレクトリを作成する~/.groovy/grapes/com.oracle/ojdbc6/jars
  • ステップ 4 : Oracle の ojdbc jar ファイルのコピーを取得し、名前を変更します。Oracle のバージョンは 11.2.0.1.0 で、Java6 を使用しているため、ローカルにインストールされた ojdbc6.jar ファイルを取得し、ojdbc6-11.2.0.1.0.jar としてコピーしました。このファイルは、前の手順で作成したディレクトリに配置しました。
  • 手順 5 : ivy-11.2.0.1.0.xml 構成ファイルを作成します。このファイルは、手順 2 で作成したディレクトリに配置する必要があります。この手順では、取得した他のアーティファクトの例に大きく依存しました。apache commons lib が良い例です。

これが私のxmlです。

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven"
>
  <info organisation="com.oracle" module="ojdbc6" revision="11.2.0.1.0" status="release" publication="20130102153401">
    <license name="" />
    <description homepage="">Oracle ojdbc driver</description>
  </info>
  <configurations>
    <conf name="default" visibility="public" description="" extends="runtime,master" />
    <conf name="master" visibility="public" description="" />
    <conf name="compile" visibility="public" description="" />
    <conf name="provided" visibility="public" description="" />
    <conf name="runtime" visibility="public" description="" extends="compile" />
    <conf name="test" visibility="public" description="" extends="runtime" />
    <conf name="system" visibility="public" description="" />
    <conf name="sources" visibility="public" description="" />
    <conf name="javadoc" visibility="public" description="" />
    <conf name="optional" visibility="public" description="" />
  </configurations>
  <publications>
    <artifact name="ojdbc6" type="jar" ext="jar" conf="master" />
  </publications>
</ivy-module>

これで、次のように groovy スクリプトでこの jar を使用できるようになりました....

@Grapes([
  @GrabConfig(systemClassLoader=true),
  @Grab('com.oracle:ojdbc6:11.2.0.1.0'),
])
import groovy.sql.*


このブドウを複数のサーバーに簡単に展開できるようにするために、どこにでも展開できる zip ファイルを作成しました....

$ unzip -qql oracle_jdbc_groovy_grape.zip
        0  06-11-2012 13:50   .groovy/grapes/com.oracle/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/jars/
  2111220  06-11-2012 11:46   .groovy/grapes/com.oracle/ojdbc6/jars/ojdbc6-11.2.0.1.0.jar
     2349  06-11-2012 11:50   .groovy/grapes/com.oracle/ojdbc6/ivy-11.2.0.1.0.xml
于 2013-11-05T16:45:41.393 に答える
4

ファイルを作成することで、Grape が使用するアイビー設定をカスタマイズできます~/.groovy/grapeConfig.xml

ローカル ファイル システムをリポジトリとして使用する方法の例を次に示します。

<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>
于 2011-05-15T13:57:21.643 に答える
2

この機能をグレープに追加することに関心がありましたが、深刻なことは何もありません。これが近い将来に追加される可能性は低いと思います。(6-18ヶ月)

于 2011-05-27T16:50:09.487 に答える