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

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


person Stefan Kendall    schedule 08.04.2011    source источник
comment
Работает ли при сборке из командной строки? (например, mvn install?)   -  person Emil Sit    schedule 08.04.2011
comment
понял, что, возможно, я пошел вразрез. Я думаю, что @seanpatrickfloyd прав. Если вы хотите использовать военный файл в качестве зависимости, я попробую использовать плагин сборки maven, чтобы посмотреть, поможет ли это. Еще раз извините за недостаточное исследование ответа.   -  person uncaught_exceptions    schedule 08.04.2011
comment
Вы это проверяли? maven.apache.org/plugins/ maven-war-plugin / faq.html # прилагается   -  person uncaught_exceptions    schedule 08.04.2011
comment
Если я использую плагин warpath, я могу выполнить сборку из командной строки, но IntelliJ по-прежнему не видит файлы классов.   -  person Stefan Kendall    schedule 08.04.2011
comment
@ doc_180: Хороший намек, именно то, что я искал. Я взял на себя смелость преобразовать это в ответ.   -  person sleske    schedule 26.03.2013


Ответы (5)


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

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

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

person Sean Patrick Floyd    schedule 08.04.2011
comment
Я использую плагин grails maven-install, который, к сожалению, только создает войны. Мне действительно не нужна полная война, и я бы предпочел банку. - person Stefan Kendall; 08.04.2011

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

  • В 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, поэтому его нельзя упускать из виду.

person sleske    schedule 26.03.2013
comment
Если вы используете <attachClasses>, вам также необходимо добавить <classifier>classes</classifier> в объявление зависимости, где вы ссылаетесь на jar. - person mazi; 24.02.2015
comment
Спасибо. Это помогло мне помочь коллеге и принесло мне пару бутылок пива. - person Gunslinger; 22.02.2016

Зависимости 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), иначе вы сойдете с ума, имея дело с этим. ;)

person Will Iverson    schedule 08.04.2011
comment
Я уже пользуюсь Nexus. Мне действительно нужна просто модель класса, но модель класса берется из приложения grails. Плагин grails maven, к сожалению, только подталкивает войны, и я бы предпочел не пытаться выполнить несколько неуклюжих шагов create-jar, а затем вручную-install-jar как часть процесса сборки. - person Stefan Kendall; 08.04.2011
comment
Ах. Да, это все еще новый артефакт - будет ОЧЕНЬ сложно заставить его работать с зависимостями WAR. Можно попробовать gant просто открыть WAR, вырвать все, что вам нужно, и перепаковать то, что вам нужно, в виде JAR. - person Will Iverson; 08.04.2011

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

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

person Ralph    schedule 08.04.2011

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

.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
person Arpit    schedule 08.04.2011