Ускоренная разработка с Maven3 - PullRequest
3 голосов
/ 17 февраля 2011

До сих пор я нашел два способа запуска моей программы с maven3:

  1. $ mvn exec:exec -Dexec.args='...'
  2. $ mvn assembly:assembly && java -cp all-with-dependecies.jar example.Main ...

Первый использует mvn'sJVM, которая перехватывает исключения и запускается очень медленно.Последний тоже очень медленный, потому что он должен построить большую банку и запустить тесты.

Я бы хотел что-то вроде $ mvn compile && java -cp $CLASSPATH example.Main.Так как обычно CLASSPATH является постоянной величиной между запусками, мне приходится беспокоиться об этом только один раз.

Мой вопрос: как вы ускоряете компиляцию в цикле разработки, изменения, компиляции, тестирования?

Ответы [ 8 ]

3 голосов
/ 17 февраля 2011

Вы можете попробовать Maven Shell .Рекламное объявление гласит следующее:

"Maven Shell - это интерфейс CLI для Maven, который обеспечивает более быструю обработку и более интеллектуальное взаимодействие с репозиториями и проектами. Используя Maven Shell,возможность ускорить сборку, поскольку информация о проекте и подключаемые модули Maven загружаются в один всегда готовый экземпляр JVM, который может выполнять сборку Maven. "

2 голосов
/ 17 февраля 2011

Вы можете создать classpath с помощью Maven Dependency Plugin , а затем использовать его:

$ mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
$ export CLASSPATH=target/classes:`cat cp.txt`
...
$ mvn compile && java -cp $CLASSPATH example.Main
2 голосов
/ 17 февраля 2011

Используйте командную строку mvn реже и вместо этого используйте IDE, например Eclipse , для быстрого тестирования инкрементальных изменений.

Eclipse строит постепенно, то есть строит только изменения, поэтому работает намного быстрее.

0 голосов
/ 21 июня 2016
  • Создайте единый модуль для всех ваших зависимостей времени сборки (аннотации, встроенный tomcat, генераторы кода и т. Д. Создайте его один раз и присоедините к плагину компилятора, чтобы они находились в пути сборки для всех модулей

  • создайте небольшую общую конфигурацию и разархивируйте ее в каждом модуле во время сборки (проверьте конфигурацию стиля, настройку ведения журнала и т. Д.)

  • поместите подключаемые модули mavenв свои собственные индивидуальные профили, которые могут быть внесены точно в срок по мере необходимости, например, проверка стиля, findbugs, JavaDoc, верный, отказоустойчивый, подписывание кода и т. д. Ваша обычная сборка должна использовать как можно меньше плагинов. Это действительно помогает сустранение неполадок, поскольку любой плагин может быть индивидуально включен с параметром командной строки -P

  • во избежание конфигурации вилки в плагине компилятора, это может удвоить время сборки. Если вам нужны -параметры, то толькофорк один раз для классов, которые в этом нуждаются.

  • написать тесты, чтобы они могли работать параллельно. Никаких тестов не требуетсяe, чем секунда.

  • используйте опцию -T 1C для параллельной сборки

  • используйте встроенную версию tomcat вместо tomcatплагин, для запуска Tomcat для интеграционных тестов.Избегайте запуска tomcat более одного раза.

  • исключите любые файлы jar, которые не нужно сканировать в свойствах конфигурации tomcat.

  • структурируйте ваш проектв сбалансированную группу дерева связанных компонентов под их собственным родительским пом.

Самым верхним является модуль POM BOM, модуль общих ресурсов, модуль пути общей сборки.Вы редко создаете их, когда все организовываете.

Следующее - это ваш топ-приложение, которое включает в себя следующие родительские помпы

- Обычные низкоуровневые модули без зависимостей.

-Gateway модуль, который включает в себя клиентские библиотеки http и интерфейсные модули.

-Бизнес-модули

-Контейнеры - Tomcat, Spring, DropWizzard и др.

-Пакеты - ubber jars, zips

-Runtimes - Rpms, исполняемые jar

Зависимости poms всегда должны указывать на poms более высокого уровня, чтобы избежать циклических зависимостей

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

У вас должна быть возможность собрать любую группу примерно за 5 секунд, построить свою войну за 5 секунд, запустить tomcat with springза 10 секунд для наихудшего случая 20-секундной итерации.

  • быстрый и инкрементный компилятор maven, поэтому старайтесь избегать генерации кода, вызывающего перекомпиляцию

  • создайте небольшой DSL и интерпретатор дляваши тесты.Мы видели, что этот подход работает в два раза быстрее, чем junit.

Я только что взял нашу большую полную сборку с 5 минут до 45 секунд, используя эти методы.Это много техники, но оно того стоит.Этот подход работает со стандартным плагином релиза maven и значительно упрощает поиск и устранение неисправностей.

Удачи.Это никогда не бывает достаточно быстрым

PS PCIe SSD тоже очень помогают

0 голосов
/ 17 февраля 2011

Если вам нужно реализовать инструмент командной строки, просто взгляните на maven appassembler plugi n, который очень полезен в подобных ситуациях.В связи с maven-assembly вы можете создать архив .tar.gz / zip, который можно распаковать и запустить приложение.

0 голосов
/ 17 февраля 2011

Другой вариант, кроме Eclipse, заключается в использовании JRebel , который будет эффективно выполнять горячую замену вашего кода, чтобы вы могли поддерживать свою программу постоянно.

К сожалению JRebel не является бесплатным, если вы не используете исходный код или не используете Scala.

Если вы используете Eclipse (или IntelliJ) и запускаете программу в режиме отладки, вы также можете выполнять горячую замену своего кода, но не можете добавлять или удалять методы.

Я считаю, что эти два метода наиболее эффективны в среде Java, если вы хотите немедленной обратной связи.

Последний вариант - настроить Maven для использования компилятора Eclipse , который работает быстрее (предположительно), чем компилятор openjdk.

0 голосов
/ 17 февраля 2011

В последний раз, когда я создавал инструмент командной строки, я использовал плагин зависимостей для копирования всех jar-зависимостей в каталог (например, target / dist / lib), настроил classpath и основной класс в файле Manifest (плагин Maven Jar) , Тогда я мог бы выполнить приложение с:

java -jar myJar.jar

0 голосов
/ 17 февраля 2011

Вы можете пропустить тесты, передав опцию: -Dmaven.test.skip=true.

И почему вы предполагаете, что запуск новой JVM будет быстрее, чем запуск программы в JVM Maven?Скорее всего, все будет наоборот.

РЕДАКТИРОВАТЬ: еще один простой способ ускорить цикл разработки: используйте параметр --offline, кроме случаев, когда вы меняете зависимости.

...