Зависимость от Maven WAR - невозможно решить пакет?

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

    <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, похоже, вообще не работает.

Есть ли что-то особенное в этой военной зависимости?

Ответ 1

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

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

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

Ответ 2

Как указывалось в других ответах:

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

Источник: Часто задаваемые вопросы о подключении Maven War

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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