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


102

ฉันใช้ Maven 3.3.3 กับ Java 8 บน Mac Yosemite ฉันมีโครงการหลายโมดูล

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

เมื่อฉันสร้างหนึ่งในโมดูลลูกของฉันตัวอย่างเช่น "my-module" จากด้านบนโดยใช้ "mvn clean install" บิวด์จะพยายามดาวน์โหลดอาร์ติแฟกต์โมดูลลูกจากที่เก็บระยะไกลที่ฉันได้กำหนดไว้ใน ~ / .m2 ของฉัน /settings.xml ไฟล์ เอาต์พุตอยู่ด้านล่าง

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

ฉันจะบังคับให้ Maven ตรวจสอบที่เก็บ ~ / .m2 / ท้องถิ่นของฉันก่อนได้อย่างไรก่อนที่จะพยายามดาวน์โหลดจากที่เก็บระยะไกล ด้านล่างนี้คือที่ที่ฉันกำหนดที่เก็บระยะไกลไว้ในไฟล์ ~ / .m2 / settings.xml ของฉัน ...

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

แก้ไข:ในการตอบกลับคำตอบที่บอกว่าการดาวน์โหลดเกิดขึ้นเมื่อไม่มีสิ่งประดิษฐ์ด้านล่างคือเอาต์พุตเทอร์มินัลที่ฉันพิสูจน์ว่าไฟล์อยู่ที่นั่นใน repo ของฉัน แต่ Maven พยายามดาวน์โหลดอยู่แล้ว ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml

2
Maven ไม่ตรวจสอบพื้นที่เก็บข้อมูลในท้องถิ่นของคุณก่อนที่จะพยายามที่จะดาวน์โหลดสิ่งประดิษฐ์จากพื้นที่เก็บข้อมูลระยะไกล คุณแน่ใจหรือไม่ว่าในพื้นที่ของคุณมีสิ่งประดิษฐ์เหล่านี้ก่อนที่คุณจะพยายามสร้างสิ่งนี้ คุณสามารถตรวจสอบที่เก็บในเครื่องของคุณได้แล้วและลองสร้างใหม่อีกครั้ง นอกจากนี้คุณสามารถระบุตำแหน่งที่เก็บในเครื่องของคุณอยู่ในsettings.xml(ดูที่นี่ )
mystarrocks

แม้ว่าฉันจะไม่ได้ระบุที่เก็บของฉันในไฟล์ settings.xml แต่ก็เป็นค่าเริ่มต้นที่ Maven ตั้งค่าให้ฉัน - ~ / .m2 / repository ฉันต้องระบุแม้ว่าจะเป็นค่าเริ่มต้นหรือไม่?
Dave

สำหรับฉันมีไฟล์อื่น ๆ ในที่เก็บในเครื่องของฉันเช่น * .sha1 หรือ * .lastUpdate ลบไฟล์อื่น ๆ ยกเว้น * .jar และ * .pom จะป้องกันไม่ให้ maven ดาวน์โหลดไฟล์ซ้ำจากที่เก็บระยะไกล
Harun

คำตอบ:


47

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

สังเกตว่าพฤติกรรมนี้ถูกควบคุมโดยupdatePolicyคำสั่งในคอนฟิกูเรชันที่เก็บ (ซึ่งเป็นdailyค่าดีฟอลต์สำหรับที่เก็บสแน็ปช็อต)


16
เป็นไปได้ไหมที่จะ "เขียนทับ" สิ่งนี้ด้วยอาร์กิวเมนต์คำสั่งคอนโซล ชอบ: mvn clean install -FORCE_COMMAND
Naxos84

21
"แก่เกินไป" แปลว่าอะไร? มันเลือกภาพรวมใหม่ล่าสุดที่สามารถค้นหาได้ไม่ว่าจะเป็นในเครื่องหรือระยะไกล? นั่นจะเป็นพฤติกรรมที่น่ากลัวอย่างแน่นอน ถ้าฉันเพิ่งสร้างสแนปชอตฉันต้องการใช้สิ่งนั้นจริงๆไม่ใช่สิ่งที่สร้าง CI สร้างขึ้นในอีกสักครู่
Tom Quarendon

กรุณาอธิบายเพิ่มเติมว่า "Too old" แปลว่าอะไร?
đóCôngBằng

34

ใช้mvn --helpและคุณสามารถดูรายการตัวเลือก

มีตัวเลือกเช่น -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

ดังนั้นใช้คำสั่งmvn install -nsuสามารถบังคับให้คอมไพล์กับที่เก็บโลคัล


10
คุณยังสามารถใช้-oสำหรับพฤติกรรม maven "ออฟไลน์" ได้
Sean

8
อ็อพชัน -nsu ไม่ได้ป้องกันไม่ให้ mvn พยายามและไม่สามารถดาวน์โหลดอาร์ติแฟกต์จากระยะไกลได้หากยังไม่ได้ดาวน์โหลดแทนการใช้บิลด์โลคัลเหมือนตอนที่สร้างและติดตั้งสิ่งประดิษฐ์ในเครื่อง -
user1767316

ฉันมีปัญหาเดียวกันกับสิ่งประดิษฐ์ที่ยังไม่ได้ดาวน์โหลดและสิ่งนี้ได้รับการแก้ไขให้ฉัน: maven.apache.org/general.html#importing-jars
Luigi Cristalli

16

อย่างแท้จริงบังคับ Maven ไปเพียงใช้ repo mvn <goals> -oท้องถิ่นของคุณคุณสามารถทำงานกับ แม-oเวนบอกให้คุณทำงานแบบ "ออฟไลน์" และมันจะไม่อยู่ในเครือข่าย


5
อ็อพชัน -o ไม่ได้ป้องกันไม่ให้ mvn พยายามและไม่สามารถดาวน์โหลดอาร์ติแฟกต์จากระยะไกลหากยังไม่ได้ดาวน์โหลดแทนที่จะใช้บิลด์โลคัลเหมือนตอนที่สร้างและติดตั้งอาร์ติแฟกต์ในเครื่อง
user1767316

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

หรือแม้ว่าคุณจะไม่เคยสร้างโครงการคุณก็สามารถเตรียมการสร้างแบบออฟไลน์ได้ด้วยmvn dependency:go-offline
Aldian

จะเกิดอะไรขึ้นถ้าคุณมีสำเนาในเครื่องที่คุณเพิ่งติดตั้ง (ดังนั้นจึงไม่เคยปรับใช้ / พร้อมใช้งานใน repo สแน็ปช็อตระยะไกล)
Vivek Chavda

1
อ่าฉันเพิ่งสร้างโปรเจ็กต์ pom ที่มีคอลเลกชันของการอ้างอิง แต่ไม่ได้ระบุ <type> pom </type> ในโปรเจ็กต์การบริโภคดังนั้นจึงกำลังมองหา jar (และแน่นอนว่าหาไม่เจอแม้แต่ ในโหมดออฟไลน์)
Vivek Chavda

5

ทำตามขั้นตอนด้านล่าง:

    1. ตรวจสอบให้แน่ใจว่าได้ลบเนื้อหาทั้งหมดของโฟลเดอร์ jar ที่อยู่ในเครื่องของคุณยกเว้น jar ที่คุณต้องการเก็บไว้
      ตัวอย่างเช่นไฟล์เช่น. repositories, .pom, .sha1, .lastUpdated เป็นต้น
    1. ดำเนินการmvn clean install -oคำสั่ง

สิ่งนี้จะช่วยในการใช้ไฟล์ jar ที่เก็บในเครื่องแทนที่จะเชื่อมต่อกับที่เก็บใด ๆ


1
การลบอย่างเดียว*.repositoriesและ*.sha1ไฟล์ใช้ได้ผลสำหรับฉัน
DLight

4

ในกรณีของฉันฉันมีโครงการหลายโมดูลเหมือนคุณ ฉันต้องเปลี่ยน ID กลุ่มของหนึ่งในไลบรารีภายนอกโครงการของฉันขึ้นอยู่กับดังที่แสดงด้านล่าง

จาก:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

ถึง:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

ให้ความสนใจกับส่วน <groupId> ปรากฎว่าฉันลืมที่จะแก้ไขส่วนที่เกี่ยวข้องของโมดูลย่อยที่กำหนดการอ้างอิงนี้ในไฟล์ pom ของพวกเขา

มันทำให้ฉันคลั่งไคล้มากเพราะมีโมดูลอยู่ในเครื่อง


2

ตัวเลือก -o ใช้งานไม่ได้สำหรับฉันเนื่องจากสิ่งประดิษฐ์ยังอยู่ในระหว่างการพัฒนาและยังไม่ได้อัปโหลดและ maven (3.5.x) ยังคงพยายามดาวน์โหลดจากที่เก็บระยะไกลเนื่องจากเป็นครั้งแรกตามข้อผิดพลาดที่ฉันได้รับ

อย่างไรก็ตามสิ่งนี้ได้รับการแก้ไขสำหรับฉัน: https://maven.apache.org/general.html#importing-jars

หลังจากติดตั้งด้วยตนเองแล้วไม่จำเป็นต้องใช้ตัวเลือกออฟไลน์เช่นกัน

อัปเดต

ฉันเพิ่งสร้างการอ้างอิงขึ้นมาใหม่และฉันต้องนำเข้าอีกครั้ง: ปกติmvn clean installไม่เพียงพอสำหรับฉัน


2

แม้ว่าเมื่อพิจารณาคำตอบทั้งหมดข้างต้นคุณอาจยังพบปัญหาที่จะยุติการสร้างออฟไลน์ maven ของคุณด้วยข้อผิดพลาด โดยเฉพาะอย่างยิ่งคุณอาจได้รับคำเตือนเป็น follwos:

[WARNING] The POM for org.apache.maven.plugins:maven-resources-plugin:jar:2.6 is missing, no dependency information available

คำเตือนจะตามมาทันทีด้วยข้อผิดพลาดเพิ่มเติมและ maven จะสิ้นสุดลง

สำหรับเราวิธีที่ปลอดภัยที่สุดในการสร้างออฟไลน์ด้วยแคชออฟไลน์ maven ที่สร้างขึ้นตามคำแนะนำด้านบนคือการใช้พารามิเตอร์ maven ออฟไลน์ต่อไปนี้:

mvn -o -llr -Dmaven.repo.local=<path_to_your_offline_cache> ...

โดยเฉพาะอย่างยิ่งตัวเลือก-llrป้องกันไม่ให้คุณต้องปรับแต่งแคชในเครื่องของคุณตามที่เสนอไว้ในคำตอบ # 4

ดูแลด้วยว่าพารามิเตอร์ localRepository ใน settings.xml ถูกตั้งค่าดังนี้:

<localRepository>${user.home}/.m2/repository</localRepository>

0

ฉันมีปัญหาเดียวกันแน่นอน ทำงานmvn clean installแทนการmvn clean compileแก้ไข ความแตกต่างจะเกิดขึ้นเฉพาะเมื่อใช้ multi-maven-project เนื่องจากการอ้างอิงโปรเจ็กต์ถูกอัปโหลดไปยังที่เก็บโลคัลโดยใช้การติดตั้ง


-1

Maven จะตรวจสอบที่เก็บในเครื่องของคุณก่อนเสมออย่างไรก็ตามการอ้างอิงของคุณจะต้องได้รับการติดตั้งในที่เก็บของคุณเพื่อให้ maven ค้นหาได้

รันmvn installในโมดูลการพึ่งพาของคุณก่อนจากนั้นจึงสร้างโมดูลที่พึ่งพาของคุณ


1
ฉันได้แก้ไขคำถามของฉันเพื่อแสดงว่าอาร์ติแฟกต์นั้นอยู่ใน repo (สังเกตคำสั่ง "ls -al" ที่ฉันเรียกใช้ แต่ Maven ก็พยายามดาวน์โหลดอยู่ดีมีแนวคิดอื่น ๆ อีกไหม
Dave

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