Maven ไม่พบสิ่งประดิษฐ์ในท้องถิ่น


107

ในบางครั้ง maven บ่นว่าการพึ่งพาเฉพาะซึ่งสร้างและบรรจุในเครื่องไม่พบในที่เก็บโลคัลในขณะที่สร้างโปรเจ็กต์อื่นที่มีการอ้างอิง เราได้รับข้อผิดพลาดเช่น:

ล้มเหลวในการดำเนินการเป้าหมายในโปรเจ็กต์ X: ไม่สามารถแก้ไขการอ้างอิงสำหรับโปรเจ็กต์ X: ความล้มเหลวในการค้นหา Y ใน [ที่เก็บ archiva] ถูกแคชไว้ในที่เก็บโลคัลความละเอียดจะไม่ถูกพยายามอีกครั้งจนกว่าช่วงเวลาการอัพเดตของภายในจะผ่านไปหรือบังคับให้อัพเดต - >

โดยที่ X กำลังสร้างโปรเจ็กต์และ Y คือสิ่งประดิษฐ์ที่ขาดหายไป หากคุณดูในพื้นที่เก็บข้อมูลภายในเครื่องจะมีสิ่งประดิษฐ์อยู่ที่นั่น ไม่เคยติดตั้งสิ่งประดิษฐ์นี้ในที่เก็บ archiva ของเราดังนั้นปัญหาจึงขึ้นอยู่กับที่เก็บในเครื่องเท่านั้น

เราได้ลองใช้โปรไฟล์ต่างๆใน settings.xml และแน่นอน "mvn -U" ไม่ทำประโยชน์ใด ๆ หรือไม่ควรเพราะสิ่งประดิษฐ์นี้ไม่เคยไปไกลกว่าที่เก็บในเครื่อง

มีเพียงสองสิ่งที่ดูเหมือนจะใช้งานได้คือต้องรอเป็นเวลานานจนกว่า maven จะฉลาดขึ้นหรือจะลบที่เก็บในเครื่องทั้งหมด สันนิษฐานว่าตัวเลือกการรอนั้นเกี่ยวข้องกับช่วงเวลาการอัพเดตดังกล่าวข้างต้น

เราประสบปัญหานี้กับ maven 3.0.2 และ 3.0.3 เรากำลังใช้ Archiva 1.0.3 (แต่อีกครั้งไม่ควรเป็นปัจจัย) ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.


1
Maven กำลังบันทึกอะไรในขณะที่หรือก่อนหน้า "กำลังรอ" หรือไม่? นั่นคือพยายามเชื่อมต่อกับที่เก็บที่ไม่สามารถเข้าถึงได้หรือไม่? นอกจากนี้ Artifacts "-SNAPSHOT" ที่เป็นปัญหาหรือไม่
noahlz

Maven ไม่บันทึกสิ่งอื่นใดนอกจากข้อผิดพลาดที่ฉันกล่าวไว้ข้างต้น และใช่นี่คือการพึ่งพาสแนปชอต
user1686620


1
คุณได้ติดตั้งแพ็คเกจการสร้างก่อนที่จะพยายามสร้างโครงการที่สองหรือไม่?
khmarbaise

3
ฉันชอบวิธีที่ข้อความแสดงข้อผิดพลาดเป็นประโยคที่ไม่ถูกต้องตามหลักไวยากรณ์ วิธีนี้เราไม่ทราบแน่ชัดว่าไม่พบ Y หรือ Y ถูกแคชไว้ในเครื่องหรือทั้งสองอย่าง อย่างไรก็ตามฉันมีปัญหาที่คล้ายกัน ผมสามารถที่จะแก้ปัญหาได้ด้วยตัวเลือก -U เพราะการอ้างอิงของฉันอยู่ใน repo ภายในของ บริษัท เหตุใดสิ่งประดิษฐ์ที่คุณต้องการจึงไม่ถูกปรับใช้กับที่เก็บข้อมูลภายในของ บริษัท ของคุณ
jyoungdev

คำตอบ:


78

Maven repo ในเครื่องจะติดตามโดยที่สิ่งประดิษฐ์มาจากการใช้ไฟล์ชื่อ "_maven.repositories" ในไดเร็กทอรี Artifact หลังจากถอดออกแล้วงานสร้างก็ใช้งานได้ คำตอบนี้ช่วยแก้ปัญหาให้ฉันได้


26
สำหรับฉันมันคือไฟล์ชื่อ "_remote.repositories" ฉันลบมันออกและใช้งานได้! ขอบคุณสำหรับเคล็ดลับ!
perbellinio

2
มีไฟล์ชื่อ _remote.repositories อยู่ด้วย มันเกิดขึ้นกับฉันเมื่อ nexus ของเราหยุดการเชื่อมต่อเครือข่ายจึงไม่สามารถรับการอ้างอิงได้
cabaji99

1
โซลูชันที่ให้มาใช้งานได้ อย่างไรก็ตามฉันสนใจว่าทำไมจึงเกิดปัญหานี้ขึ้น ใครช่วยให้คำอธิบายอย่างรวดเร็วได้ไหม ฉันต้องทำอะไรที่แตกต่างออกไปหรือไม่?
Janothan

หากคุณต้องการข้ามการตรวจสอบจุดเริ่มต้นนี้หนึ่งครั้ง (โดยไม่ต้องลบเมตาไฟล์) ให้ลองส่งผ่านaether.enhancedLocalRepository.trackingFilename=some_dummy_file_nameไปยังกระบวนการแก้ไขการอ้างอิง วิธีที่ง่ายที่สุดคือเพิ่มคุณสมบัติระบบ -D ให้กับคำสั่งเรียกใช้
Janaka Bandara

@Janothan IMO ลิงค์ในคำตอบให้คำอธิบายที่ดีทีเดียว :)
Janaka Bandara

40

เนื่องจากตัวเลือกที่นี่ใช้ไม่ได้ผลสำหรับฉันฉันจึงแบ่งปันวิธีแก้ไข:

โปรเจ็กต์ของฉันมีโปรเจ็กต์พาเรนต์ (ที่มี pom.xml ของตัวเอง) ที่มีโมดูลลูกจำนวนมากซึ่งหนึ่งในนั้น (A) มีการพึ่งพากับลูกอื่น (B) เมื่อลองmvn packageใน A ก็ไม่ได้ผลเพราะ B ไม่สามารถแก้ไขได้

การดำเนินการmvn install ในไดเร็กทอรีหลักได้ผล หลังจากนั้นฉันสามารถทำได้mvn packageภายใน A และจากนั้นก็พบ B


3
ขอบคุณ! มันทำให้ฉันบ้า mvn clean package jboss-as: deploy ใช้งานได้เมื่อฉันดำเนินการบนบรรทัดเดียว แต่ไม่ใช่เมื่อฉันแยกต่างหาก
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
ฉันทำการค้นหาและลบการอ้างอิงเฉพาะ (ไห) ที่ Maven ไม่พบเนื่องจากมีการระบุไว้และสามารถจัดการได้ถึง (<10) สาเหตุนี้เกิดจากการกำหนดค่าผิดที่ชี้ไปยัง Nexus ระยะไกลที่ไม่สามารถใช้งานได้ในขณะนี้ (ตามที่ฉันเข้าใจ .. ) ดังนั้นจึงไม่จำเป็นต้องกวาด repo ทั้งหมดเพื่อลบ อย่างไรก็ตามวิธีนี้ช่วยประหยัดทั้งวัน มันได้ผลสำหรับฉัน
Diego1974

9

เมื่อสิ่งนี้เกิดขึ้นกับฉันมันเป็นเพราะฉันคัดลอก settings.xml ของฉันแบบสุ่มสี่สุ่มห้าจากเทมเพลตและยังมี<localRepository/>องค์ประกอบว่างอยู่ ซึ่งหมายความว่าไม่มีที่เก็บในเครื่องที่ใช้ในการแก้ไขการอ้างอิง (แม้ว่าสิ่งประดิษฐ์ที่คุณติดตั้งไว้จะยังคงอยู่ในตำแหน่งเริ่มต้น) เมื่อฉันเปลี่ยน<localRepository>${user.home}\.m2\repository</localRepository>มันเริ่มทำงาน

สำหรับ * nix <localRepository>${user.home}/.m2/repository</localRepository>ฉันคิดว่า


6
$ {user.home} \. m2 \ repository เป็นค่าเริ่มต้นดังนั้นการลบแท็กว่างก็ควรจะใช้ได้เหมือนกัน
Luis Muñoz

9

Maven จำได้ว่าเมื่อมันไม่พบบางสิ่งบางอย่าง กุญแจสำคัญคือ "ความละเอียดจะไม่ถูกพยายามใหม่จนกว่าช่วงเวลาการอัปเดตภายในจะผ่านไปหรือการอัปเดตถูกบังคับ ->"

วิธีแก้ปัญหาอย่างรวดเร็วคือการลบไดเร็กทอรีย่อย "ที่เก็บ" ในเครื่องของคุณสำหรับส่วนของปัญหาโดยสมมติว่าคุณได้แก้ไขปัญหาแล้ว :)

mvn -U จะบังคับให้อัปเดตจากที่เก็บระยะไกล - อีกครั้งโดยสมมติว่าคุณเติมข้อมูลระยะไกลด้วยสิ่งประดิษฐ์ดังกล่าวแล้ว


2

จับทั้งหมด เมื่อการแก้ปัญหาที่กล่าวถึงที่นี่จะไม่ได้ทำงาน (happend ในกรณีของฉัน) เพียงแค่ลบเนื้อหาทั้งหมดจาก' .m2' โฟลเดอร์ / mvn clean installไดเรกทอรีและทำ


2

หากคุณได้<repositories/>กำหนดไว้ใน pom.xml ของคุณดูเหมือนว่าที่เก็บในเครื่องของคุณจะถูกละเว้น


1

แม้ว่าฉันจะประสบปัญหานี้และแก้ไขได้ด้วย 2 วิธี:

1) ใน IDE เลือกโปรเจ็กต์ของคุณและล้างโปรเจ็กต์ทั้งหมดจากนั้นติดตั้งการอ้างอิง maven ทั้งหมดโดยคลิกขวาที่โปรเจ็กต์ -> ไปที่ maven และอัปเดตการอ้างอิงโปรเจ็กต์เลือกโปรเจ็กต์ทั้งหมดพร้อมกันเพื่อติดตั้งโปรเจ็กต์เดียวกัน เมื่อเสร็จแล้วให้รันโปรเจ็กต์นั้น ๆ

2) อื่น ๆ สิ่งที่คุณสามารถทำได้คือตรวจสอบใน pom.xml สำหรับการอ้างอิงที่คุณได้รับข้อผิดพลาดและ"mvn clean install" โปรเจ็กต์ที่เกี่ยวข้อง เหล่านั้นก่อนและทำการติดตั้ง maven dependencies ของโปรเจ็กต์ปัจจุบันที่คุณประสบปัญหา ด้วยเหตุนี้การอ้างอิงของโครงการในพื้นที่จะถูกสร้างและไหจะถูกสร้างขึ้น


0

ฉันพบปัญหาที่คล้ายกันเมื่อโปรเจ็กต์ใหม่ของฉันขึ้นอยู่กับ oracle jdbc jar (ซึ่งฉันได้ติดตั้งไว้ในที่เก็บในเครื่องของฉันและทำงานได้ดีสำหรับโปรเจ็กต์อื่น ๆ ) ฉันลองใช้ตัวเลือก -U ลบไฟล์. lastupdate หรือทั้งไดเร็กทอรีและดาวน์แลดอีกครั้ง แต่ไม่ได้ผล ในที่สุดฉันก็ลบไดเร็กทอรีและติดตั้งในเครื่องอีกครั้งก็ใช้งานได้


0

ข้อผิดพลาดอย่างหนึ่งที่ฉันพบใน Maven คือเมื่อฉันใส่ไฟล์ settings.xml ในไดเรกทอรีที่ไม่ถูกต้อง ต้องอยู่ในโฟลเดอร์. m2 ภายใต้ dir บ้านผู้ใช้ของคุณ ตรวจสอบให้แน่ใจว่าอยู่ในตำแหน่งที่ถูกต้อง (พร้อมกับ settings-security.xml หากคุณกำลังใช้งาน)


0

ฉันมีDependencyResolutionExceptionใน Ubuntu Linux เมื่อฉันติดตั้งสิ่งประดิษฐ์ในเครื่องผ่านเชลล์สคริปต์ วิธีแก้ปัญหาคือการลบสิ่งประดิษฐ์ภายในเครื่องและติดตั้งอีกครั้ง "ด้วยตนเอง" - โทรmvn install:install-fileผ่านเทอร์มินัล



0

ตรวจสอบว่าสิ่งประดิษฐ์ Y ของคุณตั้งค่าบรรจุภัณฑ์เป็น "jar" หรือไม่ หากคุณกำหนดเป็น "war" โดย error หรือ copy paste จะแสดงว่า "ถูกแคชในที่เก็บในเครื่อง" ความละเอียดจะไม่ถูกพยายามอีกครั้งจนกว่าจะพ้นช่วงเวลาการอัปเดตภายในหรือบังคับให้อัปเดต " ฉันคาดหวังอะไรบางอย่างเช่น "สิ่งประดิษฐ์ Y คือสงครามคาดหวังประเภทขวด"


-1

ฉันมีข้อผิดพลาดเดียวกันจากสาเหตุอื่น: ฉันสร้าง POM เริ่มต้นที่มีการอ้างอิง "แนวทางปฏิบัติที่ดี" ของเราและสร้างและติดตั้งไว้ในเครื่องเพื่อทดสอบ ฉันสามารถ "เห็น" ได้ใน repo แต่โครงการที่ใช้มันมีข้อผิดพลาดข้างต้น สิ่งที่ฉันทำคือตั้งค่า POM เริ่มต้นเป็น pom ดังนั้นจึงไม่มี JAR Maven ค่อนข้างถูกต้องที่มันไม่ได้อยู่ใน Nexus - แต่ฉันไม่ได้คาดหวังว่ามันจะเป็นดังนั้นข้อผิดพลาดคืออืมมมไม่เป็นประโยชน์ การเปลี่ยน POM เริ่มต้นเป็นบรรจุภัณฑ์ปกติและการติดตั้งใหม่ช่วยแก้ปัญหาได้


คำตอบนี้น่าจะดีกว่าในฐานะความคิดเห็นเนื่องจากไม่ใช่คำตอบโดยตรงสำหรับคำถาม
00prometheus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.