Статьи

СУХАЯ И ХУДОЖНАЯ ВОЙНА

В этой статье я покажу вам, как можно применить принцип СУХОЙ при использовании тощей военной конфигурации плагина maven-war-plugin.

При упаковке EAR иногда целесообразно, чтобы все библиотеки различных WAR содержались не в соответствующих папках WEB-INF / lib, а на уровне EAR, чтобы они могли использоваться всеми WAR. Некоторые организации даже применяют это правило, чтобы оно было не только желательным, но и обязательным.

Используя Maven, ничто не может быть проще. Maven войны-плагин документов такой случай использования и называет его тощий войны . Вкратце, у вас есть два действия:

  • вам нужно настроить каждую WAR POM так, чтобы артефакт не включал в себя какую-либо библиотеку:
    <project>
    ...
    <build>
    <plugins>
    <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
    <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
    <archive>
    <manifest>
    <addClasspath>true</addClasspath>
    <classpathPrefix>lib/</classpathPrefix>
    </manifest>
    </archive>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>
  • Вы должны добавить каждую зависимость всех ваших WAR в EAR

Последнее действие — настоящая неприятность, так как вы должны сделать это вручную. В ходе проекта обязательно произойдет десинхронизация, поскольку вы добавляете / удаляете зависимости из WAR (ов) и забываете повторять действие над EAR. Здесь должен применяться принцип СУХОЙ, проблема в том, как его реализовать.

Существует простое решение этой проблемы: если бы POM мог перегруппировать все мои WAR-зависимости, мне нужно было бы только нарисовать зависимость от WAR к ней, а другую — от EAR, и она бы выполнила мое требование DRY. Давай сделаем это!

Сам помлиб

Как я уже говорил ранее, pomlib — это просто проект, упаковка которого представляет собой POM и у которого есть зависимости. Проще говоря, нашей единственной зависимостью будет Log4J 1.2.12 (чтобы не иметь транзитивной зависимости, давайте оставим ее простой).

ПОМ будет:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ch.frankel.blog.pomlib</groupId>
<artifactId>pomlib-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>pomlib-lib</artifactId>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
</project>

Как и для любого другого модуля проекта, я поместил версии в родительском POM.

УХО и ВОЙНА

Оба должны теперь добавить зависимость к pomlib. Для краткости отображается только EAR POM, WAR POM можно найти в источниках, если это необходимо.

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ch.frankel.blog.pomlib</groupId>
<artifactId>pomlib-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>pomlib-ear</artifactId>
<packaging>ear</packaging>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>pomlib-lib</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>pomlib-war</artifactId>
<type>war</type>
</dependency>
</dependencies>
</project>

Аналогично, версии помещаются в родительский POM. Обратите внимание на область импорта зависимости pomlib, это единственное волшебство.

С этого момента установка mvn установит зависимость log4j в корень сгенерированного артефакта EAR, а не в папку WEB-INF / lib WAR.

Вывод

Теперь, когда все зависимости описаны в pomlib, если вам нужно добавить / удалить зависимость, это единственное место, которое вам нужно изменить. С помощью небольшой настройки вы упростили процесс доставки и избавили себя от огромного стресса в будущем.

Между прочим, если вы используете простой контейнер сервлетов (например, Tomcat или Jetty) в качестве сервера приложений для разработки, вы даже можете поместить в файл тощую военную конфигурацию. Maven будет производить «жирные» WAR по умолчанию во время разработки. Во время доставки просто активируйте профиль, и вот ваш продукт EAR, в комплекте тонкие WARS.

Вы можете найти источник этой статьи в формате Maven / Eclipse здесь .

 

С http://blog.frankel.ch/dry-and-skinny-war