У статті я розповім, як підключити бібліотеку, якою в maven за замовчуванням немає, і як підключити іншу бібліотеку, вихідні коди якої давним-давно втрачені.
Також я опишу, як зробити maven проект, який генерує артефакт, за сумісництвом є бібліотекою, і як підключити цю бібліотеку до іншого свого ж maven проекту.
У моїй попередній статті було сказано, що maven сам завантажить всі зазначені в pom.xml залежності. А ось що буде, якщо він якусь залежність не знайде? В такому випадку maven скаже, що залежність не виявлена і перерве процес збірки з помилкою. Що робити в цьому випадку?
Це питання, насправді, розпадається на кілька запитань, кожен з яких треба вирішувати індивідуально. Вибір рішення же визначається тим, де ця залежність є.
Залежність може бути в інтернеті в якомусь місці, про існування якого maven не знає. Ще вона може бути у вигляді jar файлу у вас на руках і, нарешті, у вигляді вихідного коду, оформленого як maven проект.
Про цих трьох випадках ми і поговоримо.
Але спочатку треба коротко прояснити одне питання.
Звідки maven качає бібліотеки
Як бути, якщо бібліотеки немає в віддаленому сховище за замовчуванням, але вона є в іншому віддаленому сховище
Перша і, можливо, найчастіша проблема виникає, якщо бібліотеки в цьому умолчальне репозиторії немає або в разі, якщо цей репозиторій з машини, на якій здійснюється складання, недоступний, наприклад, з міркувань безпеки.
Як вказати maven проекту, де шукати додатковий репозиторій
Далі ми підключили репозиторій проекту Spring, в якому можна знайти останні версії цього сімейства бібіліотека. Ось як це виглядає всередині pom.xml
Тепер maven, коли не знайдеться залежності в репозиторії за замовчуванням, або виявить, що покоління недоступний - НЕ запанікує, а пошукає бібліотеку в ще одному репозиторії і, якщо все йде за планом, знайде її там.
Але буває так, що бібліотеки в репозиторіях немає. Наприклад, якщо це драйвера для MSSQL, або якщо це пропріетарна бібліотека, яку ви нещодавно придбали за великі гроші.
Як підключити бібліотеку, якою в репозиторіях немає
Підключити таку бібліотеку можна декількома способами. Наприклад, якщо у вас є свій репозиторій в локальній мережі, то можна (а іноді навіть потрібно), покласти бібліотеку туди, і тим самим звести задачу до попередньої.
Але, якщо це можливо, таку бібліотеку краще покласти в проект і зберігати прямо в системі контролю версій. Тоді бібліотека буде доступна програмі завжди і на будь-якій машині, а крок за копіювання цієї бібліотеки в репозиторій можна не включати в мануал.
Для обробки таких кейсів у maven теж є штатний механізм. Тільки що ми з'ясували, як вказати maven віддалений репозиторій, відмінний від умолчальне. Так ось, не обов'язково використовувати віддалене сховище. Можна зробити репозиторій в локальній файловій системі, покласти туди бібліотеку і проінструктувати maven шукати залежності ще й там.
Як створити свій локальний репозиторій
Для цього, як сказано вище, у maven є штатний засіб.
Припустимо у нас є бібліотека, яка знаходиться в jar файлі під назвою hello-world-library-1.0-SNAPSHOT.jar. Про бібліотеку нам відомо, що в ній є один клас HelloWorld, який включає один статичний метод say, що друкує в консолі, як нескладно здогадатися, Hello World.
Ми хочемо в директорії проекту створити директорію lib, в якій буде знаходитися наш додатковий репозиторій, і помістити туди бібліотеку. Для цього достатньо в директорії проекту виконати наступну команду.
Якщо ви використовуєте операційну систему Windows, потрібно замінити на ^, тобто написати
Або можна просто прибрати і написати команду в один рядок.
Зверніть увагу, як і для будь-якого іншого артефакту, для бібліотеки нам потрібно придумати groupId, artifactId і version. Ми потім вкажемо їх в pom.xml, коли будемо підключати залежність.
Всередині директорії, яку створить команда, знаходиться повноцінний репозиторій, для використання якого досить вказати maven, де він знаходиться. Всі відомості про те, які бібліотеки можна там знайти, містяться безпосередньо в структурі директорій новоствореного сховища. Для подальшого використання сховища, наприклад, на інших машинах, команду deploy-file виконувати не треба.
Дати проекту знати, що репозиторій існує, і показати, де він знаходиться, можна вже описаним способом, правда, з поправкою на те, що репозиторій локальний.
Зверніть увагу на п'ятий рядок
Тут сказано, що шукати репозиторій треба в директорії проекту, на яку вказує вбудована змінна maven project.basedir.
Клас, який використовує бібліотеку, буде гранично простий, але для порядку наведемо його код.
Залишилося додати в pom.xml залежність і можна збирати проект.
Директорію lib треба закомітіть і бібліотека буде доступна проекту взагалі завжди.
Однак слід пам'ятати про одне правило.
Потрібно обов'язково оновлювати номер версії бібліотеки в локальному репозиторії при кожній зміні jar файлу
Maven сприймає репозиторії як зовнішні, тому, якщо не змінити номер версії, то maven буде використовувати не версію бібліотеки з директорії lib, а ту, що він закеширувалася на локальній машині. В даному конкретному випадку це не повинно зіграти ролі через суфікса SNAPSHOT, але про це потрібно знати.
Є ще один поширений сценарій. У вас є своя бібліотека, яку ви самі збираєте за допомогою maven і потім підключаєте до іншого maven проекту.
Як зробити свою java бібліотеку
Для того, щоб зробити бібліотеку, достатньо написати клас з модифікатором public. І потім можна буде використовувати цей клас в коді, до якого підключена бібліотека.
Ось такий, наприклад, клас.
Тепер потрібно зробити maven проект, який буде збирати бібліотеку, яка містить цей клас.
Як ми пам'ятаємо, з точки зору maven, бібліотека - це просто артефакт, тому помнік буде виглядати тривіально.
Отже, у нас є клас зі статичним методом, у нас є опис артефакту для maven. Залишилося тільки зібрати цей код, щоб вийшла бібліотека, тобто jar файл.
Просто напишемо в консолі:
Після цього в директорії target з'явиться файл з назвою
Як підключити новоствореного бібліотеку до свого maven проекту
Для того, щоб бібліотеку потім можна було підключати до іншого проекту, потрібно замість package написати install.
Це потрібно буде робити після кожної зміни в коді бібліотеки, і на кожному комп'ютері, на якому ми захочемо цю бібліотеку використовувати.
Тепер можна зробити новий проект, який буде використовувати бібліотеку.
Усередині проекту буде один клас, який використовує статичний метод з бібліотеки, щоб сказати Hello world. Ми цей клас вже бачили.
Перевіримо ще раз:
Працює не гірше за попередній варіант!
Що якщо ваша бібліотека використовує іншу бібліотеку?
Питання, здавалося б, дурний, але про всяк випадок проведемо експеримент.
Зробимо бібліотеку з непорожніми залежностями.
і напишемо для неї код
Тепер зберемо її
Перейдемо в директорію з нашим проектом, який цю бібліотеку використовує і спробуємо його зібрати і запустити.
Як це працює
Строго кажучи знати, як процес влаштований всередині, не обов'язково, але все одно дуже корисно.
Команда mvn install збере бібліотеку, а потім покладе її в локальний репозиторій за замовчуванням. Тобто в той же самий місце, де лежать усі бібліотеки, які ви коли-небудь підключали до maven проектам, за винятком, зрозуміло, тих, які знаходяться в локальних репозиторіях, зроблених особисто вами.
Потім, при складанні проекту, що використовує цю бібліотеку, maven пошукає її в локальному сховищі, знайде і підключить.
- Maven шукає бібліотеки в віддаленому репозиторії за замовчуванням.
- Щоб підключити бібліотеку, якій немає в репозиторії за замовчуванням, можна вказати додаткові вилучені репозиторії, тоді maven буде шукати бібліотеки ще й в них.
- Якщо бібліотеки немає ні в одному віддаленому репозиторії, то можна за допомогою штатного механізму maven створити локальний репозиторій і додати його в pom.xml.
- При оновленні сховища, який знаходиться в исходниках проекту, потрібно завжди міняти версію бібліотеки, інакше можуть бути незрозумілі проблеми.
- Якщо у вас є maven проект, то з нього можна зробити бібліотеку командою mvn package.
- Командою mvn install можна помістити бібліотеку в локальний репозиторій за замовчуванням.
- Щоб використовувати бібліотеку в іншому проекті, досить вказати її в якості залежно в pom.xml.