Швидка розробка веб-додатків на java

Швидка розробка веб-додатків на Java

Як ви розробляєте веб-додаток на Java?

Швидка розробка веб-додатків на java

Після кожної зміни, як ви його запускаєте і перевіряєте? Скільки часу займає редеплой додатки і рестарт контейнера?

Мені довелося бачити різні варіанти: від повної пересборки WAR-файлу до використання плагінів для IDE типу MyEclipse, WTP і «конекторів» для сервлет-контерйнеров. У деяких з них є явні недоліки, інші цілком працюють - але є спосіб простіше!

Запускалка


Цей спосіб розробки дозволяє максимально просто і гнучко налаштувати додаток з мінімальним часом редеплоя. Вам треба всього лише написати один простенький Java-клас з main-методом, який запустить сервер Jetty відразу з потрібними додатками (т.зв. Embedded Mode).

Ось як виглядає запускалка в мінімальній комплектації:

Цей код запускає сервер (сервлет-контейнер), слухає порт 8080, з трьома веб-додатками, код для яких береться прямо з папок проекту (root / src / main / webapp. Reports / src / main / webapp і petclinic / src / main / webapp), тобто будь-які зміни в файлах вступають в силу відразу. без необхідності щось збирати заново і передеплоіть.

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

Ось і вся хитрість.
Напевно в ПРОДАКШИН ви використовуєте НЕ Jetty, а що-небудь типу Tomcat, JBoss або WebLogic. Неважливо, ми адже зараз говоримо про розробку, де швидкість, стабільність і т.д. неважливі, а важлива легкість настройки, швидкість запуску і редеплоя. І тут Embedded Jetty - то, що доктор прописав.

Ви можете просто запускати цей main-клас зі своєї улюбленої IDE, налагоджувати, тестувати, рестартовать; і не потрібні ніякі плагіни, не потрібно шукати файли конфігурації, які не потрібно копатися в XML'ах. Всі настройки під рукою. Оце житття!

Для запускали в мінімальній комплектації достатньо всього трьох jar-файлів: servlet-api.jar, jetty.jar, jetty-util.jar.

[UPD] Як підказує kblcuk. наведений код запускалкі працює тільки для версії Jetty 6. Починаючи з сьомої версії Jetty, назви пакетів і класів були поміняні з org.mortbay.jetty. * на org.eclipse.jetty. *, так що доведеться підправити import.

Розглянемо деякі додаткові можливості, які можуть стати в нагоді в залежності від проекту.

Завантажники класів

Наведений вище код завантажує класи і залежності всіх веб-додатків в одному засобі завантаження (ClassLoader). Якщо з якоїсь причини вам важливо, щоб у веб-додатків були різні набори класів і залежностей (jar'ов), це теж можна зробити, дописавши трошки коду:

Я сам активно це використовував, коли мені треба було запускати відразу багато веб-додатків, кожне зі своїми (конфліктуючими) залежностями. Дуже просто, дуже зручно.

Старожили пам'ятають, що в незабутні часи для формування HTML часто використовувалася така штука, як JSP. Якщо у вашому проекті JSP теж використовується, то доведеться додати ще кілька залежностей: eclipse-jdtcore.jar, jsp-api-2.1-glassfish.jar, jsp-2.1-glassfish.jar

Конфігурація JDBC-ресурсів

Можливо, є рішення простіше, але ось такий варіант у мене заробив:

Для цього вам додатково буде потрібно ще трошки залежностей: transactions.jar, jetty-naming.jar, transactions-api.jar, transactions-jta.jar, transactions-jdbc.jar, atomikos-util.jar

Чи не можна це ще трошки автоматизувати?

Якщо список веб-додатків постійно змінюється, можливо, має сенс написати плагін для Eclipse або IDEA, який би запускав Jetty з усіма проектами, які є в даний момент в Eclipse. Один такий плагін описаний тут - він знаходить все проекти, в яких є файл web.xml, а решта проектів додає до них в classpath.

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

  • (Уявний мінус) Контейнер Jetty поступається в продуктивності Tomcat, JBoss, Resin і ін.
    Дурниця. Ми зараз говоримо про розробку - тут продуктивність абсолютно не має значення.
    До речі, це ще питання, поступається чи.
  • (Уявний мінус) Контейнер Jetty нестабільний / іноді тарахкається / містить витоку пам'яті.
    Дурниця. Див. Попередній пункт.
  • Якщо ваш додаток використовує якісь специфічні особливості якогось конкретного контейнера (особливо це стосується WebLogic або Oracle AS), то на Jetty воно працювати, природно, не буде.
    Напевно, тут нічого не поробиш. Можу тільки порадити не використовувати такі можливості, щоб ваш додаток не залежало від контейнера.
  • Іноді трапляється, що ваш додаток прекрасно працює на вашому комп'ютері в режимі Embedded Jetty, але тарахкається, будучи зібраним в war і встановленим на інший сервер.
    Це хоч і рідко, але трапляється. В частості, може виникнути помилка через загрузчиков класів та їхніх різновидів jar'ов.

альтернативи

Заради інтересу я перерахую альтернативні способи розробки веб-додатків на Java зі своєю суб'єктивною оцінкою.

Залишається додати, що в embedded режимі можна запускати не тільки Jetty, але і Tomcat, Glassfish і ін. Конкретний контейнер неважливий, важливий принцип: ніякої тривалої пересборки, установки, розпакування і настройки. Все запускається швидко і просто з одного класу.

Я сам розробляю веб-додатки таким чином вже кілька років і всім іншим раджу. Так ви будете витрачати менше часу на метушню навколо збірки і інсталяції і зможете зосередитися на власне розробці.