Использование Nailgun в Eclipse для Java и Jython
Я только что настроил Nailgun ( https://github.com/martylamb/nailgun, http://martiansoftware.com/nailgun/), который представляет собой умный набор, который заставляет JVM зависать в памяти, делая Java и Jython (потенциально) запустить быстрее.
Это здорово для Java, но обещает быть для меня Jython абсолютной золотой пылью, особенно во время разработки (Jython - лучший язык в мире, но у него медленное время запуска).
Погуглив, чтобы увидеть, занимался ли кто-нибудь запуском Nailgun на Eclipse, я обнаружил красную сельдь, которая на GitHub называется "nailgun / eclipse-gtkrc": "nailgun" - просто ручка парня. Я также обнаружил, что отдел CS действительно занимался этим на http://www.cs.dartmouth.edu/~jygsaw/getting_started.html. Похоже, им действительно удалось заставить это работать на Jython, что было блестяще, но, к сожалению, их система использует сценарий BASH (Mac OS), и на данный момент я вынужден работать на Windows (W7).
То, что я тогда сделал, было
1) Запустил сервер Nailgun вне Eclipse, включая jython.jar в CLASSPATH,
2) Затем я создал файл client.bat, состоящий из одной строки:
ng org.python.util.jython %1
3) Затем я настроил "внешнюю конфигурацию инструмента" в Eclipse, которая называется "ng_client", в соответствии с инструкциями вышеупомянутого отдела CS, за исключением того, что я установил Location для вышеуказанного файла client.bat, и я сделал Аргументы: "${selected_resource_loc}"
(<- включая кавычки, потому что, к сожалению, на данный момент у меня есть пробелы на этом пути)
4) Я запустил этот "ng_client" один раз, чтобы он не сработал, но затем был включен в этот список внешних инструментов.
5) Затем я выбрал тривиальный py-файл Jython (trivial.py) и выбрал "Выполнить" -> "Внешние инструменты" -> ng_client.
Консоль показала следующий результат
C:\Program Files (x86)\eclipse-jee-luna-SR2-win32\eclipse>ng org.python.util.jython "G:\ Мои документы \ программные проекты \trivial.py"
recv: нет ошибок
Примечание: "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 Я также пытался запустить тривиальную программу Jython за пределами Eclipse. Пока что он всегда отключает сервер Nailgun, как описано выше. Есть немного доказательств того, что люди делают это успешно, но они, похоже, всегда работают на Linux, а не на Windows. Естественно, я планирую взглянуть на исходный код сервера, где ошибки происходят со временем.
2 ответа
Результат!
И это делает стартапы Jython очень быстрыми. Я рекомендую это всем Jythonistas.
Как я понял вчера (комментарий PS), первым делом нужно было запустить Jython вне Eclipse. Я обнаружил, что мне нужно было закомментировать 6 строк в файле nailgun-master\nailgun-server\src\main\java\com\martiansoftware\nailgun\NGSession.java:
д. 263-265
ll 381-383
А затем восстановите банку в соответствии с инструкциями по установке Nailgun (т.е. mvn clean install
).
После этого я создал удобный файл.bat для запуска сервера Nailgun ("...\jars" - это место, куда я помещаю nailgun-server-0.9.2-SNAPSHOT.jar и все остальные файлы jar, которые я хочу включить):
set classpath=d:/apps/jython2.7.0/jython.jar;d:/apps/jython2.7.0/jars/*
java com.martiansoftware.nailgun.NGServer
После этого для запуска из окна DOS перейдите:
ng org.python.util.jython "G:\My Documents\software projects\my_jython_project\__main__.py"
А затем, в Eclipse, после выполнения описанных выше шагов по настройке ng_client, выберите файл.py, который вы хотите запустить (в окне Project Explorer), и перейдите
Выполнить -> Внешние инструменты -> ng_client
Примечание: выходные данные sys.out & sys.err направляются в окно сервера... предположительно, это является следствием изменений, внесенных в файл NGSession.java. Если автор Nailgun, Марти Лэмб, когда-либо прочтет это, во-первых, спасибо за это замечательное приложение, а во-вторых, было бы хорошо, если у вас есть какие-либо комментарии об изменениях, которые я внес в NGSession.java.
потом
Происходят некоторые странные вещи... надеюсь, просто проблемы с зубами.
В частности, я хотел использовать это для модульного тестирования, которое, как и большинство разработок, включает в себя постоянный запуск вещей снова и снова. Проблема в том, что я склоняюсь к тому, что классы, которые я разрабатываю, иногда "задерживаются" в "памяти гвоздя". Я даже видел, как классы запускают старую версию самих себя, когда сервер NG останавливается и запускается новая... что совершенно сбивает с толку. Как правило, предполагается, что старые версии файлов.class каким-то образом "кэшируются" в памяти Nailgun, когда я этого не хочу. И это происходит даже при использовании опции "ng-cp" для указания дополнений CLASSPATH на клиенте, а не на сервере!
К сожалению, это все довольно "нишевая": использование Jython с модулем unittest, запуск Nailgun. Вздох.
Вместо того, чтобы вносить изменения в код Nailgun, которые Майк предлагает сделать для предотвращения исключения java.lang.ClassCastException, альтернативой является замена консоли, используемой Jython, на PlainConsole путем предоставления следующего системного свойства при запуске Nailgun: -Dpython.console=org.python.core.PlainConsole Это предотвращает исключения приведения класса и приводит к тому, что вывод консоли возвращается клиенту, а не окну сервера.