ฉันจะให้ Maven หยุดการพยายามตรวจสอบการอัปเดตสำหรับสิ่งประดิษฐ์จากบางกลุ่มจาก maven-central-repo ได้อย่างไร


126

ฉันกำลังทำโครงการ Maven ที่ใหญ่พอสมควร เราอาจมีอาร์ติแฟกต์แต่ละรายการประมาณ 70 รายการซึ่งแบ่งออกเป็นสองไลบรารีของโค้ดที่ใช้ร่วมกันโดยประมาณและอาจมีแอปพลิเคชันสิบรายการที่ใช้ ทั้งหมดของรายการเหล่านี้อาศัยอยู่ในการ com.mycompany.*namespace

เวลาส่วนใหญ่เราทำงานกับการสร้างสแนปชอต ดังนั้นในการสร้างแอปพลิเคชันเต็มรูปแบบฉันอาจสร้างโปรเจ็กต์ไลบรารีก่อนเพื่อให้ติดตั้งลงในที่เก็บในเครื่องของฉัน (ตามที่พูดmycompany-libname-2.4-SNAPSHOT.jar)

ปัญหาคือเมื่อไปสร้างแอปพลิเคชันแล้ว ด้วยเหตุผลบางประการ Maven ต้องการตรวจสอบที่เก็บสาธารณะหลักสองแห่ง (maven-net-repo และ java-net-repo) สำหรับการอัปเดตสำหรับmycompany-*-SNAPSHOT.jarสิ่งประดิษฐ์ทั้งหมด แน่นอนว่าพวกเขาไม่พบที่นั่นและในที่สุดทุกอย่างก็กลับไปเป็นเวอร์ชันที่ฉันเพิ่งสร้างขึ้นในพื้นที่เก็บข้อมูลในพื้นที่ของฉัน แต่ฉันอยากให้ Maven หยุดทำสิ่งนี้เพราะ (ก) ทำให้ฉันรู้สึกเหมือนเป็นชาวเน็ตที่ไม่ดีพลเมือง สำหรับการตรวจสอบที่เก็บเหล่านี้อย่างต่อเนื่องเพื่อหาสิ่งที่จะไม่อยู่ที่นั่นและ (b) เพิ่มเวลาแฝงเครือข่ายที่ไม่จำเป็นและน่ารำคาญลงในกระบวนการสร้างของฉัน

ฉันเคยใช้ maven ในโหมดออฟไลน์เกือบตลอดเวลาในการแก้ไขปัญหานี้ แต่ก็ไม่เหมาะเนื่องจากบางครั้งการพึ่งพาห้องสมุดสาธารณะจะได้รับการอัปเดต ดังนั้นสิ่งที่ฉันกำลังมองหาคือวิธีแก้ปัญหาซึ่งจะทำให้ Maven ไม่ตรวจสอบการอัปเดตจากที่เก็บที่กำหนดสำหรับสิ่งประดิษฐ์ที่ตรงตามเกณฑ์ที่กำหนด - ในกรณีนี้ฉันยินดีถ้า Maven จะละเว้นเวอร์ชัน SNAPSHOT หรือสิ่งประดิษฐ์ที่อยู่ในcom.mycompanynamespace

คำตอบ:


34

แท็ก updatePolicy ใช้ไม่ได้สำหรับฉัน อย่างไรก็ตาม Rich Seller กล่าวว่าควรปิดใช้งานสแนปชอต แต่อย่างใดดังนั้นฉันจึงมองต่อไปและสังเกตเห็นว่าพื้นที่เก็บข้อมูลพิเศษที่ฉันเพิ่มใน settings.xml ทำให้เกิดปัญหาจริง การเพิ่มส่วนสแน็ปช็อตลงในที่เก็บนี้ใน settings.xml ของฉันได้เคล็ดลับ!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>

ขอบคุณมากสำหรับคำตอบ ในที่สุดมันก็ช่วยฉันได้ ฉันพบปัญหาบางอย่างเกี่ยวกับการดาวน์โหลดสแนปชอตสำหรับที่เก็บใดที่หนึ่ง การดาวน์โหลดถูกระงับแม้จะไม่มีการอัปเดตของตำรวจก็ตาม ตอนนี้ไม่ได้ดาวน์โหลดสแนปชอตซึ่งตรงกับที่ฉันต้องการ
wolfroma

164

นอกจากนี้คุณสามารถใช้-oหรือ--offlineในบรรทัดคำสั่ง mvn ซึ่งจะทำให้ maven อยู่ใน "โหมดออฟไลน์" ดังนั้นจะไม่ตรวจสอบการอัปเดต คุณจะได้รับคำเตือนเกี่ยวกับการไม่ได้รับการอ้างอิงที่ไม่มีอยู่ใน repo ในพื้นที่ของคุณ แต่ไม่ใช่เรื่องใหญ่


8
สิ่งนี้จะหยุด maven จากการดาวน์โหลดการอ้างอิงที่ปล่อยออกมาเช่นกัน คุณอาจต้องการเวอร์ชันที่ใหม่กว่าของไลบรารีที่เผยแพร่โดยไม่ต้องตรวจสอบสแนปช็อตสำหรับการอัปเดต
hobgoblin

2
นี่ไม่ใช่คำตอบสำหรับคำถามเดิมอย่างชัดเจน! มันจะมีการโหวตมากขึ้นได้อย่างไร ??? OP เขียนอย่างชัดเจนว่าเขาพยายามเรียกใช้ maven ในโหมดออฟไลน์ แต่มันไม่เหมาะสำหรับจุดประสงค์ของเขา!
Honza Zidek

95

สิ่งที่ตอนนี้มีอยู่ใน maven เช่นกันคือ

mvn goal --no-snapshot-updates

หรือเรียกสั้น ๆ

mvn goal -nsu

3
ในกรณีที่คนใด SBT ที่ดินที่นี่: set offline := trueในเซสชั่นหรือในoffline := true build.sbt
opyate

5
นอกจากนี้nsuตัวเลือกใช้งานไม่ได้ใน v 3.0.3 (ดูMNG-5064 ) ในการใช้ตัวเลือกนี้อย่างน่าเชื่อถือคุณอาจต้องอัปเกรดเป็น atleast v. 3.0.4 หรือ v. 3.0.5
Ashutosh Jindal

สวยที่สุด
AntJavaDev

32

อัปเดต: ฉันน่าจะเริ่มด้วยสิ่งนี้เนื่องจากโครงการของคุณเป็น SNAPSHOTs เป็นส่วนหนึ่งของความหมาย SNAPSHOT ที่ Maven จะตรวจสอบการอัปเดตในแต่ละบิลด์ การเป็น SNAPSHOT หมายความว่ามันมีความผันผวนและอาจมีการเปลี่ยนแปลงดังนั้นควรตรวจสอบการอัปเดต อย่างไรก็ตามควรชี้ให้เห็นว่าMaven super POM กำหนดค่าส่วนกลางเพื่อปิดใช้งานสแนปช็อตดังนั้น Maven จึงไม่ควรตรวจสอบการอัปเดตสำหรับ SNAPSHOTs ที่ส่วนกลางเว้นแต่คุณจะได้ลบล้างสิ่งนั้นใน pom / settings ของคุณเอง


คุณสามารถกำหนดค่า Maven ให้ใช้มิเรอร์สำหรับที่เก็บส่วนกลางซึ่งจะเปลี่ยนเส้นทางคำขอทั้งหมดที่ปกติจะไปที่ส่วนกลางไปยังที่เก็บภายในของคุณ

ใน settings.xml ของคุณคุณจะเพิ่มสิ่งนี้เพื่อตั้งค่าที่เก็บภายในของคุณเป็นมิเรอร์สำหรับส่วนกลาง:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

หากคุณกำลังใช้ตัวจัดการที่เก็บเช่นNexusสำหรับที่เก็บภายในของคุณ คุณสามารถตั้งค่าที่เก็บพร็อกซีสำหรับพร็อกซีส่วนกลางดังนั้นคำร้องขอใด ๆ ที่ปกติจะไปที่ศูนย์กลางจะถูกส่งไปยังที่เก็บพร็อกซีของคุณ (หรือกลุ่มที่เก็บที่มีพร็อกซี) และคำร้องขอที่ตามมาจะถูกแคชในตัวจัดการที่เก็บภายใน คุณยังสามารถตั้งค่าการหมดเวลาแคชของพร็อกซีเป็น -1 ดังนั้นจะไม่ขอเนื้อหาจากส่วนกลางที่มีอยู่แล้วในที่เก็บพร็อกซี


วิธีแก้ปัญหาพื้นฐานเพิ่มเติมหากคุณกำลังทำงานกับที่เก็บในเครื่องเท่านั้นคือการตั้งค่าupdatePolicyสำหรับที่เก็บส่วนกลางเป็น "ไม่เคย" ซึ่งหมายความว่า Maven จะตรวจสอบสิ่งประดิษฐ์ที่ไม่ได้อยู่ในที่เก็บในเครื่องเท่านั้น จากนั้นสามารถแทนที่ได้ที่บรรทัดคำสั่งเมื่อจำเป็นโดยใช้สวิตช์ -U เพื่อบังคับให้ Maven ตรวจสอบการอัปเดต

คุณต้องกำหนดค่าที่เก็บ (ใน pom หรือโปรไฟล์ของคุณใน settings.xml) ดังนี้:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>

จริงๆแล้วเรามีที่เก็บส่วนกลางอยู่แล้ว แต่แน่นอนว่าเราไม่ได้เผยแพร่สแน็ปช็อตบิวด์ดังนั้นฉันจึงยังคงได้รับการตรวจสอบการอัปเดตที่ล้มเหลวด้วยพร็อกซี / มิเรอร์ - ฉันกำลังมองหาวิธีรับ Maven เพื่อไม่ตรวจสอบการอัปเดตเลยสำหรับสิ่งประดิษฐ์เหล่านี้
Tim Gilbert

1
นอกจากนี้ยังควรตั้งค่าที่เก็บเชิงตรรกะบนที่เก็บส่วนกลางของคุณสำหรับ SNAPSHOT ของคุณ ซึ่งหมายความว่าสามารถใช้ร่วมกันระหว่างนักพัฒนาซอฟต์แวร์ของคุณและคุณไม่จำเป็นต้องสร้างทั้งหมดในเครื่อง จากนั้นคุณจะได้รับประโยชน์อย่างเต็มที่จาก SNAPSHOTs โดยรับการเปลี่ยนแปลงการอ้างอิง SNAPSHOT ใด ๆ ทันทีที่ถูกผลักไปที่ที่เก็บระยะไกล
Rich Seller

ขอบคุณ - ธง updatePolicy ดูเหมือนกับสิ่งที่ฉันกำลังมองหา
Tim Gilbert

1
Nexus ยังช่วยให้คุณกำหนดค่ากฎเพื่อป้องกันไม่ให้คำขอใด ๆ สำหรับสิ่งประดิษฐ์ของ บริษัท ออกไปภายนอก
Brian Fox

ข้อมูลโค้ด XML ที่นี่ล้าสมัยแล้ว updatePolicyองค์ประกอบไปภายใต้snapshotsหรือreleasesองค์ประกอบ ดู: maven.apache.org/settings.html
Jeff Evans

5

ง่ายมาก :

ใน Super POM parent หรือ setting.xml ให้ใช้

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

เป็นเคล็ดลับของฉัน


0

ฉันมีปัญหาคล้าย ๆ กับเรื่องนี้

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

การตั้งค่า updatePolicy เป็น "never" ไม่ทำงาน การลบ repo เหล่านี้เป็นวิธีที่ฉันแก้ไขได้ ps: ฉันทำตามบทช่วยสอนนี้เกี่ยวกับบริการเว็บ (btw น่าจะเป็นบทช่วยสอนที่ดีที่สุดสำหรับ ws สำหรับ java)


1
คุณใช้ Intellij หรือไม่? เนื่องจาก Intellij + Maven = ละเว้น updatePolicy ดูรายงานข้อผิดพลาดyoutrack.jetbrains.com/issue/IDEA-76869
Manav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.