В этой статье я покажу вам, как можно применить принцип СУХОЙ при использовании тощей военной конфигурации плагина 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 здесь .