在没有存储库访问权限的情况下在Groovy应用程序中包含依赖项

Rob*_*uch 3 groovy ruby-grape

我有一个Groovy项目(使用Eclipse),该项目使用了多个@Grab语句。这在我的开发机器上工作正常。但是,我需要将此应用程序(包括其所有依赖项)分发给没有任何互联网连接的其他计算机,即无法从这些计算机下载必要的JAR。

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

tim*_*tes 5

因此,例如,假设您有一个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"
Run Code Online (Sandbox Code Playgroud)

现在,我们希望将其放入一个可以分发的jar文件中,人们可以通过 java -jar myApp.jar

因此,请创建以下文件夹结构:

myApp
 |-- src
 |    |-- main
 |         |-- groovy
 |              |-- example
 |                   |-- Script.groovy
 |-- build.gradle
Run Code Online (Sandbox Code Playgroud)

然后,在中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"
Run Code Online (Sandbox Code Playgroud)

然后在中build.gradle,放入下面的脚本,该脚本将groovy,和groovy-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'
}
Run Code Online (Sandbox Code Playgroud)

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

gradle shadowJar
Run Code Online (Sandbox Code Playgroud)

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

因此,您可以运行:

java -jar build/libs/myApp-all.jar
Run Code Online (Sandbox Code Playgroud)

您的脚本应该像以前一样运行...

然后,您可以分发此jar文件,而不仅仅是脚本...

希望这可以帮助

  • 我一直使用Gradle ...不过这取决于个人喜好,并且有很多工具可以胜任 (2认同)