Maven WAR dependency-не удается разрешить пакет?

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

    <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 ответов


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

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

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


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

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

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

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

тогда при построении военного проекта Maven создаст войну и банку из него.

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

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


зависимости войны обрабатываются очень по-разному Maven от зависимостей JAR. Они рассматриваются как наложения.

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

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

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

http://cargo.codehaus.org/Merging + война + файлы

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

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


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

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


убедитесь, что зависимость установлена в локальном репозитории.
Местное РЕПО должно выглядеть так:

.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