我有一个Groovy项目(使用Eclipse),它使用了几个@Grab
语句。这在我的开发机器上工作正常。但是,我需要将此应用程序(包括其所有依赖项)分发给其他没有任何互联网连接的计算机,即无法从这些计算机上下载必要的JAR。
有没有办法以某种方式自动将依赖项包含到项目中,例如一个lib
文件夹?这样我就可以将项目复制到另一台机器并使用它。
答案 0 :(得分:4)
所以,举个例子来说,你有一个类似的脚本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
中,放置这个下拉groovy
和groovy-wslite
依赖项的脚本,并应用shadow-jar插件将所有依赖项捆绑到一个胖胖的jar中: / p>
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文件,而不仅仅是脚本...
希望这有帮助
答案 1 :(得分:1)
我建议切换到Gradle或其他一些在构建时下载依赖项的构建工具。正如您可能已经知道,grape会在运行时将所有依赖项拉下来。
Grape(Groovy Adaptable Packaging Engine或Groovy Advanced Packaging Engine)是支持Groovy中的grab()调用的基础结构,Groovy是一组利用Ivy的类,允许Groovy使用存储库驱动的模块系统。这允许开发人员编写具有基本任意库要求的脚本,并仅发布脚本。 Grape将,在运行时,根据需要下载并链接命名库和所有依赖项,当脚本从现有存储库(如Ibiblio,Codehaus和java.net)运行时形成传递闭包。
此链接可帮助您过渡到将Grodle与Groovy脚本一起使用。
答案 2 :(得分:0)
您可以将Grape repo复制到目标部署服务器。应该是〜/ .groovy / Grape 。然后你可以按原样将@Grabs保存在脚本中
答案 3 :(得分:0)
两种解决方案
用gradle代替整个构建进度,就像@tim_yates的答案中提到的一样。
使用grape install
命令将软件包预安装到grape本地存储库中,其默认路径为“〜/ .groovy / grapes”。然后将脚本和grape dir打包在一起。您可以将葡萄仓库目录切换到您喜欢的地方。参见http://docs.groovy-lang.org/latest/html/documentation/grape.html