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