让groovy脚本从像葡萄这样的文件系统中抓取一个罐子

时间:2011-05-14 17:33:27

标签: groovy jar grape

Grape似乎可以很好地将jar添加到类路径中。它 还做了很多其他的事情,比如获取和依赖管理。 e.g。

#!/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()

有没有办法让葡萄从文件系统中抓取一个罐子?如果不, 我可以以某种方式复制葡萄在groovy / java中做的事情吗?

我希望这个解决方案适用于可由许多用户和许多不兼容的jar运行的脚本,因此将jar添加到公共目录(例如〜/ .groovy / lib /)将无效。

我可以为本地的jar库创建一个本地maven存储库但是 这似乎有点矫枉过正。

4 个答案:

答案 0 :(得分:7)

这就是我解决这个问题的方法。 当Grape(Ivy)需要某些内容时,它会将其缓存在~/.groovy/grapes目录下。您需要做的就是创建自己的ivy.xml文件并将jar放入其中。我只是看一下从maven下载的其他一些文物,我想通了。这是一个小例子......

我们在这里使用Oracle,我希望它的jdbc jar文件能够被我的Groovy脚本“抓取”。 不幸的是,我找不到网上有这个jar的任何存储库。

  • 第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

答案 1 :(得分:4)

您可以通过创建~/.groovy/grapeConfig.xml文件{Grager}使用customize the ivy settings

以下是如何将本地文件系统用作存储库的示例:

<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>

答案 2 :(得分:1)

已经some interest in adding this feature to grape但没有什么严重的。我的猜测是,不太可能在不久的将来添加它。 (6-18个月)

答案 3 :(得分:0)

根据this enhancement,Grapes 现在还将搜索您本地的 Maven 存储库以及 Maven Central。

您可以通过以下方式在本地存储库中安装任何 jar: