java groovy jar包_如何将jar包包含在groovy脚本中?
如果你真的需要,你也可以在運行時加載一個JAR:
this.getClass().classLoader.rootLoader.addURL(new File("file.jar").toURL())
使用#!/usr/bin/env groovy啟動groovy腳本有一個非常重要的限制 – 不能添加額外的參數。 沒有classpath可以configuration,沒有定義或在debugging運行groovy。 這不是一個常規的問題,但在shebang( #! )的工作方式上有一個限制 – 所有附加的參數都被當作單一的參數,所以#!/usr/bin/env groovy -d告訴/usr/bin/env運行那么這個命令就會隨著d一個參數而變化。
這個問題有一個解決方法,它涉及在groovy腳本中使用bash引導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'
所有的魔法都發生在前兩行。 第一行告訴我們這是一個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, $@是參數。 現在groovy運行,它忽略了前兩行,看到我們的groovy腳本,然后退出到bash 。 然后bash退出( exit $?1 )與groovy的狀態代碼。
您可以將這些jar子添加到$ HOME / .groovy / lib
我最喜歡的方式是使用Groovy Grapes。 這些訪問Maven Central Repository,下載引用的jar,然后放到classpath中。 然后,您可以像使用其他庫一樣使用該庫。 語法非常簡單:
@Grab(group='com.google.collections', module='google-collections', version='1.0')
你可以在這里細節。 這里的一個主要優點是在分發腳本時不需要分配依賴關系。 這個方法唯一的缺點是Jar必須在Maven倉庫中。
你也可以嘗試Groovy葡萄。 它允許您使用注釋來修改類path。 它的實驗現在,但很酷。 請參閱http://groovy.codehaus.org/Grape
和你在Java中一樣。
這是運行MySQL狀態監視腳本的一個例子。 mysql.jar包含我從腳本status.groovy調用的MySQL連接器。
groovy -cp mysql.jar status.groovy ct1
他的回答給@帕特里克增加了很多,最近我發現了另外一個竅門。
如果你把大量的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"
讓你的想象力瘋狂在命令行的復雜程度上,你可以把它分解成可pipe理的部分
馬騰
下面是Patrick的解決scheme , Maarteen Boekhold的解決scheme和foozbar的評論的結合,可以在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也會在分號之后執行命令。
exec取代當前進程中的當前程序,而不需要分配新的進程。 因此,Groovy在原始腳本進程中運行( ps將進程顯示為腳本而不是groovy可執行文件)
exit $? exec groovy語句阻止bash嘗試將腳本的其余部分解釋為bash腳本,并保留groovy腳本的返回碼。
在某些情況下,上述bash技巧比RootLoader技巧更方便,因為您可以在腳本中使用常規導入語句。 使用RootLoader技巧迫使你使用reflection來加載所有的類。 在某些情況下(例如,當您需要加載JDBC驅動程序時),這很好,但在其他情況下不方便。
如果您知道您的腳本永遠不會在Cygwin上執行,那么使用Patrick或Maarteen的解決scheme可能會導致稍微好一點的性能,因為它們避免了生成和拋出錯誤的開銷。
如果你想在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文章 。
總結
以上是生活随笔為你收集整理的java groovy jar包_如何将jar包包含在groovy脚本中?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos6.8 yum mysql7
- 下一篇: scala typetag java,s