3

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

我已将 Nailgun 安装为 Ubuntu 软件包。然后我通过链接/usr/bin/ng-server/usr/bin/ng. 我正在像这样启动 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 的好网站/教程,真的很难获得如何使用它的任何信息......

编辑:

我还希望有一个完整的示例(包括如何使用 ng 调用特定类)将 nailgun 与纯 Java 类一起使用,因为我也无法让 ng 与任何 Java 类一起使用。

4

3 回答 3

5

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

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

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

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

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

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

ng hello
于 2011-07-21T14:27:57.877 回答
0

我认为 jruby.org 最近提到了这种失传已久的武器(有一天甲骨文应该采用,因为缓慢的冷启动是大多数新鸟的致命弱点)

你把你的脚本编入类了吗?

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

我的盲目猜测(在使用 rvm 维护 jRuby 后懒得重新安装我的 railgun)

于 2011-07-20T14:49:00.360 回答
0

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

这不是一个可持续的解决方案,他们应该只为热启动客户端 JVM 提供一个 JSR

让客户端模式的 JVM 启动为后台守护进程,等待生成 java 进程,清除 Java 一直存在的性能不佳的幻想

当然为了安全起见,生产总是会使用全热点

于 2011-07-22T10:20:21.667 回答