Сформированна программа мероприятия, подробности на сайте.
Приходите, будет интересно
Вівторок, 24 листопада 2009 р.
Coffee'n'Code Kharkiv
jQuery && WebKit based browsers
хозяйке на заметку, события document.ready и window.load в браузерах основанных на WebKit срабатывают раньше, чем будут загружены основные ресурсы. таким образом никак невозможно критически важные JavaScript функции, срабатывание которых запланированно на момент загрузки окна или DOM Document'а, помещать во внешние файлы.
господа Google-разработчики -- это таки баг
Spring Portlet MVC
при работе со Spring MVC в портально-портлетном окружении следует учитывать еще и таки не очевидные и нигде отдельно не задокументированные вещи
жизненный цикл портлетных обращений к серверу состоит из одной или двух фаз, в зависимости от того, произошли какие-то действия или нет.
a) в простейшем случае это просто RenderRequest, который на стороне контроллера обрабатывается методом processRenderRequest
б) в случае, если произошел сабмит формы или просто был вызван ActionRequest, то сначала отработает метод onSubmitAction, а потом будет сформирован RenderRequest и выполненн метод processRenderRequest
казалось бы все просто и довольно прозрачно, и Spring предоставляет возможность указывать, какие именно параметры сохранять в конце onSubmitAction, для их использования в RenderRequest. но тут нас поджидает ряд сюпризов
- параметры, перечисленные в свойстве контроллера setRenderParameters из ActionRequest не копируются. во всяком случае базовое поведение контроллера именно таково
- метод формирования объекта команды fromBackingObject вызывается только в двух случаях -- при сабмите формы и при начальном открытии формы, если указано свойство bindOnNewForm=true. в случае RenderRequest данный метод игнорируется полностью
- с сабмитом формы тоже не все просто. по мере вызова методов от processActionRequest до showForm параметры запроса несколько раз валидируются, сравниваются с существующими и перекладываются из одного формата в другой. если по мере выполнения функционала окажется, что параметры запроса совпадают с сохраненными в контроллере, метод onSubmitRender может быть проигнорирован. равно как будет проигнорирован вызов метода formBackingObject в случае принудительного программного редиректа с одного контроллера на другой
- в том случае, если необходимо сделать принудительный программный редирект к начальному состоянию портлета, единственный способ это сделать -- установить параметр action RenderRequest в пустое значение или значение, соотвествующее начальному состоянию портлета. определить параметры successView и redirectAction контроллера не достаточно -- в этом случае сохраняется состояние портлета, в котором он находился на момент сабмита ActionRequest
- в портлетной инкарнации Spring MVC объект сессионной формы всегда удаляется из сессии после второго обращения к нему. иначе говоря
а) объект попадает в сессию после создания и заполнения параметрами
б) контроллер проверяет, имеет ли место быть сохраненный объект и если да, то считывает и удаляет
в) если зарегистрованно еще одно обращение к объекту формы, то конроллер положит обновленный объект обратно
таким образом не стоит переживать насчет заполнения сессии мертвыми объектами или фиксации их состояния
Четвер, 8 жовтня 2009 р.
Maven2::Part #5
Assembly plugin
несколько слов об assembly plugin. Maven предоставляет возможность формировать delivery package с помощью assembly plugin. стандартная документация описывает процесс создания конечного пакета в формате bin и src, как это обычно выглядит для всех продуктов Apache Software Foundation. однако, с помощью этого плагина можно формировать пакеты абсолютно произвольного формата. для этого понадобиться дескриптор assembly.xml, в котором с помощью тэгов
Неділя, 27 вересня 2009 р.
Maven2::Part #4
Управление зависимостями (Dependency Management)
в первую очередь следует обратить внимание на стандратную документацию Maven. она довольпо подробно объясняет, как использовать механизм управления зависимостями. я хочу оставновится на некоторых моментах, которые могут быть не ясны из стандартной документации
включение и исключение библиотек при объявлении зависимостей
управление зависимости в Maven организованно довольно грамотно. оно учитывает все зависимости явно и не явно указанные в проекте и самостоятельно разрешает коллизи конфликта версий библиотек в пользу указанных явно. так, если какая-то из подключенных библиотек, в свою очередь использует библиотеку, которая уже указана в зависимостях для проекта, то в данном случае будет использована библиотека, указанная в зависимостях проекта. в данном случае безусловным приоритетом обладает явная декларация, что следует учитывать в случае возникновения конфликтов версий.
что касается практики организации зависимостей, то тут необходимо отметить два момента
- при огранизации зависимостей разрабатываемого модуля или приложения от сторонних библиотек, необходимо помнить, что все зависимости, для которых указан scope compile или не указан scope, будут автоматически включены в зависимости модуля, который использует разрабатываемый модуль. или, более простыми словами, если ваш модуль будет использован в дальнейшей разработки, все зависимости scope compile, автоматически окажутся в вашем локально репозитории и директории lib для war и ear. в случае, когда в таком поведении системы нет строгой необходимости использование тега optional более чем желательно.
в противном случае все пользователи вашего модуля будут получать на выходе гиганские объемы библиотек, которые они не используют. или же будут прибегать к практике из пункта 2 - при использовании сторонних библиотек следует обязательно обратить внимание на количество зависимостей, не отмеченных как optional, у используемого модуля. ярким примером являются релизы Spring весии 2.x, каждый модуль которого норовит вытащить из репозитория 90% фреймворка.
для того, чтобы избежать такого поведения той или иной библиотеки из зависимостей, необходимо отключить все не нужные в приложении зависимости, не объявленные в pom библиотеки, как optional.
в своей практике я часто оключал все зависимости подключенных библиотек, и включал явно только те, которые мне были нужны. однако, не могу сказать, что это оптимальный способ. скорее наоборот. с другой стороны этот способ дает полный и очевидный контроль над всеми без исключения зависимостями проекта, но pom файлы бывают очень большими и единоразовое их составление занимает довольно приличное время.
dependencyManagement vs dependencies. в чем разница?
разница между этими двумя секциями может быть сравнима с разницей между h и cpp файлами С++. dependencyManagement содержит декларацию зависимостей, а dependencies -- зависимости, которые непосредственно используются в проекте. в случае одномодульного проекта эта конструкция избыточна, однако для многомодульных проектов ее ценность тем выше, чем больше модулей составляют проект.
определить зависимости той или иной библиотеки можно окрыв ее pom файл внутри репозитория или используя специальный ресурс
управление зависмостями в multimodule projects
для многомодульных проектов сложно переоценить значение секции dependencyManagement. ее использование позволяет объявить, а следовательно и управлять, зависимости в в одном единственном месте включая все необхоимые значения scope, exclusions и optional. этим местом является parent pom файл всего проекта. в pom файле каждого из модулей, в секции dependencies достаточно указать groupId и artifactId кокретной зависимости или плагина. Maven автоматически использует остальные параметры аналогичной зависимости из parent pom файла
разница между pluginManagement и plugins аналогична, равно как и аналогична их избыточность, важность и использование для разных проектов.
Понеділок, 14 вересня 2009 р.
Maven::Part #3
Multimodule projects
каждый pom.xml файл описывает build workflow для одного проекта, в конечной фазе которого мы имеем один артефакт установленный в локальный и удаленный репозитарий. однако Maven позволяет легко и удобно работать с многомодульными проектами. при этом задача управления зависимостями между внешними библиотеками и между модулями внтури проекта полностью решается самим Maven.
Особенности конфигурации
для того, чтобы сконфигурировть build workflow для multimodule project необходимо
- создать в корневом каталоге, общем для всех модулей, pom.xml файл родительского модуля, для которого указать
...
<packaging>pom</packaging>
...
такое значение артефакта указывается Maven на то, что данный проект является мета-проектом и не требует сборки конечного артефакта на выходе. в итоге в репозитариях будет просто сгенерирована мета-информация об этом проекте, без наличия конркетных артефактов. - далее в родительском pom.xml файле мы должны определить конфигурацию модулей
...
<modules>
<module>module1_directory_name</module>
<module>module2_directory_name</module>
...
<module>moduleN_directory_name</module>
</modules>
...
где
module_directory_name -- имя каталога, в котором находятся файлы конкретного модуля.
Важно: имена модулей в родительском pom.xml и имена каталогов, в котором расположены файлы модуля должны быть идентичны. имена каталогов модулей обрабатываются как пути к этим каталогам. таким образом, если структура конкретного проекта предполагает взаимонезависимое расположение каталогов с модулями, то следует указывать их абсолютные или отностительные пути - для pom.xml каждого из модулей, входящих в multimodule project необходимо указать
...
<parent>
<groupId>project_group_id</groupId>
<actifactId>parent_artifact_id</artifactId>
<version>project_version</version>
[<relativePath>path_to_parent_pom.xml</relativePath>]
...
где
project_group_id -- идентификатор группы, в которой будут сохранены все артефакты проекта. в случае multimodel project может быть указана для родительского модуля и parent-секции модуля. для конкретных модулей наследуется из родительского, если не указана явно
parent_artifact_id -- идентификатор артефакта родительского проекта. этот интификатор необходим в любом случае и для любого проекта. даже для мета-проекта, которым часто является родительский проект
project_version -- текущая версия проекта. в случае multimodel project может быть указана для родительского модуля и parent-секции модуля. для конкретных модулей наследуется из родительского, если не указана явно
relativePath -- относительный путь к родительскому pom.xml. его необходимо указать в том случае, если каталог уровнем выше каталога модуля, не содержит родительского pom.xml
Важно: родительский pom.xml может определять различные кастомизации стандартных и не стандартных плагинов, обшие для всех модулей. однако следует помнить, что каждая задача, определенная в родительском pom.xml проекта, будет выполнена для каждого модуля проекта.
есть предположение, что для версии Maven 2.2.1 данное поведение исправлено. но я еще не проверял этого в своих проектах
Неділя, 13 вересня 2009 р.
Maven2::Part #1
Maven build workflow
полный список фаз Maven build workflow можно найти в документации. за каждую фазу отвечает какой-нибудь плагин из группы org.apache.maven. каждый из плагинов, кроме цели по-умолчанию, как правило умеет еще много полезных вещей. поэтому даже для стандартных плагинов нужно и важно читать документацию. встраиваться в ту или иную фазу довольно просто
...
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>maven-touch-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>timestamp</goal>
</goals>
</execution>
</executions>
</plugin>
...
Важно: все кастомные цели вызываются в конце выполнения указанной фазы. т.е. если перед фазой package необходимо что-то сделать с ресурсами, то для этой цели фаза должна быть prerare-package, а не package
отдельно следует отметить фазы цикла package, install и deploy.
package -- фаза, когда происходит сборка артефакта. стандартные плагины, для сборки артефактов, входящие в поставку Maven, умеют собирать jar, war, ear, ejb, rar, shade. каждый из сборщиков умеет класть внутрь архива необходимые ресурсы и раскладывать их по необходимым местам автоматически.
install -- фаза, когда собранные на этапе package артефакты проекта устанавливаются в локальный репозитарий. плагин создает каталоги группы и версии, копирует в созданную структуру артефакт и генерирует необходимую метаинформацию
deploy -- фаза, когда проинсталлированные в локальный репозитарий артефакты, переносятся в удаленный репозитарий. тут важно отметить, что Maven следит за обновлениями удаленных репозитариев автоматически. так что для того, чтобы обновить какой-то модуль для удаленной команды, необходимо только задеплоить его в общий удаленные репозитарий.
