在Groovy应用程序中包含依赖项,而无需访问存储库



我有一个Groovy项目(使用Eclipse),它使用了几个@Grab语句。这在我的开发机器上运行良好。然而,我需要将这个应用程序(包括它的所有依赖项)分发给其他没有任何互联网连接的机器,也就是说,不可能从这些机器下载必要的JAR。

有没有一种方法可以自动将依赖项包含到项目中,例如lib文件夹?通过这种方式,我可以将项目复制到另一台机器上并使用它。

例如,假设您有一个类似的脚本Script.groovy,您当前使用groovy Script.groovy:运行

@Grab('com.github.groovy-wslite:groovy-wslite:1.1.2')
import wslite.rest.*
def client = new RESTClient("http://httpbin.org")
def response = client.get(path:'/get')
assert 200 == response.statusCode
println "Received : $response.json"

现在,我们想把它放入一个可以分发的jar文件中,人们只需使用java -jar myApp.jar 即可运行

因此,制作以下文件夹结构:

myApp
 |-- src
 |    |-- main
 |         |-- groovy
 |              |-- example
 |                   |-- Script.groovy
 |-- build.gradle

然后,在Script.groovy中,放入脚本(带有包名,没有@Grab注释):

package example
import wslite.rest.*
def client = new RESTClient("http://httpbin.org")
def response = client.get(path:'/get')
assert 200 == response.statusCode
println "Received : $response.json"

build.gradle中,放入这个脚本,它下拉groovygroovy-wslite依赖项,并应用shadow-jar插件将所有依赖项捆绑到一个单独的胖jar中:

plugins {
  id "com.github.johnrengelman.shadow" version "1.2.2"
}
apply plugin: 'groovy'
apply plugin: 'application'
repositories {
    jcenter()
}
mainClassName = 'example.Script'
dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.4.5'
    compile 'com.github.groovy-wslite:groovy-wslite:1.1.2'
}

然后你可以(假设你已经安装了Gradle),只需运行:

gradle shadowJar

它将编译您的代码,并将其及其所有依赖项放入build/libs/myApp-all.jar

那么,你就可以运行:

java -jar build/libs/myApp-all.jar

你的脚本应该像以前一样运行。。。

然后,您可以分发这个jar文件,而不仅仅是脚本。。。

希望这能帮助

我建议切换到Gradle或其他一些在构建时下载依赖项的构建工具。您可能已经知道,grape在运行时会删除所有依赖项。

Grape(GroovyAdaptable Packaging Engine或GroovyAdvanced Packaging Engine)是在Groovy中启用grab()调用的基础设施,这是一组利用Ivy为Groovy提供存储库驱动模块系统的类。这允许开发人员编写一个基本上具有任意库需求的脚本,并只发送该脚本。Grape将在运行时根据需要下载并链接命名库和所有依赖项,当脚本从现有存储库(如Ibiblio、Codehaus和java.net)运行时,这些库和依赖项形成一个可传递的闭包。

这个链接可能有助于您在Groovy脚本中使用Gradle。

从Gradle 运行Groovy脚本

您可以将Grape repo复制到目标部署服务器。应该是~/.grooovy/Grape。然后你可以像

一样将@Grabs保留在脚本中

两种解决方案

  1. 用gradle替换整个构建进度,就像@tim_yates的回答中提到的那样。

  2. 使用grape install命令将包预安装到grape本地repo中,默认路径为"~/.grooovy/grapes"。然后将脚本和grape目录打包在一起。您可以将葡萄回购目录切换到您喜欢的位置。参见第3.5节http://docs.groovy-lang.org/latest/html/documentation/grape.html

最新更新