metaclass: (дзедline)
metaclass ([personal profile] metaclass) wrote2013-03-06 03:37 pm
Entry tags:

Java-экосистема

Разбираюсь потиху с Intellij IDEA и скалой. И, как обычно, утыкаюсь в "расхождения по земельному вопросу" с жабными инструментами. Сколько раз это все дело открывал - столько утыкался.

Вот у нас есть на данный момент что: jdk (много разных), мавен(две версии), sbt(аналог мавена для скалы), IDEA и тыщи плагинов под мавен, sbt и идею.
Я прочел документацию по мавену и sbt, но от входа все равно не понимаю, как принято создавать проекты с нуля и как принято их деплоить. Открываешь какой-нибудь пример, а там все заканчивается строкой вида sbt container:start, которая работает исключительно внутри запущенного sbt и с помощью плагина типа "com.github.siasia" %% "xsbt-web-plugin. Или мавен с jetty-плагином.

Предположительно, можно поставить jetty сервисом и деплоить туда приложение в виде war. Но сборка этого war и особенно копирование зависимостей для него для меня темный лес.
Я обычно начинаю с того, что запускаю jetty внутри своего приложения, передавая ему хендлер явно, т.к. таким образом для меня проще понять, что в каком порядке работает и откуда берется конфигурация. Но даже в этом случае количество вариаций на тему "запустить жабу с указанием classpath и main class" просто поражает.
Т.е. запуск из мавена, запуск из sbt, запуск из idea, деплоймент в контейнер и запуск из консоли руками и запуск в виде jar - это все совершенно между собой различающиеся варианты, с разными classpath, разными репозиториями и прочим таким.

Плюс еще несколько десятков версий на каждую зависимость, которые нужно внятно выбрать при добавлении. Слава богу, они хоть не конфликтовали у меня пока.

[identity profile] ivan sopov (from livejournal.com) 2013-03-06 01:09 pm (UTC)(link)
Таких граблей только навскидку можно придумать еще много:
- по дефолту все ресурсы не исходники лежат у мавена в отдельной папке src/main/resources, но у большей части проектов в реальном мире в конфиге maven-resource-plugin прописано, что ресурсы могут лежать и вместе с исходниками тоже. Причем обычно это прописано в каком-нибудь родительском поме. Поначалу меня обескураживало, почему в одном проекте работает, а в другом - нет.
- classpath конечно один, но даже в самом простом случае, их на самом деле два - для компиляции и для запуска. Если использовать системы сборки, то этих classpath-ов оказывается гораздо больше - test, compile, runtime, container - и у IDE представления о том,что куда входит и сколько их всего может не совпадать с системой сборки (подозреваю, что на этом месте люди начинают обратно любить ant, где конкретно эти нюансы как правило прописываются явно руками).
- логирование (сколько боли в одном этом слове)
- вы забыли запуск из IDE собранного там же war VS запуск из IDE собранного проекта но не запакованного в war (exploded в терминах Idea) VS запуск непосредственно проекта (не знаю, есть ли это в Idea - в Eclipse это есть в нескольких вариантах разными плагинами)


На самом деле за это Java-экосистему и любим, что какого-то одного пути обязательного для всех не навязывается.

[identity profile] prepor.livejournal.com 2013-03-06 01:42 pm (UTC)(link)
> - логирование (сколько боли в одном этом слове)

ох, слава богу, я был почти уверен, что я слишком глуп для ява-штук, раз мне вывод строчек в стдаут так мозг рвет.

[identity profile] metaclass.livejournal.com 2013-03-06 01:48 pm (UTC)(link)
Логи да, тема вечная :)

[identity profile] volodymir-k.livejournal.com 2013-03-06 07:59 pm (UTC)(link)
если ничего не работает, почитайте, наконец, документацию

логгирование настраивается совершенно в разных позах и конфигурациях по малейшей прихоти разработчика