Веб-приложение Maven с плагином maven-eclipse не создает <зависимый модуль> - PullRequest
9 голосов
/ 26 апреля 2010

Я использую цель eclipse:eclipse для создания среды проекта Eclipse. Развертывание работает отлично. Цель создает записи пути к классам var для всех необходимых зависимостей.

С m2eclipse был контейнер Maven, который определяет папку экспорта, которая была WEB-INF/lib для меня. Но я не хочу полагаться на m2eclipse, поэтому я больше им не пользуюсь.

записи пути к классам, которые создаются eclipse:eclipse goal, не имеют такой папки экспорта.

При загрузке контейнера сервлета с WTP он публикует все ресурсы и классы, кроме библиотек, в контекст.

Чего не хватает для публикации необходимых библиотек или это невозможно без интеграции с m2eclipse?

Enviroment

  • Eclipse 3.5 Java EE Galileo
  • Apache Maven 2.2.1 (r801777; 2009-08-06 21: 16: 01 + 0200)
  • Java-версия: 1.6.0_14
  • m2eclipse

Конфигурация maven-eclipse-plugin

    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-eclipse-plugin</artifactId>
     <version>2.8</version>
     <configuration>
      <projectNameTemplate>someproject-[artifactId]</projectNameTemplate>
      <useProjectReferences>false</useProjectReferences>
      <downloadSources>false</downloadSources>
      <downloadJavadocs>false</downloadJavadocs>

      <wtpmanifest>true</wtpmanifest>
      <wtpversion>2.0</wtpversion>
      <wtpapplicationxml>true</wtpapplicationxml>
      <wtpContextName>someproject-[artifactId]</wtpContextName>

      <additionalProjectFacets>
        <jst.web>2.3</jst.web>
      </additionalProjectFacets>
     </configuration>
    </plugin>

Сгенерированные файлы

После выполнения цели eclipse:eclipse зависимый модуль не указан в моем сгенерированном .settings/org.eclipse.wst.common.component, поэтому при загрузке сервера я пропускаю зависимости.

Вот что я получаю:

<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
  <wb-module deploy-name="someproject-core">
    <wb-resource deploy-path="/" source-path="src/main/java"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <wb-resource deploy-path="/" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Обновление для будущих читателей

Проблема здесь была в девиантном packaging -типе, если вы используете maven-eclipse-plugin, пожалуйста, подтвердите использование <packaging>war</packaging> или ear.

Следующие проблемы отмечены в ситуациях, когда у меня есть два жизненных цикла сборки в одном maven pom.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2010

Чего не хватает для публикации необходимых библиотек или это невозможно без интеграции с m2eclipse?

Я не уверен, что понимаю проблему. Я использовал maven-eclipse-plugin с maven webapps в течение долгого времени с успехом. Итак, работает ли развертывание на сервере или нет? Можно ли использовать приложение или нет? Вы можете уточнить?

На всякий случай я провел быструю проверку недавно созданного веб-приложения с настройкой вашего плагина, которая выглядит нормально. Я просто удалил фасет jst.java и настроил maven-compiler-plugin вместо:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <target>1.5</target>
    <source>1.5</source>
  </configuration>
</plugin>

И я добавил зависимость от log4j. Затем, когда я запускаю mvn eclipse:eclipse, это то, что я получаю в сгенерированном .settings/org.eclipse.wst.common.component:

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-Q2713648">
    <property name="context-root" value="example-mvn-[artifactId]"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <property name="java-output-path" value="/target/classes"/>
    <dependent-module archiveName="log4j-1.2.14.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar">
      <dependency-type>uses</dependency-type>
    </dependent-module>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Зависимость log4j существует и публикуется. Что я пропустил?


Обновление: Я вставил предоставленный pom в свой проект war, изменил его на использование версии 2.8 плагина eclipse и удалил src/main/webapp из элемента resources (это не ресурс ) и вот что я получаю при запуске mvn eclipse:eclipse:

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-Q2713648">
    <property name="context-root" value="example-mvn-[artifactId]"/>
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <property name="java-output-path" value="/target/classes"/>
    <dependent-module archiveName="hsqldb-1.8.0.10.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar">
      <dependency-type>uses</dependency-type>
    </dependent-module>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Хорошо выглядит для меня.

Обновление 2: Как я уже писал в комментарии к вашему собственному ответу, я не думаю, что плагин eclipse сгенерирует динамический веб-модуль для проекта с упаковкой типа jar. Если вы поменяете упаковку war, она должна вести себя как положено. Я почти уверен, что это причина твоих неприятностей.

0 голосов
/ 27 апреля 2010

Пример pom (на pastie.org)

Я удалил ~ 60 зависимостей от оригинала pom.xml, кроме этого ничего не изменилось. Вам просто нужно создать webapp-archetype и вставить pom в сгенерированный (командой archetype)

mvn archetype:create 
     -DgroupId=example 
     -DartifactId=mvn 
     -DarchetypeArtifactId=maven-archetype-webapp

После этого eclipse:eclipse приводит к сгенерированному .settings/org.eclipse.wst.common.component, который теперь показывает project-version="2.0" (после того, как я сделал различные изменения от 1.0 до 1.5 и 2.0), но все же <dependent-module> отсутствует.

<project-modules id="moduleCoreId" project-version="2.0">
  <wb-module deploy-name="example-mvn-mvn">
    <wb-resource deploy-path="/" source-path="src/main/webapp"/>
    <wb-resource deploy-path="/" source-path="src/main/resources"/>
  </wb-module>
</project-modules>

Обновление (@ Pascal Thivent) : Это хороший момент. Наш проект (веб-фреймворк) имеет две смешанные функции. Существует jar-packaging, который используется для обеспечения возможностей фреймворка, при этом он расширяется в структуру webapp (WEB-INF/...)

Но также должна быть возможность запускать фреймворк с его расширениями на самом контейнере сервлета, чтобы мы могли разработать базовую функциональность, не упаковывая ее как jar, и использовать ее с собственным проектом. Так что jar здесь правильно.


Обновление 2

Исходный код (EclipseWtpComponentWriter) из maven-eclipse-plugin показывает, что это жестко закодировано, и нет способа выполнить предложение then, кроме как для packaging установить war или я что то пропустил? (

private void writeModuleTypeComponent( XMLWriter writer, String packaging,
                 File buildOutputDirectory, EclipseSourceDir[] sourceDirs, 
                 ArtifactRepository localRepository)
{
   if ( Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ))
   { 
       // Adding the <dependent-modules> stuff
   }
}
...