Зависимость Maven WAR - не удается разрешить пакет? - PullRequest
16 голосов
/ 08 апреля 2011

У меня есть зависимость от войны:

    <dependency>
        <groupId>my.package</groupId>
        <artifactId>myservices</artifactId>
        <version>0.3</version>
        <type>war</type>
    </dependency>

Теперь это существует в моем локальном хранилище, и класс существует в WEB-INF/classes/my/package/myservices.Однако, когда я использую myservices, я получаю, что пакет my.package не существует.Intelli-J знает, как изменить myservices на my.package.myservices, но попытка import, похоже, не работает вообще.

Что-то особенное, что мне нужно сделать с этой военной зависимостью?

Ответы [ 5 ]

32 голосов
/ 08 апреля 2011

Так просто не работает. Файлы war не должны помещаться в путь к классам, а должны быть развернуты на серверах приложений (или контейнерах сервлетов), которые могут иметь дело с их специальной структурой.

Конечно, вы можете где-то найти пользовательский загрузчик классов, который может работать с файлами Java-войны, но это просто не тот способ.

Храните свой код в банке, включите банку в вашу войну и в это приложение. Но не используйте войну как зависимость, если только вы не строите файл EAR.

26 голосов
/ 26 марта 2013

Как указано в других ответах:

  • В Maven нельзя просто загружать классы из артефакта WAR так, как вы можете из артефакта JAR.
  • Поэтому рекомендуется разделить отдельный проект Maven JAR с классами, которые вы хотите использовать повторно, и зависеть от этого проекта как в исходном WAR, так и в новом проекте.

Однако, если по какой-то причине вы не можете / не хотите разделять проект WAR, вы также можете сказать Maven, что вам нужен артефакт JAR в дополнение к WAR. Поместите это в POM вашего WAR проекта:

<build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
    </plugins>
  </build>

Затем при сборке проекта WAR Maven создаст WAR и JAR из него.

Источник: FAQ по плагину Maven War

Адаптировано из комментария doc_180, поэтому оно не упускается из виду.

3 голосов
/ 08 апреля 2011

Зависимости WAR обрабатываются Maven ОЧЕНЬ по-разному в зависимости от JAR.Они рассматриваются как наложения.

http://maven.apache.org/plugins/maven-war-plugin/overlays.html

Я думаю, что вы ищете, что-то немного отличается от наложения WAR.Наложения WAR объединяют файловые структуры с моделью «ближайших побед», но это означает, что такие вещи, как web.xml, заменяются ближайшими победами, а не объединяются.

Если вы хотите объединить (что ближе к тому, что большинство людей)подумайте, когда они начнут говорить о зависимостях WAR), вам стоит взглянуть на плагин Cargo uberwar.

http://cargo.codehaus.org/Merging+WAR+files

Если ваша цель - просто разделить некоторые классы между двумя WAR, вам, вероятно, следуетпросто поместите эти классы в проект JAR.В частности, Maven действительно предназначен для работы с pom.xml -> моделью с одним артефактом (JAR / WAR / и т. Д.).Попытка взять один файл pom.xml и заставить его выдавать, скажем, JAR для некоторых вещей и WAR для других, будет очень болезненной.

Кстати, если вы работаете в команде, которая превышаетодин человек, вам понадобится довольно быстро сервер управления артефактами (например, Artifactory, Nexus или Archiva), или вы сойдете с ума, разбираясь с этими вещами.;)

2 голосов
/ 08 апреля 2011

В WAR классы должны быть расположены на WEB-INF/classes/..., а не на classes/....

Во всяком случае, я никогда не пытался ссылаться на другие классы из WAR (не JAR), и я не знаю, возможно ли это.

0 голосов
/ 08 апреля 2011

Убедитесь, что зависимость установлена ​​в вашем локальном репозитории.
Локальное хранилище должно выглядеть следующим образом:

.m2/my/package/myservices/0.3/myservices-0.3.war

Если это не так, то установите war в локальный репозиторий перед использованиемэто в зависимости:

mvn install:install-file -Dfile="[path-to-war]"  -DgroupId=my.package  -DartifactId=myservices -Dversion=0.3 -Dpackaging=war -DcreateChecksum=true -DgeneratePom=true
...