คุณจะล้างแคชของ Apache Maven ได้อย่างไร


213

เมื่อเร็ว ๆ นี้ Apache Maven ดูเหมือนจะมีปัญหาการแคช การดำเนินการติดตั้งใหม่ทั้งหมดในโครงการของเราโดยใช้ Windows Vista หรือ Windows 7 บางครั้งจะผลิตสิ่งประดิษฐ์ด้วยข้อมูลเดียวกันกับงานสร้างก่อนหน้าแม้ว่าไฟล์ของสิ่งประดิษฐ์ที่ใหม่กว่าควรได้รับการอัพเดต

มีวิธีใดบ้างในการล้างแคชนี้เพื่อบังคับให้ Maven เรียกการสร้างที่สะอาดของสิ่งประดิษฐ์ในท้องถิ่นที่ควรสร้างขึ้น

โดยเฉพาะเรากำลังประสบปัญหาในการสร้างเว็บแอปด้วยปลั๊กอินสงคราม Maven เวอร์ชัน 3.0.3 เวอร์ชันปลั๊กอินสงครามคือ 2.1.1


2
คุณลอง-Uตั้งค่าสถานะซึ่งจะอัปเดตสิ่งประดิษฐ์หรือไม่
Amir Raminfar

2
คุณให้รายละเอียดเพิ่มเติมได้ไหม ผู้ติดตามไม่ได้รับการอัพเดตในสงครามหรือไม่? ถ้าเป็นเช่นนั้นผู้ที่อยู่ในความดูแลจะมีรุ่น SNAPSHOT หรือไม่
Raghuram

มันเป็นโครงการที่มีหลายรูปแบบหรือไม่? คุณได้ตรวจสอบหมายเลขเวอร์ชั่นของโมดูล depdendent หรือไม่? คุณสามารถทำซ้ำได้หรือไม่ mvn clean installนำสิ่งประดิษฐ์ใหม่ไปยังที่เก็บในเครื่องหรือไม่
palacsint

@ MetroidFan2002 เราช่วยกรุณาตอบคำถามได้ที่นี่ หรือคุณสามารถเขียนวิธีแก้ปัญหาหากคุณพบว่าตัวเอง
Naman

1
mvn clean install -Dmaven.repo.local=/alternate/repo/location
Gayan Weerakutti

คำตอบ:


225

ลบสิ่งประดิษฐ์ (หรือ repo ท้องถิ่นเต็มรูปแบบ) c:\Users\<username>\.m2\repositoryด้วยมือ


4
พยายามแล้วไม่ทำงาน ขอบคุณสำหรับคำแนะนำว่า
MetroidFan2002

3
ดูเหมือนว่าแม้หลังจากการรีสตาร์ท heck ของมากของสิ่งประดิษฐ์ Maven มีที่จับกับพวกเขาThe action can't be completed because the folder or file in it is open in another program. Close the folder or file and try again.
liltitus27

1
โปรดทราบว่าตำแหน่งโฟลเดอร์อาจแตกต่างกันไปในระบบของคุณ - ดูคำตอบนี้สำหรับวิธีหาเส้นทางโฟลเดอร์ maven repo
jakub.g

9
@ liltitus27 เหมือนกันที่นี่เพียงแค่กำจัด ~ / .m2 / พื้นที่เก็บข้อมูลไม่ทำงานmvn dependency:purge-local-repositoryในที่สุดก็ทำงานได้
qbert65536

ใช่มันใช้งานได้สำหรับฉัน 100% - Windows10 บนเครือข่ายขององค์กรในฐานะผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ
Graeme Phillips

176

ในการทำความสะอาดแคชโลคัลให้ลองใช้ปลั๊กอินการพึ่งพา

  1. mvn dependency:purge-local-repository: นี่เป็นความพยายามที่จะลบไฟล์ที่เก็บในตัวเครื่อง แต่มันจะไปและเติมที่เก็บในตัวเครื่องหลังจากลบสิ่งต่าง ๆ เสมอ
  2. mvn dependency:purge-local-repository -DreResolve=false: วิธีนี้จะหลีกเลี่ยงการแก้ไขการอ้างอิงอีกครั้ง แต่ดูเหมือนว่าจะยังคงเข้าสู่เครือข่ายในบางครั้ง
  3. mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false: นี่ถูกเพิ่มโดยPawełPrażakและดูเหมือนว่าจะทำงานได้ดี ฉันจะใช้อันที่สามถ้าคุณต้องการให้ repo ในท้องที่ว่างเปล่าและอันที่หนึ่งถ้าคุณต้องการที่จะทิ้ง repo ในพื้นที่และได้รับการอ้างอิงอีกครั้ง

4
ความแตกต่างระหว่างพวกเขาคืออะไร?
Pieter De Bie

13
แรกคือความพยายามที่จะลบไฟล์ที่เก็บในเครื่อง แต่มันจะไปและเติมขึ้นที่เก็บในท้องถิ่นหลังจากที่สิ่งต่าง ๆ ได้ถูกลบออก ที่สองหลีกเลี่ยงการแก้ไขการอ้างอิงอีกครั้ง แต่ดูเหมือนจะยังคงไปที่เครือข่ายในบางครั้ง ที่สามถูกเพิ่มโดยPawełPrażakและดูเหมือนว่าจะทำงานได้ดี ฉันจะใช้อันที่สามถ้าคุณต้องการให้ repo ในท้องที่ว่างเปล่าและอันที่หนึ่งถ้าคุณต้องการที่จะทิ้ง repo ในพื้นที่และได้รับการอ้างอิงอีกครั้ง
Brian C.

จากบรรทัดคำสั่งบนระบบ linux คุณจะต้องติดตั้ง mvn maven.apache.org/install.html
Brian C.

ฉันจะเพิ่มว่าคุณสามารถกำหนดเป้าหมายกลุ่ม / สิ่งประดิษฐ์เฉพาะด้วยพารามิเตอร์เพิ่มเติม คำตอบนี้แน่นอนสิ่งที่ฉันกำลังมองหา (ตัวเลือก 3) นี่คือพารามิเตอร์พิเศษ ::: การพึ่งพา mvn: การล้างข้อมูลในพื้นที่เก็บข้อมูล -DmanualInclude = "myGroupId" -DsnapshotsOnly = true -DactTransitively = false -DreResolve = false
granadaCoder

ฉันลองตัวเลือกที่ 3 โดยมีวัตถุประสงค์เพื่อลบเนื้อหาทั้งหมดภายในที่เก็บข้อมูลในเครื่อง แต่ไม่ทำงาน - จนถึงจุดนี้วิธีที่ไม่ซ้ำกันในการบรรลุเป้าหมายนี้คือการลบเนื้อหาทั้งหมดของไดเรกทอรีนั้นด้วยตนเอง ฉันมีที่เก็บในเครื่องในตำแหน่งอื่นที่ไม่ใช่<User_Name>/.m2ที่ตั้ง ไม่แน่ใจว่ามันจะเป็นเหตุผล
Manuel Jordan

13

คุณได้ตรวจสอบ / การเปลี่ยนแปลงupdatePolicysettings.xmlการตั้งค่าสำหรับเก็บของคุณในของคุณ

องค์ประกอบนี้ระบุความถี่ที่ควรพยายามอัพเดท Maven จะเปรียบเทียบเวลาประทับของ POM ในพื้นที่ (จัดเก็บในไฟล์ maven-metadata ของที่เก็บ) กับรีโมต ตัวเลือกคือ: เสมอทุกวัน (ค่าเริ่มต้น) ช่วงเวลา: X (โดยที่ X เป็นจำนวนเต็มเป็นนาที) หรือไม่เคย

alwaysพยายามที่จะตั้งค่าให้


1
ความช่วยเหลือที่เป็นไปได้ในการจัดการกับสิ่งนี้ ... ฉันไม่มี<updatePolicy>pom.xml ของฉัน แต่มี<snapshotPolicy>
Al Lelopath

updatePolicy ถูกตั้งค่าเป็นทุกที่ใน settings.xml ของฉัน
MasterJoe2

11

ฉันจะทำต่อไปนี้:

mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end

ธงบอกให้ Maven ไม่พยายามแก้ไขการพึ่งพาหรือเข้าสู่เครือข่าย ลบสิ่งที่คุณเห็นในเครื่อง

และสำหรับการวัดที่ดีก็ให้ละเว้นข้อผิดพลาด ( --fail-at-end) จนถึงที่สุด บางครั้งสิ่งนี้มีประโยชน์สำหรับโครงการที่มีชุดของการพึ่งพาที่ค่อนข้างสับสนหรือพึ่งพาที่เก็บข้อมูลภายในที่ค่อนข้างยุ่งเหยิง (เกิดขึ้น)


1
มันไม่เพียงพอที่จะเพียงแค่ลบโฟลเดอร์แคชท้องถิ่นสำหรับการล้างข้อมูลบน kinda นี้?

1
คุณสามารถทำได้ถ้าคุณรู้ว่าทุก ๆ คนพึ่งพาสกรรมกริยา แต่มันก็น่าเบื่อ (หรือเราแค่ลบแคชทั้งหมด แต่มันจะบังคับให้ maven ดาวน์โหลดทุกอย่างอีกครั้งสำหรับสิ่งที่ไม่เกี่ยวข้องกับสิ่งประดิษฐ์ที่เป็นปัญหา) ทุกอย่างขึ้นอยู่กับสถานการณ์ที่เฉพาะเจาะจง
luis.espinal

6

ใช้งานได้กับ Spring Tool Suite v 3.1.0 ปล่อย แต่ฉันเดาว่ามันยังมีอยู่ใน Eclipse เช่นกัน

หลังจากลบสิ่งประดิษฐ์ด้วยมือ (ตามที่ระบุโดย palacsint ด้านบน) ใน/username/.m2ไดเรกทอรีให้จัดทำดัชนีไฟล์ใหม่โดยทำสิ่งต่อไปนี้:

ไปที่:

  • Windows->Preferences->Maven->User Settings เมนู.

คลิกReindexปุ่มถัดจากLocal Repositoryกล่องข้อความ คลิก "นำไปใช้" จากนั้น "ตกลง" และคุณทำเสร็จแล้ว


2

เนื่องจากบางคำตอบได้ชี้ให้เห็นบางครั้งคุณต้องการลบที่เก็บโลคัลทั้งหมดตัวอย่างเช่นอาจมีบางสิ่งประดิษฐ์ที่ไม่สามารถลบทิ้งได้เนื่องจากไม่ได้อ้างอิงจาก pom อีกต่อไป

หากคุณต้องการให้การลบนี้ถูกฝังอยู่ในเฟส maven ตัวอย่างเช่นcleanคุณสามารถใช้maven-clean-pluginและเข้าถึงที่เก็บผ่านการตั้งค่าตัวอย่างเช่น:

 <plugin>
    <inherited>false</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <phase>clean</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo>Base clean is attached to deleting local maven cache</echo>
                    <echo>${settings.localRepository}</echo>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <inherited>false</inherited>
    <artifactId>maven-clean-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>${settings.localRepository}</directory>
            </fileset>
        </filesets>
    </configuration>
</plugin>

2

ใช้mvn dependency:purge-local-repository -DactTransitively=false -Dskip=trueถ้าคุณมีปลั๊กอิน maven เป็นหนึ่งในโมดูล มิฉะนั้น Maven จะพยายามคอมไพล์ใหม่ดังนั้นจึงทำการดาวน์โหลดการอ้างอิงอีกครั้ง


1
นี่คือสิ่งที่ฉันกำลังมองหามันแค่มีตัวพิมพ์ผิด (ไม่มีขีดสำหรับการข้าม): การพึ่งพา mvn: การล้างพื้นที่เก็บข้อมูลท้องถิ่น -DactTransitively = false -Dskip = true
shoguren

0

ฉันมีปัญหาเดียวกันนี้และฉันเขียนหนึ่งซับในเปลือกเพื่อทำ

rm -rf $(mvn help:evaluate -Dexpression=settings.localRepository\
                       -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN -B \
                       -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn | grep -vF '[INFO]')/*

ฉันทำมันเป็นสายการบินเดียวเพราะฉันต้องการให้ Jenkins-project ดำเนินการนี้เมื่อใดก็ตามที่ฉันต้องการดังนั้นฉันไม่จำเป็นต้องล็อกออนเข้าสู่เนื้อหา ฯลฯ หากคุณยอมให้เชลล์สคริปต์ทำงานด้วยตัวเอง คุณสามารถเขียนมันสะอาดขึ้น:

#!/usr/bin/env bash
REPOSITORY=$(mvn help:evaluate \
  -Dexpression=settings.localRepository \
  -Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
  -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn \
  --batch-mode \
  | grep -vF '[INFO]')

rm -rf $REPOSITORY/*

ควรใช้ได้ แต่ฉันยังไม่ได้ทดสอบสคริปต์ทั้งหมด (ฉันได้ทดสอบคำสั่งแรก แต่ไม่ใช่สคริปต์ทั้งหมด) วิธีนี้มีข้อเสียของการรันคำสั่งที่ซับซ้อนขนาดใหญ่ก่อน มันคือ idempotent ดังนั้นคุณสามารถทดสอบด้วยตัวเอง การลบเป็นคำสั่งของตัวเองในภายหลังและสิ่งนี้จะช่วยให้คุณลองทั้งหมดและตรวจสอบว่ามันทำในสิ่งที่คุณคิดว่าทำเพราะคุณไม่ควรเชื่อถือคำสั่งการลบโดยไม่ต้องตรวจสอบ อย่างไรก็ตามมันฉลาดด้วยเหตุผลที่ดีอย่างหนึ่ง: พกพาสะดวก มันเคารพไฟล์ settings.xml ของคุณ หากคุณใช้คำสั่งนี้และบอกให้ maven ใช้ไฟล์ xml ที่เฉพาะเจาะจง (อาร์กิวเมนต์ -s หรือ --settings) สิ่งนี้จะยังคงใช้งานได้ ดังนั้นคุณไม่ต้องเล่นซอด้วยการทำให้แน่ใจว่าทุกอย่างเหมือนกันทุกที่

มันค่อนข้างลำบาก แต่ก็เป็นวิธีที่ดีในการทำธุรกิจ IMO


-3

ดังนั้นจึงมีคำสั่งบางอย่างที่คุณสามารถใช้ทำความสะอาดได้

 1. mvn clean cache   
 2. mvn clean install 
 3. mvn clean install -Pclean-database

การลบโฟลเดอร์ที่เก็บจาก. m2 สามารถช่วยได้


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