Переход от Ant к Maven: как настроить проект EAR?

У нас есть довольно сложный проект, который раньше собирался в Ant, но теперь мы переходим на Maven.

  1. Существует кувшин с сердечником и множество кувшинов фильтра, которые зависят от кувшина с сердечником.
  2. Эти jar-файлы собираются в SAR вместе с другими зависимыми jar-файлами и несколькими XML-файлами. Я назвал это foo-sar ниже.
  3. Создается еще один JAR, но этот JAR не содержит кода Java, а содержит только несколько XML-файлов приложения. Я назвал это foo-jar ниже.
  4. 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> моего Ear <configuration> не должен сопоставлять мои зависимости с моими модулями?


person David W.    schedule 16.01.2017    source источник
comment
Я думаю, вам также следует добавить свои модули jar в качестве зависимостей для проекта EAR, предоставления имени артефакта недостаточно.   -  person arghtype    schedule 17.01.2017
comment
Я включил модули в <dependencies> и загруженные модули, но раздел <modules> моего pom.xml игнорируется. Я не могу указать местоположение, имя, распаковать и т. д. Похоже, зависимость действует как обычная зависимость. Кажется, это не работает.   -  person David W.    schedule 17.01.2017
comment
Я нашел проблему. Я указал, что <groupId> это org.apache.plugins, а не org.apache.maven.plugins. Вы правы насчет зависимостей, но теперь у меня есть другие проблемы, как описано выше.   -  person David W.    schedule 17.01.2017


Ответы (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>
person David W.    schedule 18.01.2017