В Maven2, каков самый простой способ создать WAR и EAR, чтобы вместить эту ВОЙНУ в один POM?

StackOverflow https://stackoverflow.com/questions/1870149

Вопрос

Ситуация довольно проста.У меня есть веб-приложение Java, которое я конвертирую для сборки с помощью Maven.В настоящее время приложение встроено с помощью Ant в один файл WAR, который затем передается в EAR с помощью очень простого application.xml.

maven-war-plugin и maven-ear-plugin оба варианта кажутся мне довольно простыми, и, похоже, они заставляют меня рассматривать вышеперечисленное как два разных проекта, причем проект WAR зависит от проекта EAR.Это кажется немного неудобным, особенно потому, что настройка профиля проекта WAR будет меняться для каждой среды, что, похоже, вынудило бы меня дублировать эту настройку сборки каждый раз, когда я пытался создать EAR.

Все это, чтобы сказать:есть ли простой способ построить ВОЙНУ и упаковать это в это тривиально простое УХО?Я бы хотел избежать сохранения их как двух отдельных проектов, но точно так же предпочел бы не прибегать к чрезмерно грязному взлому с использованием сборок для достижения этой цели.

Это было полезно?

Решение

Все это, чтобы сказать:есть ли простой способ построить ВОЙНУ и упаковать это в это тривиально простое УХО?Я бы хотел избежать сохранения их как двух отдельных проектов, но точно так же предпочел бы не прибегать к чрезмерно грязному взлому с использованием сборок для достижения этой цели.

Короткий ответ: НЕТ, простого maven-способа сделать это не существует, поскольку это противоречило бы правилу Maven, которое гласит "один артефакт на проект" (понимайте один результат на проект, что верно в 99% случаев).

И на самом деле, я бы настоятельно рекомендовал не идите по хитрому пути и забудьте об использовании сборок для создания EAR.Вместо этого создайте два модуля, один с упаковкой типа war, другой с упаковкой типа ear в зависимости от артефакта войны и объявляйте их как модули родительского pom.xml.Вот так:

my-project
|-- pom.xml       // packaging of type pom and my-war and my-ear as modules
|-- my-war
|   `-- pom.xml   // packaging of type war
`-- my-ear
    `-- pom.xml   // packaging of type ear

Если вы выберете Maven, примите философию Maven, не боритесь с ней, это избавит вас от многих страданий.Серьезно, взлом сборок для выполнения того, что уже делает maven-ear-plugin, - это просто anti DRY.В таком случае вам лучше придерживаться Ant.

Другие советы

Я знаю, что этому письму уже 5 лет, но это все равно был первый ответ, который появился при поиске.Кроме того, хотя "это не способ maven" является вполне разумным ответом для некоторых людей, другие все еще могут предпочесть использовать один pom, как просил OP, и это действительно не так сложно.

Сначала создайте стандартный war pom.xml чтобы сгенерировать файл war, который вы хотите включить в ear.Оставьте упаковку в качестве военной.

Затем напишите свой собственный application.xml (в src / main / application или где угодно), используя заполнитель для имени файла war:

<application xmlns="http://java.sun.com/xml/ns/javaee" ... >
  <module>
    <web>
      <web-uri>${project.build.finalName}.war</web-uri>
      <context-root>myapp</context-root>
    </web>
  </module>
</application>

И включите любые другие зависящие от сервера XML-файлы (weblogic-application.xml и т.д.) в том же расположении.

Затем добавьте раздел ресурсов, чтобы заменить заполнитель именем файла war:

<resources>
  <resource>
    <directory>src/main/application</directory>
    <filtering>true</filtering>
    <includes>
      <include>META-INF/*.xml</include>
    </includes>
  </resource>
</resources>

Наконец, добавьте задачу ant ear для создания ear:

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <tasks>
          <ear destfile="${project.build.directory}/${project.build.finalName}.ear"
               appxml="${project.build.outputDirectory}/META-INF/application.xml">
            <fileset dir="${project.build.outputDirectory}" includes="META-INF/*.xml"/>
            <fileset dir="${project.build.directory}" includes="${project.build.finalName}.war"/>
          </ear>
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

И это все.

В Maven каждый отдельный проект создает aritifact.В вашей ситуации я предлагаю создать два проекта, один для war и один для ear.Если вам нужно несколько версий ваших проектов, вы можете достичь этого с помощью классификаторов и профилей.

Это выдержка из книги richfaces examples pom.

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <executions>
          <execution>
            <id>jee5</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-jee5</webappDirectory>
              <classifier>jee5</classifier>
              <packagingExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/jsf-api*,WEB-INF/lib/jsf-impl*,WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
          <execution>
            <id>tomcat6</id>
            <phase>package</phase>
            <goals>
              <goal>war</goal>
            </goals>
            <configuration>
              <webappDirectory>${project.build.directory}/${project.build.finalName}-tomcat6</webappDirectory>
              <classifier>tomcat6</classifier>
              <packagingExcludes>WEB-INF/lib/el-*</packagingExcludes>
              <warSourceExcludes>WEB-INF/lib/el-*</warSourceExcludes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/java</directory>
              <targetPath>/WEB-INF/src</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

В вашем ear pom используйте профили для импорта требуемой зависимости с соответствующим классификатором.

<profile>
  <id>jee5</id>
  <dependencies>
     <dependency>
       <groupId>org.richfaces.samples</groupId>
       <artifactId>richfaces-demo</artifactId>
       <version>${richfaces-version}</version>
       <classifier>jee5</classifier>
       <type>war</type>
       <scope>runtime</scope>
     </dependency>
  </dependencies>
</profile>   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top