在groovy中使用grape管理类库依赖

groovy 1.6增加了grape,用于自动管理groovy引用第三方类库的依赖问题。

见:

http://groovy.codehaus.org/Grape

安装groovy1.6.x以后,可以通过grape命令查看目前缓存的类库情况:

marshal@ubuntu-desktop:~/workspace$ grape list

0 Grape modules cached
0 Grape module versions cached

可以grape命令增加新的类库,比如加入jetty6.1.6嵌入式版本:

grape install org.mortbay.jetty jetty-embedded 6.1.6

执行后,再次执行grape list:

marshal@ubuntu-desktop:~/workspace$ grape list

org.mortbay.jetty jetty-util  [6.1.6]
org.mortbay.jetty jetty  [6.1.6]
org.mortbay.jetty project  [6.1.6]
org.mortbay.jetty jetty-embedded  [6.1.6]
org.mortbay.jetty servlet-api-2.5  [6.1.6]
javax.servlet.jsp jsp-api  [2.1]

 

可以看出,获取jetty的同时,会获取和jetty相关的类库。这就比获得groovy所需类库的方法中的方式简便很多。

还可以更方便的Grab注解,将需要类库依赖的部分写到脚本代码里面。这样代码就可以很方便的部署到任何支持groovy脚本的服务器上。

#!/usr/bin/env groovy

import org.mortbay.jetty.Server
import org.mortbay.jetty.servlet.*
import groovy.servlet.*

@Grab(group = ‘org.mortbay.jetty’, module = ‘jetty-embedded’, version = ’6.1.6′)
def runServer() {
    def server = new Server(9999)
    def context = new Context(server, "/", Context.SESSIONS);
    context.resourceBase = "."
    context.addServlet(GroovyServlet, "*.gsp")
    server.start()
}

runServer()

上面的脚本,将启动jetty在9999端口,并且支持groovlets,扩展名为gsp,groovlets路径和该脚本一致。比如在该脚本目录下写一个index.gsp文件:

println ‘test’

就可以通过:

http://localhost:9999/index.gsp

访问到。

这些grape缓存的jar文件,都存放在这里:

marshal@ubuntu-desktop:~$ ls .groovy/grapes/
com.sun.jdmk      javax.jms      javax.servlet.jsp
com.sun.jmx       javax.mail     log4j
javax.activation  javax.servlet  org.mortbay.jetty

 

实际上grape/grabe使用的是ant ivy来自动获取类库,而ivy是使用了maven结构的类库资源库(repository)机制。因此,grape可以很好的和maven配合,使用maven的本地缓存资源库。

需要在~/.groovy目录下创建一个文件grapeConfig.xml,内容是:

<?xml version="1.0"?>
<ivysettings>
    <settings defaultResolver="downloadGrapes"/>
    <resolvers>
        <chain name="downloadGrapes">
            <!– todo add ‘endorsed groovy extensions’ resolver here –>
            <ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>
            <filesystem name="cachedGrapes">
                <ivy pattern="${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml"/>
                <artifact pattern="${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]"/>
            </filesystem>
            <ibiblio name="codehaus" root="http://repository.codehaus.org/" m2compatible="true"/>
            <ibiblio name="ibiblio" m2compatible="true"/>
            <ibiblio name="java.net2" root="http://download.java.net/maven/2/" m2compatible="true"/>
        </chain>
    </resolvers>
</ivysettings>

 

然后比如执行:

grape install org.apache.activemq activemq-core 5.3.0

因为activemq我已经在maven项目中使用,因此maven本地缓存中有。看到的提示是:

marshal@ubuntu-desktop:~$ grape install org.apache.activemq activemq-core 5.3.0
:: loading settings :: url = jar:file:/opt/groovy-1.6.5/lib/ivy-2.1.0-rc2.jar!/org/apache/ivy/core/settings/ivysettings.xml
:: resolving dependencies :: caller#all-caller;working
    confs: [default]
    found org.apache.activemq#activemq-core;5.3.0 in local
    found commons-logging#commons-logging-api;1.1 in local

 

在本地发现类库文件,因此说明grape使用到了maven的本地库。

創建PDF格式    发送文章为PDF   

这篇文章上的评论的 RSS feed TrackBack URI

Leave a Reply