У меня есть библиотека, которую я использую в приложении Java - это важно для определенных функций, но это необязательно. Это означает, что если JAR-файл не существует, программа продолжает работать без проблем. Я хотел бы открыть исходную версию своей программы, но я не могу включить эту библиотеку, которая необходима для компиляции исходного кода, поскольку у меня есть множество операторов импорта для использования API. Я не хочу поддерживать два набора кода. Каков наилучший способ удалить физический файл jar из версии с открытым исходным кодом, но сохранить код для поддержки, где другие люди все еще могут его скомпилировать?Java - сделать библиотеку и импортировать необязательно
ответ
Типичный подход заключается в определении API-интерфейса обертки (т.е. интерфейсов) и включает в себя эти интерфейсы в открытом исходном коде, а затем предоставляет параметры конфигурации, где можно указать имена классов классов, реализующих определенные интерфейсы.
Вы импортируете интерфейсы API вместо импорта классов непосредственно в свой открытый исходный код. Таким образом, вы открываете поиск API, но не реализуете части, которые вы не хотите открывать, или вы не можете открыть источник.
Существует много примеров, но ознакомьтесь с API-интерфейсами JDBC (интерфейсы) и JDBC (классы реализации) для стартеров.
Я довольно много печатал то же самое, что и маленький мир с одним дополнением. Если этот API был необходим, вы можете использовать инструмент построения проекта, например Maven, для обработки зависимостей от вашего проекта. Если кто-то проверяет это из исходного управления с помощью pom, они могут загружать зависимости для себя, и вам не нужно включать их в исходное репо.
Там, наверное, несколько способов исправить это, вот пара я могу думать:
Если у вас есть только несколько методов, которые необходимо вызвать в библиотеке 3 партии, вы могли бы использовать чтобы вызвать эти методы. Он создает действительно многословный код, который трудно прочитать.
Если вы не используете слишком много API в сторонней библиотеке, вы также можете создать отдельный JAR-файл, содержащий только функциональную оболочку классов в библиотеке (только типы с те же имена и методы с теми же сигнатурами). Затем вы можете использовать этот JAR для распространения и компиляции. Во время выполнения вы замените его реальным JAR, если он доступен.
Наиболее распространенным способом является создание API-интерфейса обертки в отдельном модуле/проекте для кода, который зависит от библиотеки сторонних разработчиков, и, возможно, распространения предварительно построенного JAR. Это может противоречить вашему желанию не поддерживать два набора кода, но может оказаться лучшим и менее болезненным решением в долгосрочной перспективе.
Я нашел этот пример полезным при реализации интерфейса. http://www.janeve.me/articles/dynamic-loading-using-java-reflection-and-properties – JeffG