Ожидаемый алгоритм:
- Вы запускаете JVM без реального приложения (только говорит ему загрузить несколько jar-файлов), он загружает и прослушивает сокет и ждет в фоновом режиме.
- Когда вы запускаете приложение (
preloaded_java -cp /usr/share/java/....jar:. qqq.jar
), оно подключается к существующей загруженной JVM, загружает дополнительные jar-файлы (если есть) и выполняет основной класс. preloaded_java
просто маршрутизирует ввод и вывод, обрабатывает прерывания и т. д.
Обновление Реализовано подтверждение концепции: http://vi-server.org/vi/code/prejvm/
$ clojure prejvm.clj&
[1] 2883
$ nc 127.0.0.1 7711 <<< '{"mainclass" "test.Hello"}'
$ nc 127.0.0.1 7712
java.lang.ClassNotFoundException: test.Hello
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
...
at clojure.main.main(main.java:37)
$ nc 127.0.0.1 7711 <<< '{"classpaths" ["file:///home/vi/code/prejvm/"], "mainclass" "test.Hello"}'
$ nc 127.0.0.1 7712
Hello, world; number of args is 0
qwe q e32e qda
qwe q e32e qda
$ nc 127.0.0.1 7711 <<< '{"classpaths" ["file:///home/vi/code/prejvm/"], "mainclass" "test.Hello", "argv" ["qqq" "www" "eee"]}'
$ nc 127.0.0.1 7712
Hello, world; number of args is 3
sdfasdfasf df sad
sdfasdfasf df sad
Обновление 2: нашел ответ сам: сервер Nailgun (от VimClojure).