在 Java 和 Jython 的 Eclipse 中使用 Nailgun

Using Nailgun in Eclipse for Java and Jython

我刚刚设置了 Nailgun (https://github.com/martylamb/nailgun, http://martiansoftware.com/nailgun/),这是一个聪明的工具包,它使 JVM 在内存中停留,使 Java 和 Jython(可能)启动得更快。

这对 Java 来说很棒,但它对我来说绝对是 Jython 的金粉,特别是在开发过程中(Jython 是世界上最好的语言,但启动时间很慢) .

谷歌搜索看看是否有人在 Eclipse 上解决了 运行ning Nailgun 我发现了一条红鲱鱼,它是 GitHub 处的 "nailgun/eclipse-gtkrc":"nailgun" 只是那个人的处理。 我还发现 CS 部门实际上已经在 http://www.cs.dartmouth.edu/~jygsaw/getting_started.html 解决了这个问题。他们似乎实际上已经设法让 Jython 工作,这可能很棒,但不幸的是他们的系统依赖于使用 BASH 脚本(Mac OS),我被迫目前在 Windows (W7) 上工作。

然后我做的是

1) 在 Eclipse 外部启动 Nailgun 服务器,包括 CLASSPATH 中的 jython.jar,

2) 然后我创建了一个 client.bat 文件,其中包含一行:

ng org.python.util.jython %1

3) 然后我按照上述 CS 部门的说明在 Eclipse 中设置了一个名为 "ng_client" 的 "external tool configuration",只是我将 Location 设置为上述 client.bat 文件,我做了参数:"${selected_resource_loc}"(<-- 包括引号,因为不幸的是目前我在这条路径中有空格)

4) 我运行 这个"ng_client" 曾经失败过,但后来被包含在这个外部工具列表中。

5) 然后我选择了一个普通的 Jython py 文件 (trivial.py) 并转到 运行 --> 外部工具 --> ng_client.

控制台显示如下结果

C:\Program Files (x86)\eclipse-jee-luna-SR2-win32\eclipse>ng org.python.util.jython "G:\My Documents\software projects\trivial.py"

recv: No error

注意 "recv: No error" 为红色。程序,我赶紧补充,没有运行.

顺便提一下,对于任何感兴趣的人,这会导致 Nailgun 服务器终端发出以下错误消息:

C:\Users\Mike>java com.martiansoftware.nailgun.NGServer
NGServer 0.9.2-SNAPSHOT started on all addresses, port 2113.
NGSession 1: 127.0.0.1: org.python.util.jython exited with status -1
java.lang.ClassCastException: org.python.util.JLineConsole$Stream cannot be cast
 to com.martiansoftware.nailgun.ThreadLocalInputStream
        at com.martiansoftware.nailgun.NGSession.run(NGSession.java:263)
Exception in thread "NGSession 2: 127.0.0.1: org.python.util.jython" java.lang.C
lassCastException: org.python.util.JLineConsole$Stream cannot be cast to com.mar
tiansoftware.nailgun.ThreadLocalInputStream
        at com.martiansoftware.nailgun.NGSession.run(NGSession.java:381)

我似乎很接近...有 Eclipse 专家知道我应该如何进行吗?

PS 我还尝试 运行 在 Eclipse 之外安装一个简单的 Jython 程序。到目前为止,它总是像上面那样启动 Nailgun 服务器。有一些证据表明有人成功地做到了,但他们似乎总是在 Linux 框上,而不是 Windows。很自然地,我打算在适当的时候查看发生错误的服务器源代码。

结果!

它使 Jython 的启动速度超快。我向所有 Jythonist 推荐这个。

正如我昨天最终意识到的(PS 评论),第一件事是让 Jython 到 Eclipse 之外 运行。 我发现我必须做的是注释掉文件 nailgun-master\nailgun-server\src\main\java\com\martiansoftware\nailgun\NGSession.java:
中的 6 行 将 263-265
将 381-383
然后按照 Nailgun 设置说明重建 jar(即 mvn clean install)。

在此之后,我为 运行 Nailgun 服务器制作了一个方便的 .bat 文件(“...\jars”是我放置 nailgun-server-0.9.2-[=50= 的地方) ] 以及我想包括的所有其他罐子):

set classpath=d:/apps/jython2.7.0/jython.jar;d:/apps/jython2.7.0/jars/*
java com.martiansoftware.nailgun.NGServer

在此之后,从 DOS window 到 运行 去:

ng org.python.util.jython "G:\My Documents\software projects\my_jython_project\__main__.py"

然后,在 Eclipse 中,按照上述步骤设置 ng_client 后,select 您想要 运行 的 .py 文件(在 Project explorer window) 然后去

运行 --> 外部工具 --> ng_client

注意 sys.out & sys.err 输出被定向到服务器 window...大概这是对 NGSession.java 所做更改的结果。如果 Nailgun 的作者 Marty Lamb 曾经读过这篇文章,首先感谢这款出色的应用程序,其次如果您对我对 NGSession.java.

所做的更改有任何评论,那就太好了

以后

发生了一些奇怪的事情...希望只是初期的麻烦。

特别是,我想将它用于单元测试,就像大多数开发一样,它会不断地 运行 一遍又一遍地进行测试。问题是我倾向于发现我正在开发的 classes 有时似乎在 "Nailgun memory" 中 "linger"。当 NG 服务器停止并启动新服务器时,我什至看到 classes 运行 他们自己的旧版本......这完全令人费解。它倾向于暗示旧版本的 .class 文件在我不希望它们出现时以某种方式在 Nailgun 内存中 "cached"。即使在客户端而不是服务器中使用 "ng-cp" 选项指定 CLASSPATH 添加,也会发生这种情况!

不幸的是,这完全是 "niche":将 Jython 与单元测试模块 运行ning Nailgun 结合使用。唉。

不是像 Mike 建议的那样对 Nailgun 进行代码更改以防止 java.lang.ClassCastException,而是通过提供以下系统 属性 将 Jython 使用的控制台更改为 PlainConsole你启动钉枪: -Dpython.console=org.python.core.PlainConsole 这可以防止 class 转换异常并导致控制台输出也返回给客户端而不是服务器 window。