среда, 15 августа 2018 г.

Ускоряем сборку проекта с использованием maven и git

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

Как мы обычно собираем проект? В любимом терминале вводим: mvn clean install
После этого maven компилирует весь проект и копирует созданные артифакты в локальный репозиторий. Все тривиально, но здесь есть ряд проблем. Это долго. Даже если убрать clean, запустятся тесты, после них произойдет упаковка в jar или какой другой тип артифакта, и наконец копирование полученного артифакта в $HOME/.m2/repository

Давайте подумаем над тем, как мы можем ускорить этот процесс. Может есть возможность выкинуть ненужные действия.
Как правило, изменения присутствуют не во всех модулях. Разумеется, можно собрать отдельно только те модули, которые нам нужны. Но это довольно утомительно. Нужно будет явно следить в каких модулях производились изменения и затем переключаться в требуемую директорию подмодуля либо прописывать явно названия этих подмодулей после флага -pl

Есть другое решение. Все мы, надеюсь, используем git, либо какую то другую scv. Так вот, почему бы при добавлении в репозиторий не добавлять информацию о номере последнего коммита. Это позволит отслежить версию артифакта в рамках одной и той же версии. Если ревизия совпадает. очевидно, нет смысла собирать еще раз подмодуль, т.к. в локальном репозитории присутствует уже актуальная версия.

Как же это реализовать? Для этого потребуется подключить несколько maven плагинов и немного попрограммировать на xml 😃

пятница, 10 августа 2018 г.

Заставляем дружить CDATA и JAXB

Всем добрый день, сегодня будем говорить о JAXB. Данная технология преобразования объектов в xml файл в java существует достаточно давно и не представляет особой сложности, но как и везде, существует ряд нюансов. Они появляются когда вы хотите сделать, что «нестандартное». В моем случае, требовалось заключить некоторые поля в блок CDATA, а содержимое оставить без изменений.

воскресенье, 29 апреля 2018 г.

Кидаем исключения типа Object

Всем известно, что кидать исключения можно только, если объект наследуется от класса java.lang.Throwable. Для этого предназначена инструкция байткода ATHROW. Мне стало интересно, осуществляется ли проверка типа после компиляции.
Напишем небольшой метод, генерирующий нужный класс, с помощью библиотеки bcel.

суббота, 28 апреля 2018 г.

Видео с семинара по Spring

Обзор базовых компонентов фреймворка Spring:

  • Spring Boot
  • Spring Data JPA
  • Spring MVC в связке с Thymeleaf
  • Spring Security
на примере создания вебсайта

пятница, 22 декабря 2017 г.

CPU оптимизации

Сегодня, в этой небольшой статье, я хотел бы поделиться своими знаниями об оптимизациях центрального процессора. А именно:

  1. branch prediction
  2. cache levels
  3. false sharing
  4. prefetching
  5. loop unrolling

Начнем в первой. В детали вдаваться не буду, а начну сразу с примера. Допустим у нас есть следующий метод:

Выглядит вполне симпатично и на первый взгляд не представляет никаких угроз, но это только на первый взгляд. Если мы померим время выполнения данного метода для произвольного массива и для него же, но только отсортированного, результат будет сильно отличаться.

суббота, 21 октября 2017 г.

О строителях

Сегодня речь пойдет о шаблоне проектирования Builder, или же по русски, строитель.
Начнем с определения и выясним для чего он нужен.

Строитель относится к порождающим шаблонам, а значит, с его помощью создаются объекты. Он позволяет конструировать объект по частям. Приведу пример, как выглядит типичный Builder.
Допустим у нас есть класс Person

суббота, 15 июля 2017 г.

Генерирование классов во время выполнения

dynamic

Иногда требуется создать класс с определенным поведением во время работы программы. К сожалению, Java не обладает динамизмом, присущем таким языками как Python, Javascript, Groovy. Но все же, возможность такая существует, и есть несколько способов это сделать. Например, сгенерировать напрямую байткод. Но такой способ, довольно сложен. Мы же, в данной статье, напишем исходный код и затем скомпилируем его.