Веб-приложение Maven с maven-eclipse-plugin не генерирует ‹dependent-module›

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

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

записи пути к классам, сгенерированные eclipse:eclipse целью, не имеют такой папки экспорта.

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

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

Окружающая среда

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


person Christopher Klewes    schedule 26.04.2010    source источник
comment
Вы уверены, что maven-eclipse-plugin правильно настроен в проекте, в котором вы запускаете eclipse:eclipse? Почему вы получаете project-version="1.5.0"? Это странно, это не отражает конфигурацию.   -  person Pascal Thivent    schedule 27.04.2010
comment
Это именно то, что я наклеил, очень странно. Я могу удалить eclipse файлы и снова запустить eclipse:eclipse, результат будет тот же.   -  person Christopher Klewes    schedule 27.04.2010
comment
Я не могу воспроизвести проблему. Можешь выложить весь свой пом? (возможно, на pastie.org, если он слишком большой).   -  person Pascal Thivent    schedule 27.04.2010
comment
Я начал небольшой примерный проект с maven mvn archetype ... webapp и вставил свой maven-eclipse-plugin блок, он работает, как ожидалось, и генерирует <dependent-module>. Кажется, что конфигурация, которую я сделал, мешает такому поведению. Я бы предоставил весь пом за несколько минут (просто сделайте его анонимным).   -  person Christopher Klewes    schedule 27.04.2010


Ответы (2)


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

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

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

person Pascal Thivent    schedule 26.04.2010
comment
Спасибо за ваш ответ, это помогает мне оправдать ожидания. Но я скорректировал свой вопрос, к сожалению, я не понимаю этого <depdendent-module>, может быть, что-то еще не так? - person Christopher Klewes; 27.04.2010
comment
Я добавил пример своего проекта в дополнительный ответ, просто чтобы уведомить вас. - person Christopher Klewes; 27.04.2010
comment
Да, мы обнаружили проблему. Когда я изменил jar на war, он генерирует <dependent-module>. На мой взгляд, это не реализовано последовательно, почему maven-eclipse-plugin заботится об определении упаковки? ... Ой, это так плохо, потому что мне нужны возможности webapp и war-packaging, но мой артефакт должен быть jar. К сожалению, у меня нет идей ... у вас есть еще один? :) - person Christopher Klewes; 27.04.2010
comment
@chrsk maven-eclipse-plugin полностью соответствует тому, как работает Maven: ожидается, что WAR будет упакован как war, иначе вы просто не получите правильные привязки жизненного цикла для войны. Другими словами, война - это война, банка - это банка. Ваш случай как-то очень особенный (баночка, которая разрастается в войну) и не принимается Maven. Разве вы не можете использовать войну и использовать archiveClasses < / a> необязательный параметр для создания фреймворка? - person Pascal Thivent; 27.04.2010
comment
У нас очень основанный на модели подход, при котором модель будет сгенерирована в представлениях, процессах и т. Д., И это факт, который мы не можем изменить. Но почему тогда maven-eclipse-plugin что-то генерирует? но это другой вопрос. Если у вас есть подсказка для меня, дайте мне знать. Большое спасибо за вашу работу и посты до сих пор, вы помогли мне прояснить ситуацию. - person Christopher Klewes; 27.04.2010
comment
archiveClasses, к сожалению, не работает для меня, потому что у меня два разных жизненных цикла, соответственно, как вы указали, война есть война, а банка есть банка. Это приводит к ситуациям, когда во время разработки мне нужен полностью совместимый с wtp проект, который я могу легко запустить и разрабатывать, а во время разработки - артефакт, упакованный как jar. Если я использую archiveClasses, у меня будет артефакт войны с инкапсулированными классами, что ни к чему не приведет. - person Christopher Klewes; 27.04.2010
comment
@chrsk Понятно. Тогда, боюсь, вам придется исправить плагин maven eclipse или настроить упаковку на войну, сгенерировать файлы eclipse, вернуться к jar. - person Pascal Thivent; 27.04.2010
comment
@Pascal Хорошо, просто чтобы вы знали: мы скомпрометировали и поддерживаем два способа работы с нашим проектом: а) установить пакет на jar, развернуть в mvn-repo, вернуться. б) с помощью maven-dependency-plugin и скопируйте библиотеки в WEB-INF/lib, чтобы их можно было скопировать с помощью wtp и не нужно было настраивать их как dependent-modules (недостаток: нет удобных источников, интеграция с javadoc | преимущество: отсутствие maven в будущем - ›проблемы с версией wtp (поколение из .component) это можно настроить как профиль. Еще раз спасибо за вашу помощь, я дал вам несколько голосов! - person Christopher Klewes; 27.04.2010
comment
Не могли бы вы удалить название проекта в deploy-name и context-root. Я опубликовал его случайно, я не хочу удалять этот вопрос для будущих читателей. Заранее спасибо. - person Christopher Klewes; 05.05.2010

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

Я удалил ~ 60 зависимостей из исходного pom.xml, кроме этого ничего не изменилось. Вам просто нужно создать webapp-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, который используется для обеспечения возможностей фреймворка, при запуске он расширяется в структуру веб-приложений (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
   }
}
person Christopher Klewes    schedule 27.04.2010
comment
О, вы удалили свой комментарий, в любом случае я добавил объяснение для packaging jar. - person Christopher Klewes; 27.04.2010
comment
Да, я удалил его, потому что думал, что вы ожидаете, что я вставлю содержимое вашего помпа в военный проект. Но теперь, перечитав ваш вопрос, я думаю, что мы нашли проблему: я не думаю, что плагин eclipse будет генерировать динамический веб-модуль для проекта с упаковкой типа jar. Если вы измените его на war, он должен вести себя должным образом. - person Pascal Thivent; 27.04.2010