2014-03-13 19 views
1

当应用程序完全自包含在一个.groovy文件中时,不会生成任何.class文件。但是,当我将这些类分离成单独的文件并将它们放入包中时,最终会生成数百个生成的.class文件(大部分来自所有的闭包,分别编译为字节码)。我有一个大的Groovy应用程序(〜2000行)使用多个.groovy文件。我应该如何处理生成的类文件?

是什么时,所有这些文件的生成,最终搞乱的文件夹管理文件系统的最佳方法?

  1. 我应该留在一个文件中的一切吗?这是最简洁的方法 到文件系统,但我最终与一个大的.groovy文件和逻辑分离没有 。
  2. 我应该将所有东西都打包成一个罐子吗?该 将工作,但它减少了脚本 根据需要进行小的更改的灵活性。
  3. 我是否忽略.class文件?
+1

你应该保持逻辑的分离,并创建一个“/目标”文件夹w /你的构建工具(gradle或其他)来收集生成的类在标准化文件夹内。 –

+1

我一直在考虑使用gradle进行构建,但考虑到.groovy文件只能直接执行,因此它在工作流程中添加了一个步骤。我想我不能两种方式(直接从文本和干净的部署灵活执行)。感谢您的建议。 – haventchecked

+1

我同意,我认为从长远来看,干净部署更加灵活和可靠。 –

回答

1

选项#2是最好的,只要您使用构建工具,如Gradle。我们的DevOps团队使用Groovy,并提供自包含的zip文件。

作为一个简单的例子,看看this project

它提供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任务(或简单脚本),可以轻松自动执行构建,本地部署和执行的步骤。

+1

谢谢你。实际上我采用了gradle方法,它在创建一个超级瓶子方面很好。这个项目如果你很好奇https://github.com/garypaduana/Scripts/tree/master/General%20File%20Utility 当我从本地svn回购转换到github时,仍然有很多工作正在进行中。 – haventchecked

1

建设有脚本可执行的JAR和嵌入式Groovy是与Gradle简单。

的优点是验证该脚本是可编译和单元部署到生产环境之前进行测试。

下面是一个例子:

脚本/ 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() 
    } 
} 

scripts/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 Environment Manager (GVM)使得它易于安装和管理Groovy和相关工具,包括 Gradle

+0

这不包括我的源代码(即src/org ....)。我尝试了很多不同的build.gradle配置,似乎缺少一些基本的东西(我曾经是一个.Net开发者)。所以总而言之,它完美地完成了我所有的依赖和元素,但是遗漏了实际的代码,任何想法? – GarethReid

1

首先,如果您编译.groovy文件,您将获得相同的.class文件。

这样一来,我想提一个替代方案,但我不建议使用它。

Groovy非常能够在运行时编译相关的.groovy文件。第一个要求是这些文件遵循java规范中的软件包。例如,如果您在.groovy文件的包栏中有类Foo,则该文件必须位于./bar/Foo.groovy和根目录“。”中。必须位于类路径中。

第二个要求是Groovy必须能够清楚地将类识别为类,并且它不能是属性。因此,例如“def a = Foo.class”就不清楚了,因为Foo可能是一个属性。 “import bar.Foo”使事情变得清晰。在类,接口,字段或方法头以及catch子句和新实例表达式中使用类同样。

第三个要求是使用GroovyClassLoader查找类。

如果您从命令行使用groovy命令,那么情况就是这样。 groovy命令也将当前目录放在类路径中。

+0

我昨天就开始使用这种方法,但后来改为使用gradle,并且所有事情都像预期的那样使用jar输出很好地工作。感谢您的输入! – haventchecked

相关问题