Здравствуйте, ·, Вы писали:
·>А ещё весёлые матрёшки как в jni плагине jar-зависимость, которая испольует jni... happy degugging.
PD>> И не только версии JDK. А еще и просто зависимости от прочих артефактов, которые могут быть в основной java программе и других jar различными по версии. Если они там окажутся одновременно в итоге загрузки, то хорошего будет тоже мало.
·>Формально этот самый кастомный ClassLoader можно создавать "чистым", т.е. ты контролируешь что туда попадает и иметь плагины изолированными от всего, кроме JRE, системного classpath.
·>Но скорее всего плагинам надо между собой как-то взаимодействовать (вопрос к топикстартеру) и тут придётся серьёзно продумать архитектуру... и, скорее всего получится кошмар в духе OSGi. Более разумным решением, имхо, будет явное взаимодействие через какие-нибудь сообщения protobuf или подобное.
Может быть и protobuf, может, и просто что-то из IPC, но это вопрос к ТС. И это значит все же несколько процессов. Мы же не знаем, зачем эти jar подгружать вообще, что они делать должны. Более того, и плагинами их можно называть с натяжкой. Зачем их нужно загружать, почему именно по требованию и что они будут делать — этого мы не знаем. Может, вообще есть более простое решение.
PD>> Впрочем, это к JNI не имеет отношения, к плагинам на C/C++ и к runtime-загрузке jar тоже. Это обычная проблема на java. Если бы он просто добавил все свои jar в java — проект без всякого C/C++, было бы то же самое.
·>Угу. Хотя это не проблема конкретно java, а общая проблема сборки гигантских монолитных приложений из множества разрозненных компонент. А тут ещё и кросс-языковое приложение java/c++.
Ну кроссплатформенное он постольку-поскольку. В той модели, что предложил ТС, java и C++ части достаточно хорошо отделены. Но вообще да. Не знаю, почему в java столь усложнили динамическую загрузку кода. В C++ (точнее, в Win API) загрузка и выгрузка DLL в рантайме совершенно штатный и банальный процесс, на то они и DLL. И грузить их можно из любого места на диске, без всяких classpath и лоадеров. Но если EXE использует одну версию C++ RTL, а DLL другую, то мало никому не покажется, если, например, выделять память в DLL и освобождать ее в EXE.