osgi NoClassDefFoundError - Каталог фляг - PullRequest
0 голосов
/ 03 июля 2019

У меня есть каталог с тоннами jar-файлов. Чтобы быть более конкретным: Apache Spark. Теперь я хочу написать программу на Java / osgi с использованием библиотеки Spark. Каков наилучший способ сделать это?

Одним из способов было бы объединить все 200 МБ в пакет osgi. Результатом был бы огромный плагин с теми же самыми файлами jar, которые все равно находятся на сервере и в худшем случае несовместимы с версией сервера Spark.

Другой вариант - добавить все 200 МБ jar-файлов в папку lib проекта и рассматривать их как встроенные библиотеки. Те же проблемы, что и выше.

Единственный другой вариант - взломать загрузчик классов во время выполнения, добавив каталог jar Spark в путь к классам. Это тоже нехорошо.

Но, честно говоря, этот вариант использования выходит за рамки того, что должен делать osgi, по моему мнению. osgi используется для управления зависимостями, включая версии, и я прошу использовать версию, которая уже установлена. Противоречие, не правда ли?

У вас есть предложение? Что-то я пропустил?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

OSGi - это разработка программного обеспечения. О проверке того, что ваши зависимости времени компиляции соответствуют совместимым зависимостям времени выполнения. Когда вы следуете (простым) правилам, вы получаете гораздо более надежную систему, чем без OSGi, потому что ничего не «предполагается», как во многих проектах, не связанных с OSGi.

К сожалению, это означает, что вам нужно правильно понимать метаданные. Хотя сейчас огромное количество кода содержит метаданные OSGi, у людей есть естественная тенденция делать короткие пути. В этот момент у вас есть худшее из обоих миров. Вы не получаете много преимуществ, но вы все равно платите. OSGi, по сути, является технологией «полностью», выбор некоторых компонентов дает мало преимуществ.

Если бы я столкнулся с вашей проблемой, я бы проанализировал, что нужно моему коду от Spark, и посмотрел, смогу ли я превратить это в ряд чистых, связных и несвязанных сервисных API. Я бы написал свой код против этих API. Во время выполнения OSGi я бы использовал свои собственные зависимости. Мои реализации сервиса Spark, которые я регистрировал бы вне каркаса, чтобы пространство классов Spark и пространства классов OSGi были отдельными. Тем не менее, это не тривиально, так как многие API имеют тенденцию к утечке деталей реализации и зависимостей реализации.

Попытка портировать проект с открытым исходным кодом, который не был разработан для OSGi с зависимостями 200 Мб, является моей основной задачей. Это очень похоже на попытку повысить безопасность программы, которая не была разработана с нуля, чтобы принять во внимание безопасность.

0 голосов
/ 03 июля 2019

Я довольно давно пытался вызвать спарк из OSGi и отказался от него. Spark - беспорядок в отношении зависимостей, и даже когда вы сортируете зависимости, все равно остается вопрос, выполняет ли Spark или одну из его зависимостей приемы загрузки классов. Поэтому я не думаю, что стоит попытаться запустить искру в OSGi.

Возможно, вы сможете создать микросервис, который предлагает API, адаптированный к вашим потребностям, в дополнение к сервису отдыха. Таким образом, искра работает вне процесса OSGi.

...