gpt4 book ai didi

groovy - 让 Groovy 脚本像葡萄一样从文件系统中抓取一个 jar

转载 作者:行者123 更新时间:2023-12-02 01:09:40 25 4
gpt4 key购买 nike

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()

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

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

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

最佳答案

这就是我解决这个问题的方法。当 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

关于groovy - 让 Groovy 脚本像葡萄一样从文件系统中抓取一个 jar ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6003609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com