2009-12-08 8 views
8

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

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

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

ответ

17

Все, что сказать: есть ли простой способ построить ВОЙН и пакет, который входит в этот тривиально простой 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-плагин, просто анти DRY. В таком случае вам лучше придерживаться Мура.

+1

+1 - не сражайтесь с maven –

+0

Для чего это стоит, я не выступал за то, чтобы взломать подход/сражаться с Maven, я просто почувствовал, что не существует другого выхода, кроме создания нескольких проектов/модулей. Я только задал вопрос о SO, чтобы подтвердить, что на самом деле нет чистого способа выполнить это в рамках одного проекта. Таким образом, я планирую пойти с макетом, который вы описали выше. –

2

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

Это выдержка из примеров интерфейсов 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> 

в ушных профилях использования П импортировать требуемую зависимость с соответствующим классификатором.

<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> 
2

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

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

Затем написать свой собственный application.xml (в ИПВ/основной/приложение или где), используя заполнитель для имени файла 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-приложение .xml и т. д.) в том же месте.

Далее добавьте раздел ресурсов, чтобы заменить пустышку с именем файла WAR:

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

Наконец, добавьте муравей задачу уха к построенному ухо:

<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> 

И это все.

 Смежные вопросы

  • Нет связанных вопросов^_^