【问题标题】:Make groovy script grab a jar off the filesystem like grape让 groovy 脚本像葡萄一样从文件系统中抓取一个 jar
【发布时间】:2011-08-25 14:33:34
【问题描述】:

Grape 似乎非常适合将 jars 添加到类路径中。它 还做了很多其他的事情,比如获取和依赖管理。 例如

#!/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 存储库,但是 这似乎有点矫枉过正。

【问题讨论】:

    标签: groovy jar grape


    【解决方案1】:

    您可以通过创建~/.groovy/grapeConfig.xml 文件来使用 Grape 使用的customize the ivy settings

    这是一个如何使用本地文件系统作为存储库的示例:

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

    【讨论】:

    • 感谢您的回复。我提到我不想创建一个本地 maven 存储库——我希望能够在文件系统上指定任何 jar。
    • 对不起,我没有意识到这一点。从source code 看来,Grape 完全建立在 Ivy 之上。您可能必须实现自己的 AST 转换才能完成这项工作。
    • 感谢源链接,但我无法弄清楚:(太糟糕了,葡萄似乎可以运行(下载并加载一个常春藤罐子)但不能行走(从文件系统加载一个罐子) )
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      • 第一步:创建目录~/.groovy/grapes/com.oracle
      • 第二步:创建目录~/.groovy/grapes/com.oracle/ojdbc6
      • 第三步:创建目录~/.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
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          相关资源
          最近更新 更多