java groovy jar包_如何将jar包包含在groovy脚本中?
如果你真的需要,你也可以在運行時加載一個JAR:
this.getClass().classLoader.rootLoader.addURL(new File("file.jar").toURL())
使用#!/usr/bin/env groovy啟動groovy腳本有一個非常重要的限制 – 不能添加額外的參數(shù)。 沒有classpath可以configuration,沒有定義或在debugging運行g(shù)roovy。 這不是一個常規(guī)的問題,但在shebang( #! )的工作方式上有一個限制 – 所有附加的參數(shù)都被當(dāng)作單一的參數(shù),所以#!/usr/bin/env groovy -d告訴/usr/bin/env運行那么這個命令就會隨著d一個參數(shù)而變化。
這個問題有一個解決方法,它涉及在groovy腳本中使用bash引導(dǎo)groovy 。
#!/bin/bash //usr/bin/env groovy -cp extra.jar:spring.jar:etc.jar -d -Dlog4j.configuration=file:/etc/myapp/log4j.xml "$0" $@; exit $? import org.springframework.class.from.jar //other groovy code println 'Hello'
所有的魔法都發(fā)生在前兩行。 第一行告訴我們這是一個bash腳本。 bash開始運行并看到第一行。 在bash #是用于注釋和/被折疊到/哪個是根目錄。 所以bash會運行/usr/bin/env groovy -cp extra.jar:spring.jar:etc.jar -d -Dlog4j.configuration=file:/etc/myapp/log4j.xml "$0" $@開始groovy與所有我們想要的論點。 "$0"是我們腳本的path, $@是參數(shù)。 現(xiàn)在groovy運行,它忽略了前兩行,看到我們的groovy腳本,然后退出到bash 。 然后bash退出( exit $?1 )與groovy的狀態(tài)代碼。
您可以將這些jar子添加到$ HOME / .groovy / lib
我最喜歡的方式是使用Groovy Grapes。 這些訪問Maven Central Repository,下載引用的jar,然后放到classpath中。 然后,您可以像使用其他庫一樣使用該庫。 語法非常簡單:
@Grab(group='com.google.collections', module='google-collections', version='1.0')
你可以在這里細(xì)節(jié)。 這里的一個主要優(yōu)點是在分發(fā)腳本時不需要分配依賴關(guān)系。 這個方法唯一的缺點是Jar必須在Maven倉庫中。
你也可以嘗試Groovy葡萄。 它允許您使用注釋來修改類path。 它的實驗現(xiàn)在,但很酷。 請參閱http://groovy.codehaus.org/Grape
和你在Java中一樣。
這是運行MySQL狀態(tài)監(jiān)視腳本的一個例子。 mysql.jar包含我從腳本status.groovy調(diào)用的MySQL連接器。
groovy -cp mysql.jar status.groovy ct1
他的回答給@帕特里克增加了很多,最近我發(fā)現(xiàn)了另外一個竅門。
如果你把大量的jar添加到classpath中,那么事情會變得很難理解。 但是你可以做以下的事情!
#!/bin/bash //bin/true && OPTS="-cp blah.jar -Dmyopt=value" //bin/true && OPTS="$OPTS -Dmoreopts=value2" //usr/bin/env groovy $OPTS "$0" $@; exit $? println "inside my groovy script"
讓你的想象力瘋狂在命令行的復(fù)雜程度上,你可以把它分解成可pipe理的部分
馬騰
下面是Patrick的解決scheme , Maarteen Boekhold的解決scheme和foozbar的評論的結(jié)合,可以在Linux和Cygwin上使用:
#!/bin/bash // 2>/dev/null; SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" // 2>/dev/null; OPTS="-cp $SCRIPT_DIR/lib/extra.jar:$SCRIPT_DIR/lib/spring.jar" // 2>/dev/null; OPTS="$OPTS -d" // 2>/dev/null; OPTS="$OPTS -Dlog4j.configuration=file:/etc/myapp/log4j.xml" // 2>/dev/null; exec groovy $OPTS "$0" "$@"; exit $? import org.springframework.class.from.jar //other groovy code println 'Hello'
怎么運行的:
//是一個有效的groovy注釋,所以所有的bash命令都被Groovy忽略。
//將返回一個錯誤,但錯誤輸出被redirect到/dev/null ,因此不會顯示。
即使前面的命令失敗,bash也會在分號之后執(zhí)行命令。
exec取代當(dāng)前進(jìn)程中的當(dāng)前程序,而不需要分配新的進(jìn)程。 因此,Groovy在原始腳本進(jìn)程中運行( ps將進(jìn)程顯示為腳本而不是groovy可執(zhí)行文件)
exit $? exec groovy語句阻止bash嘗試將腳本的其余部分解釋為bash腳本,并保留groovy腳本的返回碼。
在某些情況下,上述bash技巧比RootLoader技巧更方便,因為您可以在腳本中使用常規(guī)導(dǎo)入語句。 使用RootLoader技巧迫使你使用reflection來加載所有的類。 在某些情況下(例如,當(dāng)您需要加載JDBC驅(qū)動程序時),這很好,但在其他情況下不方便。
如果您知道您的腳本永遠(yuǎn)不會在Cygwin上執(zhí)行,那么使用Patrick或Maarteen的解決scheme可能會導(dǎo)致稍微好一點的性能,因為它們避免了生成和拋出錯誤的開銷。
如果你想在import聲明之前馬上使用它,可以像這樣:)
// printEmployees.groovy this.class.classLoader.rootLoader.addURL( new URL("file:///C:/app/Dustin/product/11.1.0/db_1/jdbc/lib/ojdbc6.jar")) import groovy.sql.Sql sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:orcl", "hr", "hr", "oracle.jdbc.pool.OracleDataSource") sql.eachRow("SELECT employee_id, last_name, first_name FROM employees") { println "The employee's name is ${it.first_name} ${it.last_name}." }
采取從這個javaworld.com文章 。
總結(jié)
以上是生活随笔為你收集整理的java groovy jar包_如何将jar包包含在groovy脚本中?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos6.8 yum mysql7
- 下一篇: scala typetag java,s