Maven вражає мене як випадок чогось, написаного цілою групою дітей-сценаріїв сценарію c-shell, які продали на дату минулого, які вважають, що autoconf є передовою автоматизацією коду, і не розуміють, що об’єктний код вимагає наявності об’єктного середовища. будь-яким чином ефективний як для розробки, так і для розгортання. Мураха був досить поганим, але Мейвен поєднує в собі всі найгірші риси Мурахи та Плюща. Він не створює об’єктне середовище і погано грає з інструментами, які це роблять.
Просто об’єктне середовище повинно мати усі об’єкти класу, тобто об’єкти, що визначають типи об’єктів, доступні системі, діючі та доступні постійно. Звідти я можу робити все, що завгодно, створювати екземпляри декількох об'єктів класу, встановлювати різні послідовності та правила створення екземплярів тощо. Оскільки середовище має бути повністю активним, мені не потрібноінструмент побудови взагалі. Що стосується розгортання мого додатка, для середовища не складно просто викинути всі об'єкти класу, на які ніколи не посилається код у просторах імен, з яких складається моя програма. Сьогодні збирач сміття в JVM робить майже те саме на льоту. На той момент у мене є середовище розгортання, яке складається з моїх об'єктів та всіх об'єктів (насамперед об'єктів класу), на які посилаються мої об'єкти, тобто моє додаток та всі залежності. Так працюють віртуальні машини. (що наші віртуальні машини так погано написані, що нам потрібно запустити Spring VM на Java VM на Linux VM на VMWare VM на іншій Linux VM - ще один приклад ідіотизму розробки програмного забезпечення). Коли залежності оновлюються, середовищу досить просто запропонувати розробнику об’єднати свій старий код з новими бібліотеками, злийте код, використовуючи нові бібліотеки, до попередньої версії або збережіть обидві версії. Підказка заохочує розробника внести невеликі модифікації, які іноді необхідні, щоб уникнути наявності двадцяти версій кожної бібліотеки, тоді як такі інструменти, як Maven, приховують той факт, що у вас є двадцять версій, і це призводить до масового роздуття, поширеного в додатках Java.
У просторі розробки Java Eclipse найближче наближається до належного об'єктного середовища, хоча надається безліч плагінів, які різними способами порушують парадигму. Більшість причин, наведених для використання Maven, розпадаються при критичному дослідженні.
Netbeans та Idea - це надмірні текстові редактори, а не об'єктні середовища, але якщо ви хочете використовувати їх інструменти для чогось, що не охоплюється тисячами плагінів Eclipse, обидва можуть імпортувати та підтримувати проекти Eclipse, ваша збірка буде просто надто повільною в порівнянні з розробниками за допомогою Eclipse, але тоді вони були б такими повільними, якби вони були чистими проектами Netbeans чи Idea.
Не серйозна причина використовувати Maven.
Легкість експорту / імпорту налаштувань у Eclipse (що в будь-якому випадку повинна робити кожна команда в будь-якій IDE) робить різні налаштування проблемою не більше, ніж лінь з боку команди розробників (або релігійні суперечки щодо пробілів проти табуляції, ха-ха) .
Знову ж таки, не серйозна причина використовувати Maven.
Командне середовище? Покажіть мені команду, яка ще не використовує сховище, таке як GIT або SVN. Чому нам потрібно дублювати як функціональні можливості, так і головний біль технічного обслуговування, також налаштувавши репозиторії Nexus?
Це насправді є вагомою причиною НЕ використовувати Maven.
Запуск збірки сервера? Чудова ідея, чи не слід це розпочинати кодом, який насправді реєструється у вихідному репо, а не випадковою збіркою, яка випадково потрапляє до Nexus? Це піднімає очко проти Git, особливо Git з Maven. Оскільки в Git я не працюю над гілкою, тестую локально, потім виконую коміт (частково тому, що мій локальний тест не доводить, що збірка сервера працює через різницю в конфігурації Maven в Jenkins та Eclipse), я повинен внести свої зміни до іншу гілку, щоб побачити, що сервер Maven не працює, потім виконайте подальші зміни, щоб усунути проблему, що призведе до нечитабельної історії джерел у репо. Перевірений код повинен як мінімум будувати та проходити модульні тести, які, якщо Git та Maven не потрапляють у картину, повинні бути гарантовані.
Експорт безголової збірки з Eclipse тривіальний, якщо ви насправді заглянете в неї - все, що вам потрібно - це ant або Gradle, збірка розробника, яка вже підтримується Eclipse, і кілька банок Eclipse (Eclipse експортує всі необхідні файли для безголової збірки до каталог або ZIP-файл, або ftp їх на сервер збірки). Інструменти побудови серверів, такі як Хадсон / Дженкінс, можуть витягувати оновлений код з більшості вихідних репозиторіїв і викликати будь-який сценарій збірки, немає залежності від Maven. За допомогою Maven ви або змушуєте розробників використовувати інструмент, який не підходить нікому, крім інженерів збірки (для створення випадку достатньо великих розмірів, навіть якщо використовується M2E), або ви живете з можливістю побудови сервера працює не так, як побудова робочої станції, яка досівірно, якщо ви пройдете всі клопоти з інтеграцією цих двох, використовуючи безліч плагінів M2E. У будь-якому випадку ви отримуєте повільнішу та крихкішу побудову робочої станції заради настільки ж повільної та більш крихкої побудови сервера. У кожному проекті, заснованому на Maven, над яким я працював, я бачив тимчасові помилки Гудзона / Дженкінса, які не відображаються в Eclipse, якщо у вас не встановлено та не налаштовано абсолютно всі можливі плагіни M2E, і більшість розробників цього ніколи не роблять.
Здається, ще одна чудова причина уникати Мейвена.
Це не охоплює деяких найбільш фундаментальних проблем Maven, таких як простори імен, що порушують простори імен Java та простори імен XML, це модуль побудови (POM), який не має відношення ні до чого у фактичному середовищі розгортання (подумайте про це, коли ви розділите через POM, що ви насправді досягаєте в готовому продукті? Нічого. Все, що воно робить, - це хибне відчуття того, що ви розділили проблеми та функціональність на різні одиниці побудови, які всі працюютьяк один монолітний фрагмент коду); клопоту з ручним веденням складних конфігураційних файлів, що погіршується лише в тому випадку, якщо вам довелося використовувати OSGi або інший контейнер і вам доводиться підтримувати інші конфігураційні файли, які впливають на конфігурацію Maven і на які впливають, з дуже мало очевидним сенсом для цього; проблеми, викликані спробою запустити модульні тести без повного середовища для виконання коду; незліченна кількість версій не лише залежностей, але й конкретних плагінів Maven (насправді я бачив пекло JAR у самій побудові Maven , де кілька плагінів Maven використовували суперечливі залежності - одна із проблем, яку мав вирішити Maven .
Так, ви можете створити об'єктний код за допомогою Maven. Ви також можете написати чистий об'єктний код на мові C або навіть на асемблері, але я не знаю, чому ви цього хочете.
Найкраща причина уникати Maven - це феноменальний обсяг роботи, необхідний для демавінізації набору проектів, коли ви захворіли на всі зазначені вище проблеми (та численні інші, про які не згадували).
Мислення, успадковане від розробки С, що цикл розробки складається із запису коду, компіляції, збірки, побудови, розгортання, тестування, повторення заново, безнадійно застарів в об'єктному середовищі. У якийсь момент нам потрібно сказати всім людям із таким мисленням, що вони повинні навчитися розвиватися, крапка. Це всуне будь-яку потребу в Maven, Git та безлічі інших інструментів, які не роблять нічого, крім як марно витрачати час.
Розробка об'єкта повинна здійснюватися в середовищі реального об'єкта, де тестується зміна коду в міру збереження, оскільки модифікований об'єкт працює. Розгортання повинно складатися з видалення з цього середовища лише артефактів розробки, створення середовища виконання, яке містить усе, що використовує запущена програма у розробці та тестуванні.
Зараз я маю справу з проблемою, спричиненою створенням збірок розгортання для програми OSGi за допомогою плагіна maven-Assembly. Додаток чудово працює в середовищі Eclipse, яке гаряче розгортає всі зміни коду в запущений контейнер OSGi всередині середовища. Однак конфігурація не виживає цілою в процесі складання maven, незважаючи на наявність дуже хорошого інженера конфігурації / збірки, єдиною роботою якого є виконання цього процесу. Якби ми позбулися Maven (дуже складно зараз через кількість коду, але можливо) і використали плагін BNDTOOLS Eclipse, ми могли б просто експортувати збірку Eclipse як Ant або Gradle безголову збірку (зверніть увагу, розробники OSGi, які пишуть BND та BNDTOOLS цього не роблятьпідтримує Maven, і з поважної причини плагін Maven написаний розробниками Felix, які самі використовують Netbeans і Maven, і жодне інше середовище, крім кінця циклу розгортання), де обидва інструменти налаштовують те саме середовище, що і Eclipse, без об’єктів графічного інтерфейсу, які в будь-якому випадку призначені лише для розробників. Результатом буде однакова конфігурація та збірка для розгортання. Це дозволило б заощадити 2-3 години на день для розробника, який зараз витрачається на перегляд повільних збірок Maven або M2E, і звільнити інженера конфігурації / збірки, щоб зробити більше тестування програми на хостах розгортання.
Подолання мислення write / compile / assemble / build / deploy / test є єдиною головною перешкодою. Прикидання, що ви кодуєте на терміналі VT100 1979 року замість сучасної машини, не робить вас «справжнім» розробником, це лише демонструє, що ваші методи застаріли на 35 років.
З розробників в команді ніхто з інших не розуміє належним чином середовище реального об'єкта, як Eclipse, настільки, щоб змусити його працювати як живе середовище з M2E та OSGi, і вони є найкращими розробниками, вони просто не зазнавали цього через до поширеності застарілих засобів розробки командного рядка. Вони зрозуміли, що це можливо зробити, коли ми поєднували програмування для вирішення проблеми конфігурації, і я ділився своїм екраном, змушуючи одного з інших членів команди вигукнути " це як ти пишеш код так чортово швидко ", коли він побачив, як мій код миттєво тестується у фоновому контейнері OSGi. Я можу використовувати оболонку bash, коли мені потрібно, наприклад, коли я переглядаю журнали на віддаленому сервері, в Насправді я роблю це досить ефективно точно, щоб я міг якнайшвидше вийти з цього середовища і повернутися в 21 століття.