![](/img/trans.png)
[英]How to set up my groovy class so I can use it's instance in other groovy scripts
[英]I've got a large Groovy application (~2000 lines) using multiple .groovy files. How should I handle the generated class files?
当应用程序完全独立于一个.groovy文件中时,不会生成.class文件。 但是,当我将类分离成单独的文件并将它们放在包中时,我最终得到了数百个生成的.class文件(大多数是从所有的闭包编译到字节码分别)。
在生成所有这些文件并最终使文件夹混乱时,管理文件系统的最佳方法是什么?
如果您使用像Gradle这样的构建工具,则选项#2是最好的。 我们的DevOps团队使用Groovy,并提供自包含的zip文件。
举个简单的例子,看看这个项目 。
它提供warO.zip
,解压缩到:
warO.jar
jars/groovy-all-1.6.4.jar
jars/guava-collections-r03.jar
jars/guava-base-r03.jar
因为清单是使用主类和类路径设置的,所以用户可以执行:
java -jar warO.jar
您的用户将会喜欢它。 他们甚至不需要安装Groovy,只需安装JRE。
关于开发周期,对脚本的编辑确实不是那么快,但通过添加Gradle任务(或简单脚本),可以轻松地自动执行构建,本地部署和执行的步骤。
使用Gradle构建一个带有脚本和嵌入式Groovy的可执行jar很简单。
优点是验证脚本在部署到生产环境之前是可编译和单元测试的。
这是一个例子:
脚本/ src目录/主/常规/ script1.groovy
println "Hello World!"
def aTestableMethod() {
1 + 1
}
脚本/ src目录/测试/常规/ script1Test.groovy
import org.junit.Test
import static org.junit.Assert.*
class Script1Test {
@Test
public void checkATestableMethod() {
def script1 = new script1()
assertEquals 2, script1.aTestableMethod()
}
}
脚本/的build.gradle
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.2.2'
testCompile 'junit:junit:4.11'
}
jar {
from {
configurations.compile.collect {
it.isDirectory() ? it : zipTree(it)
}
configurations.runtime.collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes 'Main-Class': 'script1'
}
}
$ gradle build $ java -jar build/libs/scripts/scripts.jar Hello World!
首先,如果编译.groovy文件,您将获得相同的.class文件。
除此之外,我想提一个替代方案,但我不建议使用它。
Groovy能够在运行时编译依赖的.groovy文件。 第一个要求是文件遵循包的java约定。 例如,如果.groovy文件中的包条中有Foo类,则该文件必须位于./bar/Foo.groovy和根目录“。”中。 必须在类路径上。
第二个要求是Groovy必须能够清楚地将类识别为类,并且它不能是属性。 所以例如单独“def a = Foo.class”,不清楚,因为Foo可能是一个属性。 “import bar.Foo”让事情变得清晰。 对于类,接口,字段或方法标头中的类以及catch子句和新实例表达式的使用也是如此。
第三个要求是使用GroovyClassLoader查找类。
如果从命令行使用groovy命令,则情况就是这样。 groovy命令也会将当前目录放在类路径上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.