Локальные банки не включены в путь к классам (`<scope> system </scope>`) - PullRequest
5 голосов
/ 19 июля 2010

Я пытаюсь построить свое приложение, используя maven и eclipse.У меня есть зависимости от сторонних фляг, которые находятся на моей локальной машине.вот мой pom.xml

<dependency>
    <groupId>sourceforge.net</groupId>
   <artifactId>zipdiff</artifactId>
   <version>0.4</version>
   <scope>system</scope>
   <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath>
</dependency>

<dependency>
    <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.11</version>
</dependency>

, когда я запускаю mvn: install он создает файл war для моего проекта.Но проблема в том, что он не включает файл zipdiff.jar в папку web-inf / lib, он включает только загружаемые файлы.Мне нужно включить копирование файлов из моей локальной системы, но Maven игнорирует их.Я не задумывался над тем, почему это происходит, почему maven не включает файлы с системной областью в мой файл war.Пожалуйста, дайте мне любую идею, как эта проблема может быть решена.Заранее спасибо

Ответы [ 5 ]

7 голосов
/ 19 июля 2010

В области действия системы ожидается, что контейнер предоставит артефакт.Из maven docs :

при условии

Это очень похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставятзависимость во время выполнения.Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса сервлета и связанных API-интерфейсов Java EE, так как веб-контейнер предоставляет эти классы.Эта область доступна только в пути к классам компиляции и тестирования и не является транзитивной.

[...]

system

Эта область действия аналогична предоставленной, за исключением того, что вы должны предоставить JAR, который содержит ее явно.Артефакт всегда доступен и не просматривается в репозитории.

Используя системную область, вы указываете подключаемому модулю, что контейнер будет обеспечивать эту зависимость.Поскольку это не то, что вы намерены делать, самое простое решение - поместить артефакт в хранилище, либо в локальный репозиторий Maven, либо в свое собственное репозиторий Maven, если он у вас есть.

install: install-file цель может быть использована для установки одного файла (без POM) в ваш локальный репозиторий.После этого измените тип зависимости на «compile» и удалите элемент «systemPath».

В моей повседневной работе мы используем Nexus для управления репозиторием всей компании в нашей интрасети.,Вы можете иметь отдельные репозитории для своих собственных артефактов против сторонних артефактов.Nexus также действует как прокси, кэшируя артефакты из внешних репозиториев, что значительно ускоряет сборку.Это означает, что только разработчик, который использует новую зависимость, которая недоступна в других репозиториях, должен загружать - после этого все остальные разработчики могут использовать ее - они могут извлекать из SCM и строить, не беспокоясь о том, где находятся зависимости.

6 голосов
/ 19 июля 2010

У меня нет мысли о том, почему это происходит, почему maven не включает файлы с системным охватом в мой war-файл. Пожалуйста, дайте мне любую идею, как эта проблема может быть решена.

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

На самом деле, я много раз писал ( здесь , здесь , здесь и здесь ), что system зависимые области необходимо избегать. В большинстве случаев это плохая практика, люди злоупотребляют ими, и они почти всегда приносят больше неприятностей, чем выгод.

Позвольте мне процитировать миниатюр Dependency Scopes , если вы хотите "официальную" точку зрения:

  • system: эта зависимость требуется на некотором этапе жизненного цикла вашего проекта, но зависит от системы. Использование этой области не рекомендуется: эта функция считается «продвинутой» и должна использоваться только в том случае, если вы действительно понимаете все последствия ее использования, что может быть чрезвычайно трудно, если вообще невозможно определить количественно. * Эта область по определению делает вашу сборку непереносимой. Это может быть необходимо в определенных крайних случаях. В системную область входит элемент <systemPath>, который указывает на физическое расположение этой зависимости на локальном компьютере. Таким образом, он используется для ссылки на некоторый артефакт, который, как ожидается, будет присутствовать на данном локальном компьютере, а не в репозитории; и чей путь может варьироваться от машины к машине. Элемент systemPath может ссылаться на переменные среды в своем пути: например, ${JAVA_HOME}.

Итак, вместо использования области system, либо:

  • Добавьте свои библиотеки в локальный репозиторий через install:install-file. Это быстрый и грязный способ заставить все работать, это может быть вариант, если вы один, но это делает вашу сборку непереносимой.
  • Установите и запустите «корпоративный репозиторий», такой как Nexus, Archiva или Artifactory, и добавьте свои библиотеки через deploy:deploy-file. Это идеальный сценарий.
  • Настройте файловый репозиторий, как описано в этого предыдущего ответа , и поместите туда свои библиотеки. Это лучший компромисс, если у вас нет корпоративного хранилища, но вам нужно работать в команде и не хотите жертвовать переносимостью.

Пожалуйста, прекратите использовать область system.

1 голос
/ 19 июля 2010

Попробуйте установить файлы jar в ваш локальный репозиторий . Когда во время сборки не должно быть разницы между вашими локальными банками и банками в больших репозиториях.

0 голосов
/ 19 июля 2010

Если вы еще не пробовали этот вариант, чтобы он не работал, можете ли вы изменить область для компиляции?

<dependency>
   <groupId>sourceforge.net</groupId>
   <artifactId>zipdiff</artifactId>
   <version>0.4</version>
   <scope>compile</scope>
   <systemPath>C:/gelcap/lib/zipdiff-0.4.jar</systemPath>
</dependency>
0 голосов
/ 19 июля 2010

Просто одна вещь, которая бросается в глаза: в пути вы используете обычные слэши в стиле Unix /.Windows использует обратную косую черту для путей:Я не знаю, может ли maven конвертировать их друг в друга, поэтому, возможно, попробуйте ввести путь следующим образом:

C: \ gelcap \ lib \ zipdiff-0.4.jar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...