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


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.