如何使用Nailgun Server启动Groovy脚本(或Java类)

时间:2011-07-20 11:18:56

标签: java groovy jvm nailgun

我正在开发一个经常启动的Groovy shell脚本(执行相当小的任务),因此我需要一个快速的JVM启动时间。要实现这一目标,我正尝试使用Nailgun启动它。

我已经将Nailgun安装为Ubuntu软件包。然后,我通过将/usr/bin/ng-server/usr/bin/ng相关联来修正argument bug。我正在启动这样的Nailgun-Server:

java -cp /usr/share/java/nailgun-0.7.1.jar -server com.martiansoftware.nailgun.NGServer

我有一个名为hello.groovy的简单虚拟Groovy脚本,只是为了测试nailgun-server:

#!/usr/bin/env groovy
def sayHello() {
  println("Hello Groovy!");
}

sayHello();

我用groovyc将文件编译为hello.class。

现在我想在Nailgun服务器中启动该脚本。我这样做的天真方法是:

ng hello
ng hello.sayHello

但我得到的只是ClassNotFoundExceptions:

java.lang.ClassNotFoundException: hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at com.martiansoftware.nailgun.NGSession.run(Unknown Source)

那么,使用Nailgun服务器启动Groovy脚本的正确方法是什么?我也很欣赏一些关于如何使用Nailgun的好网站/教程,很难获得如何使用它的任何信息......

修改

我还要感谢使用带有纯Java类的nailgun的完整示例(包括如何使用ng调用特定类),因为我也无法使用任何Java类。 < / p>

3 个答案:

答案 0 :(得分:5)

终于明白了。我只是不明白我必须先将所有需要的类添加到Nailgun类路径中(this SO question给了我最后的提示)。

首先,将Groovy添加到类路径中:

ng ng-cp /usr/share/java/groovy-all.jar

然后将包含Groovy脚本/ Java类的目录添加到类路径中,在我的例子中是:

ng ng-cp /home/$USER/tools/groovy

现在我可以像这样用Nailgun运行我的Groovy脚本:

ng hello

答案 1 :(得分:0)

我认为jruby.org最近提到了这种长期丢失的武器(甲骨文有一天会采取这种武器,因为对于大多数新鸟而言,冷启动是一个致命的跟腱)

你是否将你的剧本归入课堂?

然后在类路径上使用groovy'ng ... hello'

我的盲目猜测(在使用rvm维护jRuby之后,我很懒,无法重新安装我的轨道枪)

答案 2 :(得分:0)

如果运行的hello是hello.groovy(解释),我会感到惊讶  而不是编译下来的hello.class

不是一个可持续的解决方案 他们应该只有一个JSR 用于热启动客户端JVM

以便客户端模式中的JVM启动到后台守护程序,等待生成java进程,并清除Java一直忍受的性能不佳的所有幻想

当然,出于安全考虑,生产将始终使用完整的热点