Pull to refresh

Собираем проект на RAM-диск при помощи Maven

Reading time3 min
Views12K
За 10 лет разработки веб-приложений с использованием технологий Java я успел повидать огромное число коллег-программистов и познакомиться с их методами организации рабочего процесса. И, к моему удивлению, абсолютное меньшинство когда-либо задумывалось над использованием RAM-диска для сборки проектов. Я думаю, что такая элементарная оптимизация просто не приходит в голову, постоянно занятую текущими задачами, дедлайнами и просто жизненными проблемами.

А между тем, сборка в память обладает двумя очень значительными преимуществами:
  • Значительное увеличение скорости сборки за счет отсутствия операций ввода-вывода на жесткий диск (в большей степени это касается классических жестких дисков, особенно со скоростью вращения 5400 оборотов в минуту)
  • Увеличение времени жизни вашего SSD за счет перемещения интенсивных операций записи в память

Если учесть, что в последние годы сильно вырос объем оперативной памяти на компьютере среднестатистического разработчика и повсеместно начинают применяться SSD, то аргументов «против» практически не остается.

Главная цель этой небольшой статьи — вызвать мысль: «А ведь действительно! И как я раньше об этом не подумал?».

Я опишу пример реализации такого подхода в Linux. Действия в других операционных системах будут практически идентичными, за исключением методов создания самого RAM-диска.


Создание RAM-диска

Отредактируем файл /etc/fstab при помощи вашего любимого редактора, например:
gksudo -k gedit /etc/fstab

Добавим в него сроку
tmpfs /tmp tmpfs mode=1777 0 0

Я предпочитаю монтировать на RAM-диск папку /tmp и в ней же собирать все проекты, это дает дополнительное преимущество — временные файлы других программ также не используют SSD-диск. Дополнительным радостным фактом является то, что весь мусор удаляется автоматически при перезагрузке компьютера.

Настройка Maven

Для начала необходимо ввести в корневой pom-файл проекта дополнительный параметр, который будет указывать на папку сборки и нацелить его на папку сборки по умолчанию. Это делается для того, чтобы необходимые вам изменения не коснулись других разработчиков.

<project>
...
    <properties>
        <target.directory>${basedir}/target</target.directory>
    </properties>
...
    <build>
        <directory>${target.directory}</directory>
        ...
    </build>
...
</project>

Также следует обратить внимание на другие места в pom-файлах проекта, которые могут использовать ${basedir}/target.

Например на
jetty-maven-plugin
<plugin>
    <groupId>org.eclipse.jetty</groupId>
     <artifactId>jetty-maven-plugin</artifactId>
     <version>9.0.6.v20130930</version>
     <configuration>
         <war>${target.directory}/myproject-web</war>
         <classesDirectory>${target.directory}/classes</classesDirectory>
         <webAppSourceDirectory>${basedir}/src/main/webapp</webAppSourceDirectory>
         <webApp>
             <contextPath>/</contextPath>
             <jettyEnvXml>${basedir}/src/main/resources/jetty-env.xml</jettyEnvXml>
              <defaultsDescriptor>${basedir}/src/main/resources/webdefault.xml</defaultsDescriptor>
              <descriptor>${basedir}/src/main/webapp/WEB-INF/web.xml</descriptor>
          </webApp>
          ...
    </configuration>
         ...
</plugin>


Остался последний шаг — изменение локальных настроек Maven для того, чтобы переменная ${target.directory} имела нужное вам значение, а не значение, указанное в pom-файле.

Скопируем конфигурационный файл Maven, в ~/.m2 (если это необходимо)
cp /usr/share/maven/conf/settings.xml ~/.m2/settings.xml

Отредактируем settings.xml в папке ".m2" текущего пользователя
gedit ~/.m2/settings.xml

Создадим новый профиль
<profiles>
...
    <profile>
      <id>RAMBuild</id>
      <properties>
        <target.directory>/tmp/maven/${project.groupId}.${project.artifactId}/target</target.directory>
      </properties>
    </profile>
...
</profiles>

Добавим новый профиль в список активных:
<activeProfiles>
    ....
    <activeProfile>RAMBuild</activeProfile>
    ....
</activeProfiles>

Вот и все. Надеюсь, теперь ваши билды будут быстрее, а диски долговечнее.
Tags:
Hubs:
Total votes 16: ↑12 and ↓4+8
Comments22

Articles