Один и тот же файл класса в нескольких файлах .jar. Насколько это плохо? - PullRequest
4 голосов
/ 24 апреля 2010

У меня есть библиотека, которая записывает данные в текстовом или двоичном формате. Он состоит из следующих трех компонентов:

  1. общие структуры данных
  2. Автор текста (зависит от 1)
  3. двоичный писатель (зависит от 1)

Очевидный способ распространения - 3 файла .jar, чтобы пользователи могли включать только то, что им нужно.

Однако компонент "общие структуры данных" - это всего лишь два небольших класса, поэтому я рассматриваю возможность создания только двух файлов .jar и включения общих файлов .class в оба.

Мой вопрос: каковы потенциальные проблемы с этим?

Ответы [ 4 ]

4 голосов
/ 24 апреля 2010

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

Ошибки загрузки классов, скорее всего, укусят вас в контейнере сервера приложений / EJB или аналогичной установке, где есть несколько компонентов / приложений, загруженных иерархией загрузчиков классов. Однако , если один и тот же класс загружен двумя разными загрузчиками классов, JVM считает их совершенно разными классами! , что может привести к различным ошибкам времени выполнения, таким как LinkageError (например, если две разные версии одного и того же столкновение определений классов - как описано в других ответах), ClassCastException (если выполняется попытка приведения между двумя определениями классов, загруженными разными загрузчиками классов) и т. д. Поверьте, ад загрузки классов - это место, которое вы не хотите видеть.

Я бы положил всю библиотеку в одну банку, чтобы минимизировать этот риск.

1 голос
/ 24 апреля 2010

Если вы выпускаете новую версию вашей библиотеки, пользователь, который использует обе библиотеки (одну старую новую), может получить исключения времени выполнения, когда новая библиотека получает класс из 1 из старой библиотеки (или наоборот, если это не обратно совместимо). Проще всего было бы выпустить все в одну банку, чтобы не было проблемы с этой версией.

0 голосов
/ 24 апреля 2010

Я рекомендую использовать JarJar , которая является библиотекой для упаковки нескольких файлов JAR в один файл JAR.

Существует задача Ant для интеграции в вашу сборку, и поэтому ваша среда сборки может просто сохранять необработанные файлы jar, и вы можете просто выполнить простое развертывание (но не забудьте включить файлы license.txt из различных библиотек в ваш дистрибутив) .

0 голосов
/ 24 апреля 2010

Потенциальные проблемы состоят в том, что в будущих версиях структуры данных между этими двумя jar-файлами могут возникнуть несоответствия (скажем, из-за исправления ошибок или незначительного выпуска). В этом случае вы можете получить ClassDefNotFoundException, если вам нужно включить оба jar-файла в приложение. Я бы порекомендовал либо разделить его на три файла jar, либо просто на один больший.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...