Переход от Ant к Maven: как настроить проект EAR?
У нас есть довольно сложный проект, который должен быть построен в Ant, но теперь мы переходим в Maven.
- Существует основная банка и множество фильтров, которые зависят от основной банки.
- Эти банки собраны в
SAR
наряду с другими зависимыми банками и несколькими файлами XML. Я назвал этоfoo-sar
ниже. - Другой JAR построен, но этот JAR не содержит никакого кода Java, только несколько файлов приложения XML. Я назвал это
foo-jar
ниже. foo-jar
а такжеfoo-sar
упакованы в EAR сapplication.xml
файл найден вMETA-INF
каталог.
У меня есть проект Maven с тремя подпроектами:
foo-jar
foo-sar
foo-ear
И то и другое foo-jar
а также foo-sar
построить просто отлично. Однако когда foo-ear
строит, он строит ухо с application.xml
файл, но без foo-jar
а также foo-sar
в этом. Моя структура каталогов выглядит так:
parent Dir --+
|
+-- foo-ear
|
+-- foo-jar
|
+-- foo-sar
Родительский каталог pom.xml
называет все три проекта в правильном порядке (foo-sar
, foo-jar
, а также foo-ear
). И то и другое foo-jar
а также foo-sar
построить правильно (то есть, я сопоставил результаты сборки Ant). foo-ear
проект строится без ошибок, но не включает foo-sar
а также foo-jar
файлы в корне уха.
Я здесь упускаю что-то довольно простое. Может быть, это дополнительный параметр или другая конфигурация.
Вот ухо pom.xml
:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-app</artifactId>
<packaging>ear</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<artifactTypeMappings>
<!-- The sar is a "jboss-sar" and not just a "sar" -->
<artifactTypeMapping type="jboss-sar" mapping="sar"/>
</artifactTypeMappings>
<modules>
<jarModule>
<artifactId>foo-jar</artifactId>
<unpack>true</unpack>
</jarModule>
<sarModule>
<artifactId>foo-sar</artifactId>
<unpack>true</unpack>
</sarModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
</project>
Новые проблемы
Я понял, что одной из проблем, с которыми я столкнулся, является то, что <groupId>
был установлен на org.apache.plugins
и не org.apache.maven.plugins
для maven-ear-plugin
, Я понятия не имею, почему Maven не обнаружил эту ошибку раньше и выдает ошибку сборки раньше.
Как только я установил правильную группу, я начал замечать, что application.xml
строился, хотя я указал, что <generateApplicationXml>
был ложным Я понял, что это происходит в generate-application-xml
цель, и, по-видимому, по умолчанию <configuration>
для ear
Цель. Таким образом, я должен был указать <execution>
для generate-application-xml
цель и ear
цель отдельно.
Веселье, веселье, веселье.
Я получил ухо для генерации, за исключением одной незначительной проблемы, зависимости в ухе загружаются в любом случае, даже несмотря на то, что я сконфигурировал информацию о моем модуле, чтобы сделать вещи немного по-другому. Вот мой pom.xml
для уха:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-app</artifactId>
<packaging>ear</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<executions>
<execution>
<id>skip-application-xml-generation</id>
<phase>package</phase>
<goals>
<goal>generate-application-xml</goal>
</goals>
<configuration>
<generateApplicationXml>false</generateApplicationXml>
</configuration>
</execution>
<execution>
<id>create-ear</id>
<phase>package</phase>
<goals>
<goal>ear</goal>
</goals>
<configuration>
<artifactTypeMappings>
<artifactTypeMapping type="jboss-sar" mapping="sar"/>
</artifactTypeMappings>
<modules>
<jarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<unpack>true</unpack>
<uri>FooJar.jar</uri>
</jarModule>
<sarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<unpack>true</unpack>
<uri>Foo.sar</uri>
</sarModule>
</modules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<version>${project.version}</version>
<type>sar</type>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
И вот генерируемое ухо:
$ ls -l foo-app/target/foo-app-1.0.0
drwxr-xr-x 3 david staff 102 Jan 17 11:21 Foo.jar
drwxr-xr-x 137 david staff 4658 Jan 17 11:21 Foo.sar
drwxr-xr-x 4 david staff 136 Jan 17 11:21 META-INF
-rw-r--r-- 1 david staff 3905 Jan 17 11:21 foo-1.0.0.jar
-rw-r--r-- 1 david staff 50104182 Jan 17 11:21 foo-sar-1.0.0.sar
Как я могу настроить свое ухо, чтобы предотвратить foo-1.0.0.jar
а также foo-sar-1.0.0.sar
быть включенным в мое ухо? Не должен <module>
часть моего уха <configuration>
отображать мои зависимости в мои модули?
1 ответ
Я нашел решение. Вероятно, есть гораздо лучшее решение, но я обнаружил, что это работает. Это большой, огромный, клудж. Не стесняйтесь, дайте мне знать, как я не прав, и как это сделать правильно.
Как arghtype
указал, что мне нужно добавить эти модули в мои зависимости. Делать это работает. Тем не менее, я обнаружил, что он также включает в себя все мои зависимости и загружает их в мое ухо тоже. Учитывая, что одним из моих модулей, который я включаю, является SAR, который содержит огромное количество jar-зависимостей, это было просто глупо.
Чтобы устранить зависимости, я изначально пытался <exclusions>
в описании зависимости, но это не избавило от добавленных jar и sar. Что я наконец-то сделал, так это вставил <scope>provided</scope>
в моем pom.xml
чтобы предотвратить их загрузку.
Это работает, но должен быть лучший способ сделать это:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.vegicorp.foo</groupId>
<artifactId>foo-app</artifactId>
<packaging>ear</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<executions>
<execution>
<id>skip-application-xml-generation</id>
<phase>package</phase>
<goals>
<goal>generate-application-xml</goal>
</goals>
<configuration>
<generateApplicationXml>false</generateApplicationXml>
</configuration>
</execution>
<execution>
<id>create-ear</id>
<phase>package</phase>
<goals>
<goal>ear</goal>
</goals>
<configuration>
<artifactTypeMappings>
<artifactTypeMapping type="jboss-sar" mapping="sar"/>
</artifactTypeMappings>
<modules>
<jarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<unpack>true</unpack>
<uri>FooJar.jar</uri>
</jarModule>
<sarModule>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<unpack>true</unpack>
<uri>Foo.sar</uri>
</sarModule>
</modules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-sar</artifactId>
<version>${project.version}</version>
<type>sar</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-jar</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>