ทำไม Maven ถึงดาวน์โหลด maven-metadata.xml ทุกครั้ง?


116

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

คำถามของฉันคือทำไม maven จึงต้องดาวน์โหลดทุกครั้งเมื่อมีการสร้างแอปเดียวกันก่อนหน้านี้

มีอะไรผิดพลาดในการกำหนดค่าของฉันที่ทำให้ maven ดาวน์โหลดทุกครั้ง

ด้านล่างนี้เป็นข้อผิดพลาดที่ฉันได้รับเมื่อพยายามสร้างออฟไลน์:

[INFO] ------------------------------------------------------------------------
[INFO] Building mywebapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://raw.github.com/pagecrumb/mungo/mvn-repo/com/pagecrumb/mungo/0.0.1-SNAPSHOT/maven-metadata.xml

[WARNING] Could not transfer metadata com.mywebapp:mungo:0.0.1-SNAPSHOT/maven-metadata.xml 
from/to mungo-mvn-repo (https://raw.github.com/pagecrumb/mungo/mvn-repo/): raw.github.com
[INFO] 
[INFO] --- maven-war-plugin:2.1.1:war (default-cli) @ mywebapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp] in [D:\workspace\web\target\mywebapp-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\web\src\main\webapp]
[INFO] Webapp assembled in [1237 msecs]
[INFO] Building war: D:\workspace\web\target\mywebapp-1.0-SNAPSHOT.war
[WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored 
(webxml attribute is missing from war task, 
or ignoreWebxml attribute is specified as 'true')
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building com.mywebapp [com.mywebapp] 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.1/maven-release-plugin-2.1.pom

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-release-plugin:2.1: Plugin org.apache.maven.plugins:maven-release-plugin:2.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-release-plugin:jar:2.1
Downloading: http://download.java.net/maven/2/org/apache/maven/plugins/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml

397/397 B   

Downloaded: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml (397 B at 0.0 KB/sec)
[WARNING] Failure to transfer org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from http://download.java.net/maven/2 was cached in the local repository, resolution will not be reattempted until the update interval of maven2-repository.dev.java.net has elapsed or updates are forced. Original error: Could not transfer metadata org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from/to maven2-repository.dev.java.net (http://download.java.net/maven/2): download.java.net
[INFO] 
[INFO] --- maven-war-plugin:2.3:war (default-cli) @ mywebapp-build ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp-build] in [D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [15 msecs]
[INFO] Building war: D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] mywebapp ..................................... SUCCESS [27.999s]
[INFO] com.mywebapp [com.mywebapp] ..................... FAILURE [1:00.406s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:41.409s
[INFO] Finished at: Tue May 07 22:13:38 SGT 2013
[INFO] Final Memory: 11M/28M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war 
(default-cli) on project mywebapp-build: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

2
การเข้าถึงข้อมูลเมตาในกรณีที่จำเป็นของ SNAPSHOT เพื่อให้ Maven ทราบเกี่ยวกับ ฯลฯ ของ SNAPSHOT ที่สร้างขึ้นใหม่
khmarbaise

7
ฉันไม่รู้ว่าทำไม แต่คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยใช้ตัวเลือก -o เช่นmvn clean install -o
มด

อันที่จริงข้อผิดพลาดที่การสร้างล้มเหลวคือ "ข้อผิดพลาดในการประกอบ WAR: แอตทริบิวต์ webxml เป็นสิ่งจำเป็น (หรือ WEB-INF / web.xml ที่มีอยู่แล้วหากดำเนินการในโหมดอัปเดต)" ดังนั้นคุณควรแก้ไข ฉันไม่สามารถนึกภาพได้ว่าเกี่ยวข้องกับการเชื่อมต่ออินเทอร์เน็ตของคุณ คำเตือนการแก้ปัญหาการพึ่งพามีดังนี้: คำเตือน สิ่งเหล่านี้ไม่ใช่สาเหตุสุดท้ายของความล้มเหลวในการสร้างของคุณ
Frans

บางทีคุณสามารถชี้แจงคำถามของคุณได้เนื่องจากคุณมีคำถามสองข้อ: 1) เหตุใดการสร้างของฉันจึงล้มเหลว 2) เหตุใด maven จึงพยายามดาวน์โหลดข้อมูลเมตา คำตอบของผู้ใช้ 944849 ไปไกลในการตอบ 2) หากสิ่งนั้นตอบคำถามของคุณคุณควรยอมรับ
Frans

ปรับปรุงข้อมูลเมตา Snapshot สามารถหลีกเลี่ยงการใช้-nsu, --no-snapshot-updatesตัวเลือกที่มีmvn
Janaka Bandara

คำตอบ:


127

มองหาองค์ประกอบของคุณsettings.xml(หรืออาจเป็นไปได้ว่าโครงการหลักหรือ บริษัท แม่ของ บริษัท ) <repositories>จะมีลักษณะดังนี้

<repositories>
    <repository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
    </repository>
</repositories>

สังเกต<updatePolicy>องค์ประกอบ ตัวอย่างบอกให้ Maven ติดต่อ repo ระยะไกล (Nexus ในกรณีของฉันคือ Maven Central หากคุณไม่ได้ใช้ repo ระยะไกลของคุณเอง) เมื่อใดก็ตามที่ Maven ต้องการเรียกค้นสิ่งประดิษฐ์สแนปชอตในระหว่างการสร้างตรวจสอบว่ามีสำเนาที่ใหม่กว่าหรือไม่ ข้อมูลเมตาจำเป็นสำหรับสิ่งนี้ หากมีสำเนา Maven ที่ใหม่กว่าให้ดาวน์โหลดไปยัง repo ในพื้นที่ของคุณ

ในตัวอย่างสำหรับการเผยแพร่นโยบายdailyจะตรวจสอบในระหว่างการสร้างครั้งแรกของวัน neverยังเป็นตัวเลือกที่ถูกต้องตามที่อธิบายไว้ในMaven การตั้งค่าเอกสาร

ปลั๊กอินได้รับการแก้ไขแยกกัน คุณอาจมีการกำหนดค่าที่เก็บสำหรับที่เก็บเหล่านั้นด้วยโดยมีนโยบายการอัปเดตที่แตกต่างกันหากต้องการ

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </releases>
    </pluginRepository>
</pluginRepositories>

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


2
คำถามคือทำไมถึงไม่ "ไม่เคย" (ซึ่งฉันคิดว่ามันควรจะเป็น) เสมอไป? ทำไมคุณต้องอัปเดตทุกวันหรือตลอดเวลา?
Leon

@Leon ในช่วงกลางการพัฒนาโครงการของคุณอาจมีการอ้างอิง '-SNAPSHOT' ซึ่งคุณอาจต้องการเลือกเวอร์ชันที่สร้างขึ้นล่าสุดเสมอ - อย่างน้อยในระบบ CI คุณอาจจะมีนักพัฒนาอาจมีความชอบที่แตกต่างกัน - การซื้อขายสร้างเสถียรภาพ เทียบกับการเปลี่ยนแปลงล่าสุด สิ่งที่เอกสาร maven (โดยเฉพาะอย่างยิ่งน่าเสียดาย) ไม่สามารถทำให้ชัดเจนได้คือค่าเริ่มต้นสำหรับสิ่งเหล่านี้หากไม่มีการตั้งค่าใด ๆ
Ed Randall

1
แนวทางปฏิบัติที่ดีที่สุดคือเมื่อปล่อยอาร์ติแฟกต์แล้วจะไม่เปลี่ยนแปลงดังนั้น <updatePolicy> ไม่เคย </updatePolicy> ควรจะเหมาะสม
Ed Randall

แต่ถ้าคุณอัปเดตการอ้างอิง POM เป็นรุ่นใหม่ล่ะ? มันจะไม่ได้รับการปรับปรุง?
Philip Rego

1
@PhilipRego - updatePolicy ใช้ต่อสิ่งประดิษฐ์ หากคุณเปลี่ยนหมายเลขเวอร์ชันหรือรหัสกลุ่ม / อาร์ติแฟกต์นั่นคืออาร์ติแฟกต์อื่น หาก updatePolicy เป็น 'ไม่เคย' สิ่งประดิษฐ์จะถูกดาวน์โหลดเพียงครั้งเดียวเว้นแต่จะบังคับให้รีเฟรช-Uหรืออาร์ติแฟกต์ถูกลบออกจาก repo ในเครื่องดังนั้นจึงจำเป็นต้องดาวน์โหลดใหม่
user944849

31

อาจเป็นไปได้ที่จะใช้ธง-o,--offline "Work offline"เพื่อป้องกันสิ่งนั้น

แบบนี้:

maven compile -o


ฉันเชื่อว่านี่ควรเป็นคำตอบที่ถูกต้องเพราะคุณสามารถเรียกคำสั่งนี้ได้เมื่อการเชื่อมต่ออินเทอร์เน็ตของคุณไม่ดี และนี่คือสิ่งที่ถูกถาม ...
ดังนั้น S

13

ฉันคิดว่าเป็นเพราะคุณไม่ได้ระบุเวอร์ชันของปลั๊กอินดังนั้นจึงทริกเกอร์การดาวน์โหลดข้อมูลเมตาที่เกี่ยวข้องเพื่อรับข้อมูลล่าสุด

มิฉะนั้นคุณพยายามบังคับให้ใช้ repo ในพื้นที่โดยใช้ -o หรือไม่?


คุณจะระบุเวอร์ชันปลั๊กอินได้อย่างไร? ฉันแน่ใจว่าฉันมีเวอร์ชันที่ตั้งไว้ใน POM ... คุณสามารถระบุได้ชัดเจนขึ้นหรือไม่?
ควาร์ก

ถ้าคุณมีversionองค์ประกอบอยู่ในpluginองค์ประกอบนั้นคุณได้กำหนดค่าไว้แล้วถ้าเป็นเช่นนั้นฉันคิดไม่ออก ... ขอให้โชคดี
Gab

ในกรณีของฉันเวอร์ชันคือช่วง [12.1 12.2) และแคชข้อมูลเมตาถูกตั้งค่าเป็น 24 ชั่วโมงดังนั้นจึงจะตรวจสอบเวอร์ชันที่ใหม่กว่าในการสร้างครั้งแรกในแต่ละวัน
mzzzzb

แล้วปลั๊กอินเริ่มต้นล่ะ? เช่นmaven-surefire-commonที่ฉันไม่ได้ระบุ?
yegeniy

เวอร์ชันของพวกเขาได้รับการแก้ไขสำหรับรุ่น maven ที่กำหนด แต่คุณอาจบังคับใช้เวอร์ชันอื่นโดยใช้pluginManagementส่วน
Gab

0

ฉันยังไม่ได้ศึกษาเมื่อ Maven ทำการค้นหา แต่เพื่อให้ได้งานสร้างที่เสถียรและทำซ้ำได้ฉันขอแนะนำอย่างยิ่งว่าอย่าเข้าถึง Maven Respositories โดยตรง แต่ให้ใช้ Maven Repository Manager เช่น Nexus

นี่คือการสอนวิธีตั้งค่าไฟล์การตั้งค่าของคุณ:

http://books.sonatype.com/nexus-book/reference/maven-sect-single-group.html

http://maven.apache.org/repository-management.html


@acdcjunior อย่างที่บอกยังไม่ได้ศึกษาเรื่องนั้น แต่การใช้ Maven Repository Manager ในเครื่องจะช่วยแก้ปัญหาส่วนใหญ่เหล่านี้ได้เช่นกัน (หาก Maven ตรวจสอบข้อมูลเมตาระบบจะเข้าถึง Maven Repository Manager ของคุณเท่านั้น)
Puce

1
IMHO ผู้จัดการ repo มีประโยชน์เฉพาะในองค์กรเพื่อหลีกเลี่ยงการดาวน์โหลดซ้ำซ้อนและโดยเฉพาะอย่างยิ่งการปรับใช้สิ่งประดิษฐ์เฉพาะสำหรับองค์กรนี้ (เช่นแม่ปอมแม่และโมดูลภายใน) มิฉะนั้นทำไมต้องเพิ่มมิเรอร์เพิ่มเติมในขณะที่คุณมีอยู่แล้ว?
Gab

@Puce ฉันไม่เห็นว่าจะแก้ปัญหาได้อย่างไร หากคุณไม่ต้องการให้ maven ตรวจสอบข้อมูลเมตาในเครือข่ายเลยไม่สำคัญว่าจะตรวจสอบจากอินเทอร์เน็ตหรือจากตัวจัดการ repo อินทราเน็ต
eis

@e จะช่วยได้หาก "การเชื่อมต่ออินเทอร์เน็ตไม่ดี" หรือหากเซิร์ฟเวอร์ที่เก็บเครื่องใดเครื่องหนึ่งไม่สามารถใช้งานได้ในขณะนี้เนื่องจากคุณกำลังเข้าถึงตัวจัดการที่เก็บ maven ใน LAN ของคุณเท่านั้น
Puce

@Gap ในขณะที่ผู้จัดการ repo มีประโยชน์อย่างยิ่งในองค์กรด้วยเหตุผลที่คุณกล่าวถึงผู้จัดการ repo ก็มีความสำคัญเช่นกันในการสร้างงานสร้างที่เสถียรและทำซ้ำได้ซึ่งเป็นสิ่งที่ฉันมักจะตั้งเป้าไว้แม้ว่าตอนนี้ฉันจะเป็นนักพัฒนาเพียงคนเดียวในโครงการก็ตาม ทำให้มั่นใจได้ว่าฉันสามารถล้าง repo ในพื้นที่ของฉันได้และยังคงสามารถทำซ้ำงานสร้างทั้งหมดและนักพัฒนาคนอื่น ๆ สามารถเข้าร่วมโครงการได้อย่างง่ายดาย ฉันมั่นใจในสิ่งนี้กับ Jenkins ซึ่งบางครั้งก็ทำงานในพื้นที่เข้าถึงตัวจัดการ repo เช่นกันและยังช่วยเผยแพร่โครงการของฉัน -> ผู้ใช้ 2 คนที่เข้าถึงผู้จัดการ repo: เจนกินส์และตัวฉันเอง
Puce

0

Maven ทำสิ่งนี้เนื่องจากการพึ่งพาของคุณอยู่ในเวอร์ชัน SNAPSHOT และ maven ไม่มีวิธีตรวจจับการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับเวอร์ชันสแน็ปช็อตนั้นในที่เก็บ ปล่อย Artifact ของคุณและเปลี่ยนเวอร์ชันใน pom.xml เป็นเวอร์ชันนั้นและ maven จะไม่ดึงไฟล์ข้อมูลเมตาอีกต่อไป

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