Мейвен не вдається знайти місцевий артефакт


107

Іноді maven скаржиться, що певна залежність, яка побудована та упакована локально, не може бути знайдена в локальному сховищі під час створення іншого проекту, який має її залежність. Ми отримуємо помилку типу:

Не вдалося виконати ціль для проекту X: Не вдалося вирішити залежності для проекту X: Не вдалося знайти Y в [сховищі архіву] в кешованому сховищі, роздільна здатність не буде повторена, доки не пройде внутрішній інтервал оновлення або не вимушені оновлення - >

Де X - проект, що будується, а Y - нібито відсутній артефакт. Якщо ви заглянете в місцеве сховище, артефакт є там. Цей артефакт ніколи не встановлюється в нашому сховищі архівів, тому проблема полягає лише в локальному сховищі.

Ми спробували різні профілі в settings.xml, і звичайно "mvn -U". Ні користі, ні вони не повинні робити, оскільки цей артефакт ніколи не йде далі від місцевого сховища.

Єдині дві речі, які, здається, спрацьовують - це почекати дуже довго, поки Maven не впаде, або повністю видалити локальне сховище. Імовірно, варіант очікування пов'язаний з вищезгаданим інтервалом оновлення.

Ми відчули цю проблему з Maven 3.0.2 та 3.0.3. Ми використовуємо Archiva 1.0.3 (але це знову не повинно бути фактором). Будь-яка допомога буде дуже вдячна.


1
Чи Мейвен проводить журнал що-небудь перед або "перед очікуванням"? Тобто це спроба підключитися до недоступного сховища? Також чи є проблемними артефактами "-SNAPSHOT"?
noahlz

Maven не записує нічого, крім помилки, про яку я згадував вище. І так, це залежність від знімків.
користувач1686620


1
Ви встановили пакет збірки перед тим, як спробувати створити другий проект?
khmarbaise

3
Мені подобається, як повідомлення про помилку є запущеним, а не граматично правильним реченням. Таким чином, ми точно не знаємо, чи він не може знайти Y, чи Y був кешований локально, або обидва. У всякому разі, у мене є подібна проблема. Мені вдалося вирішити це за допомогою варіанту -U, оскільки мої залежності знаходяться у внутрішній репо-моїй компанії. Чому артефакти, які вам потрібні, розміщені у внутрішньому сховищі вашої компанії?
jyoungdev

Відповіді:


77

Місцевий репон Maven відстежує, куди артефакти спочатку походили, використовуючи файл з назвою "_maven.repositories" у каталозі артефактів. Після її видалення збірка спрацювала. Ця відповідь вирішила проблему для мене.


26
Для мене це був файл з назвою "_remote.repositories". Я її зняв, і це спрацювало! Дякую за хитрощі!
perbellinio

2
Thx також був присутній файл під назвою _remote.repositories. сталося зі мною, коли наш зв’язок перестає мати мережеве з'єднання, тому він не може отримати залежності
cabaji99

1
Забезпечене рішення справді працює. Однак мене цікавить, чому ця проблема взагалі виникає. Чи міг би хтось надати мені швидке пояснення? Чи треба щось робити інакше?
Янотан

Якщо ви хочете обійти цю перевірку походження один раз (не видаляючи метафайли), спробуйте перейти aether.enhancedLocalRepository.trackingFilename=some_dummy_file_nameдо процесу вирішення залежності; Найпростіший спосіб - додати властивість системи -D до команди виклику.
Джанака Бандара

@Janothan IMO посилання у відповіді дає досить гарне пояснення :)
Janaka Bandara

40

Оскільки варіанти тут не спрацювали для мене, я ділюсь тим, як я це вирішив:

Мій проект має батьківський проект (з власним pom.xml), який має багато дитячих модулів, один з яких (A) має залежність від іншої дитини (B). Коли я спробував mvn packageв А, це не вийшло, тому що B не вдалося вирішити.

Виконання mvn install в батьківському каталозі зробило цю роботу. Після цього я міг зробити mvn packageвсередині A і лише тоді він міг знайти B.


3
СПАСИБІ! це зводило мене з розуму. mvn clean package jboss-as: розгортання працювало, коли я виконувався в одному рядку, але не тоді, коли я робив їх окремо.
PMorganCA

18

Навіть в автономному режимі maven перевірятиме віддалені сховища, чи є маркер _remote.repositories для залежності. Якщо вам потрібно працювати в автономному режимі, можливо, вам доведеться видалити ці файли.

Проста команда оболонки нижче видаляє ці файли маркерів. Це безпечно зробити, якщо ви використовуєте лише автономний режим для машини. Я б НЕ робив цього на машині, якій потрібно витягувати файли з Інтернету.

Я використовував цю стратегію на сервері збірки, відключеному від Інтернету. Ми повинні перенести в нього сховище, видалити файли з маркерами, а потім запустити в автономному режимі.

У Linux / Unix ви можете видалити файли маркерів віддаленого сховища таким чином:

cd ~/.m2
find . -name "_remote.repositories" -type f -delete

1
Це рішення працювало для мене, для залежності, яку я скопіював з іншого комп’ютера, який недоступний у центральному сховищі. Команда хоча не вистачає кількох символів. Ось повна команда: знайдіть. -name "_remote.repositories" -type -f -delete
Hans Deragon,

2
Або замість видалення ви повинні мати можливість «неправильно керувати» Maven, щоб не переглядати _remote.repositoriesфайл, переходячи -Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_nameдо процесу. (Не пробував фактичну збірку Maven, але працює, коли програмує Maven програмно; тому перший повинен також працювати)
Janaka Bandara

1
Я зробив це висновок і видалив специфічні залежності (банки), не знайдені Мейвеном, оскільки вони були перераховані та підлягали до (<10). Це було пов’язано з неправильною конфігурацією, яка вказувала на віддалений Nexus, який зараз недоступний (як я зрозумів ..). Тому фактично не потрібно підмітати всі репо для видалення. Все одно це рішення врятувало день. Це працює для мене.
Дієго1974

9

Коли це трапилося зі мною, це було тому, що я сліпо скопіював свої settings.xml з шаблону, і в ньому ще залишився порожній <localRepository/>елемент. Це означає, що не існує локального сховища, яке використовується для вирішення залежностей (хоча ваші встановлені артефакти все ще ставлять у місце розташування за замовчуванням). Коли я замінив це, <localRepository>${user.home}\.m2\repository</localRepository>він почав працювати.

Для * nix, це було б <localRepository>${user.home}/.m2/repository</localRepository>, гадаю.


6
$ {user.home} \. m2 \ сховище за замовчуванням, тому видалення порожнього тегу має працювати однаково.
Луїс Муньос

9

Мейвен пам’ятає, коли щось не знайшов. Ключове слово "роздільна здатність не буде повторена, поки не пройде внутрішній інтервал оновлення або не буде примусово оновити ->"

Швидке рішення - видалити локальний підкаталог "сховища" для артефакту проблеми - якщо припустити, що ви вирішили цю проблему. :)

mvn -U змусить оновити з віддаленого сховища - знову ж таки, припускаючи, що ви тепер заселили віддалене артефактом.


2

Лови всіх. Коли згадані тут рішення не спрацьовують (буває в моєму випадку), просто видаліть увесь вміст із папки / каталогу ".m2" і виконайте це mvn clean install.



1

Навіть я зіткнувся з цим питанням і вирішив його двома способами:

1) У вашому проекті IDE select та очистіть усі проекти, потім встановіть усі основні залежності, клацнувши правою кнопкою миші на project -> перейдіть до maven та оновіть залежність проекту, виберіть усі проекти відразу, щоб встановити один і той же. Як тільки це буде зроблено, запустіть конкретний проект

2) Else Що ви можете зробити , це перевірити в pom.xml для залежностей , для яких ви отримуєте повідомлення про помилку і «МВН чистої установки» ті залежний проект перших і встановити Maven залежності поточного проекту , в якому ви особі проблеми. Цим будуватимуться залежності місцевого проекту та створюватимуться банки.


0

Я стикаюся з подібною проблемою, коли мій новий проект залежить від банку JDBC Oracle (який я встановив у своєму локальному сховищі та добре працював для інших проектів). Я спробував -U варіант, видаливши файл .lastupdate або весь каталог та знову завантажившись, але це не спрацювало. нарешті, я видалив каталог і знову встановив його локально, він працює.


0

Однією з помилок, які я виявив навколо Maven, є те, коли я помістив файл settings.xml у неправильний каталог. Він повинен знаходитись у папці .m2 під домашнім режимом вашого користувача. Переконайтеся, що він знаходиться в потрібному місці (разом із налаштуваннями-security.xml, якщо ви використовуєте це).


0

У мене був DependencyResolutionExceptionUbuntu Linux, коли я встановлював локальні артефакти за допомогою сценарію оболонки. Рішення полягало в тому, щоб видалити локальні артефакти та встановити їх знову "вручну" - зателефонувавши mvn install:install-fileчерез термінал.


0

Це сталося тому, що я мав httpзамість httpsцього:

<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

0

перевірте, чи у вашому артефакті Y упаковка встановлена ​​на "jar". Якщо ви визначили це як "війна" помилково або скопіюйте пасту, це покаже, що це дивно "було кешоване в локальному сховищі, роздільна здатність не буде повторюватися, поки не пройде внутрішній інтервал оновлення або не будуть примусові оновлення". Я б очікував чогось типу "артефакт Y - війна, очікується тип баночки".


-1

У мене була така ж помилка з іншої причини: я створив початковий POM, який містить наші залежності від «хорошої практики», і створив і встановив його локально, щоб перевірити його. Я міг "побачити" це в репо, але проект, який його використовував, отримав вищевказану помилку. Що я зробив, було встановити стартер POM на пом, тому JAR не було. Мейвен був цілком правильний, що його не було в Nexus - але я не очікував, що це станеться, тому помилка була, гмм, не корисною. Змінення POM стартера на звичайну упаковку та перевстановлення вирішили проблему.


Ця відповідь, мабуть, була б кращою як коментар, оскільки це не є прямою відповіддю на питання.
00прометей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.