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

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

  1. Существует основная банка и множество фильтров, которые зависят от основной банки.
  2. Эти банки собраны в SAR наряду с другими зависимыми банками и несколькими файлами 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> часть моего уха <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>
Другие вопросы по тегам