Чи потрібно переходити на модулі при переході на Java 9 + / Java 11?


80

В даний час ми переходимо з Java 8 на Java 11. Однак оновлення наших служб було менш болючим, ніж ми очікували. В основному нам довелося лише змінити номер версії у нашому build.gradleфайлі, і служби були щасливо запущені. Ми оновили бібліотеки, а також (мікро) служби, які використовують ці бібліотеки. Дотепер проблем немає.

Чи є потреба насправді переходити на модулі? Це призведе до непотрібних витрат IMHO. Будь-яка пропозиція чи подальший матеріал для читання буде вдячний.

Для уточнення: чи є наслідки, якщо код Java 9+ використовується без введення модулів? Чи може він, наприклад, стати несумісним з іншим кодом?


10
Це той самий ризик, з яким ви вже стикалися в Java 8: опинившись у "Пеклах".

4
Sotms / # резюме буде відповідати в такій мірі. Ви можете перевірити, чи відповідають цілі вашого проекту Jigsaw проекту . Окрім цього, на мій погляд, справа в тому, щоб бути в курсі, а також те, що стосується бібліотек / служб, що надають підтримку своїм споживачам.
Naman

4
@Taschi Я не думаю, що пекло classpath саме по собі виправдовує модульний спосіб, оскільки у всіх кодів до Java 9 була така проблема, і в більшості випадків ми з цим чудово працювали (особисто ніколи з цим не було проблем).
Younes EO

1
@Naman, висвітлюючи цілі головоломки проекту, є справді дуже вагомим аргументом.
Younes EO

8
@Younes El Ouarti, видалення "Пекла класів" - одна з двох заявлених цілей Jigsaw Project. Якщо ви вважаєте, що це недостатня причина для спілкування з Jigsaw, ну ... я згоден з вами і уникаю Jigsaw, коли тільки можу.

Відповіді:


132

Ні.

Немає необхідності переходити на модулі.

Ніколи не було необхідності переходити на модулі.

Випуски Java 9 та пізніші версії підтримують традиційні файли JAR на шляху традиційного класу за допомогою концепції безіменного модуля, і, ймовірно, робитимуть це до теплової смерті Всесвіту.

Чи починати використовувати модулі, залежить лише від вас.

Якщо ви підтримуєте великий застарілий проект, який не сильно змінюється, то, мабуть, це не вартує зусиль.

Якщо ви працюєте над великим проектом, який протягом багатьох років важко підтримувати, то чіткість та дисциплінованість, які приносить модуляризація, можуть бути корисними, але це також може бути багато роботи, тому добре подумайте, перш ніж розпочати.

Якщо ви починаєте новий проект, то настійно рекомендую починати з модулів, якщо можете. На сьогоднішній день багато популярних бібліотек оновлено до модулів , тому є велика ймовірність того, що всі потрібні вам залежності вже доступні в модульній формі.

Якщо ви підтримуєте бібліотеку, то настійно рекомендую оновити її як модуль, якщо ви цього ще не зробили, і якщо всі залежності вашої бібліотеки перетворені.

Все це не означає, що ви не зіткнетеся з кількома каменями спотикання, рухаючись повз Java 8. Однак ті, з якими ви стикаєтесь, швидше за все, не матимуть нічого спільного з модулями як такими . Найпоширеніші проблеми міграції, про які ми чули з часу випуску Java 9 у 2017 році, пов’язані із змінами синтаксису рядка версії та видаленням або інкапсуляцією внутрішніх API ( наприклад , sun.misc.Base64Decoder), для яких є загальнодоступні підтримувані заміни. була доступна роками.


26

Я можу сказати вам лише свою думку організації з цього приводу. Ми знаходимося в процесі переходу до модулів, для кожного окремого проекту, ми працюємо. Те, що ми будуємо, - це в основному мікросервіси + деякі бібліотеки клієнтів. Для мікросервісів перехід на modulesдещо нижчий пріоритет: код там уже якимось чином ізольований у контейнері докера, тому "додавання" модулів туди не здається (нам) дуже важливим. Ця робота починається повільно, але вона є пріоритетною.

З іншого боку, клієнтські бібліотеки - це зовсім інша історія. Я не можу сказати вам, який у нас інколи безлад. Поясню один момент, який я раніше ненавидів jigsaw. Ви надаєте клієнтам інтерфейс для всіх. Автоматично interfaceце public- піддається світові. Зазвичай те, що я роблю, - це мати деякі package-privateкласи, які не піддаються дії клієнтів, які використовують цей інтерфейс. Я не хочу, щоб клієнти цим користувались, це внутрішнє. Звучить добре? Неправильно.

Перша проблема полягає в тому, що коли ці package-privateкласи зростають, і ви хочете більше класів, єдиний спосіб тримати все прихованим - це створювати класи в одному пакеті:

  package abc:
        -- /* non-public */ Usage.java
        -- /* non-public */ HelperUsage.java
        -- /* non-public */ FactoryUsage.java
        ....

Коли він росте (у наших випадках він зростає), ці пакети занадто великі. Перехід до окремого пакета, про який ви говорите? Звичайно, але тоді це HelperUsageі FactoryUsageбуде, publicі ми намагалися уникати цього з самого початку.

Проблема номер два: будь-який користувач / абонент наших клієнтів може створити одне і те ж ім’я пакета та розширити ці приховані класи. Це вже кілька разів траплялося з нами, веселі часи.

modulesвирішує цю проблему красиво: насправдіpublic це вже не так public ; Я можу отримати friendдоступ через exports toдирективу. Це значно полегшує життєвий цикл коду та управління ним. І ми втікаємо від пекла із навчальних стежок. Звичайно, впорайтеся maven/gradleз цим, головним чином, але коли є проблема, біль буде дуже реальною. Також може бути багато інших прикладів.

Тим не менш, перехід (все ще) непростий. Перш за все, усі в команді повинні бути вирівняні; по-друге, є перешкоди. Найбільші два, які я все ще бачу: це як ви розділяєте кожен модуль на основі чого? У мене поки немає однозначної відповіді. Другий - split-packagesо, прекрасний "той самий клас експортується за допомогою різних модулів". Якщо це трапляється з вашими бібліотеками, є способи пом'якшення; але якщо це зовнішні бібліотеки ... не що легко.

Якщо ви залежате від jarAі jarB(окремих модулів), але вони обидва експортують abc.def.Util, вас чекає сюрприз. Однак є способи вирішити це. Якось болісно, ​​але розв’язано.

Загалом, з того часу, як ми перейшли на модулі (і досі це робимо), наш код став набагато чистішим. І якщо ваша компанія є компанією, яка першою розробляє код, це має значення. З іншого боку, я брав участь у компаніях, якщо старші архітектори вважали це «занадто дорогим», «ніякої реальної вигоди».


4
Дякуємо за підбурювання! Отже, що я отримую, це те, що модуляризація поставляється з необхідними обмеженнями доступу, яких ми втрачали в попередніх версіях. Я точно можу зрозуміти, наскільки це корисно для бібліотек. У випадку, якщо послуга повідомляється через REST / AMQP / тощо. це знову не така проблема, а точніше, немає ніяких переваг? Може, ми не можемо довільно стверджувати, що весь код Java 9+ повинен бути модульним? Тож ми повинні розглядати це як сам «інструмент»? Тим не менше.
Younes EO

Що вам може бути корисним, це шаблон "доступу" API (але зауважте, що замість загальнодоступного статичного поля переважно приватне із методами, щоб уникнути тупикових ситуацій під час завантаження класу). Дивіться тут: wiki.netbeans.org/…
Томаш Мишик,

Дякуємо, що поділилися своїм досвідом! Було б добре, якщо б ви поділилися більше деталей або посиланнями на згадані вами проблеми, які є болючими, але все ще вирішуваними.
botismarius

3
"Проблема номер два: будь-який користувач / абонент наших клієнтів може створити одне і те ж ім'я пакета та розширити ці приховані класи." Задовго до Java 9, пакети могли бути запечатані, щоб запобігти цьому. (Мені здається, модулі - це відмінна ідея, і я використовую їх у всіх своїх проектах. Я просто хотів зазначити, що для цього конкретного випадку використання вони не потрібні.)
VGR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.