ฉันจะกำหนดค่า Maven สำหรับการพัฒนาออฟไลน์ได้อย่างไร


117

maven ต้องการการเชื่อมต่ออินเทอร์เน็ตในบางจุดเพื่อให้สามารถใช้งานได้หรือไม่? ความหมายโดยเฉพาะการรับปลั๊กอิน maven ภายในสำหรับการรวบรวมทำความสะอาดบรรจุภัณฑ์ ฯลฯ ?


คุณมีเครื่องที่เชื่อมต่ออินเทอร์เน็ตหรือไม่? อาจจะเป็นเซิร์ฟเวอร์?
Marcelo

2
เราทำ แต่เพื่อให้ได้สิ่งต่างๆจากที่นั่นไปสู่สภาพแวดล้อมการพัฒนานั้นเป็นเรื่องที่น่าเบื่อ

คำตอบ:


163

คุณสามารถเรียกใช้ Maven mvn -o installในโหมดออฟไลน์ แน่นอนว่าอาร์ติแฟกต์ใด ๆ ที่ไม่มีในที่เก็บในเครื่องของคุณจะล้มเหลว Maven ไม่ได้ระบุไว้ในที่เก็บแบบกระจาย แต่แน่นอนว่ามันทำให้สิ่งต่างๆราบรื่นยิ่งขึ้น ด้วยเหตุนี้ร้านค้าจำนวนมากจึงใช้กระจกภายในที่ซิงค์กับ repos ส่วนกลางทีละน้อย

นอกจากนี้ยังmvn dependency:go-offlineสามารถใช้เพื่อให้แน่ใจว่าคุณได้ติดตั้งการอ้างอิงทั้งหมดไว้ในเครื่องก่อนที่คุณจะเริ่มทำงานแบบออฟไลน์


ไม่เข้าใจกับคำตอบนี้ฉันพบว่า mvn มาพร้อมกับปลั๊กอิน "core" (เช่นคอมไพเลอร์) ดังนั้นด้วยการติดตั้ง mvn ฉันจะได้สิ่งที่ต้องการ

8
นอกจากนี้คุณยังสามารถใช้ "mvn dependency: go-offline" เพื่อให้แน่ใจว่าการอ้างอิงทั้งหมดที่อ้างถึงใน pom.xml ของคุณมีอยู่ในที่เก็บในเครื่องของคุณ
Thorbjørn Ravn Andersen

10
น่าเสียดายที่mvn dependency:go-offlineไม่สามารถจับทุกอย่างได้ ตัวอย่างเช่นภายในเครื่องเสมือนใหม่โครงการของฉันยังคงต้องดาวน์โหลดสิ่งต่างๆแม้ว่าจะดำเนินการตามเป้าหมายนี้แล้วก็ตาม ดูปัญหานี้ด้วย
phs

2
ประสบการณ์ของฉันแสดงให้เห็นว่าตัวเลือก -o ทำงานไม่ถูกต้องและเป้าหมายออฟไลน์ยังไม่เพียงพอที่จะอนุญาตการสร้างออฟไลน์เต็มรูปแบบ: ดูวิธีแก้ปัญหาที่ฉันพบที่นี่: stackoverflow.com/q/43661755/1767316
user1767316

หากคุณเพิ่มแฟล็ก -llr เพิ่มเติมใน -o ก็ควรใช้งานได้
Udo

10

หากคุณมีพีซีที่เข้าถึงอินเทอร์เน็ตใน LAN ของคุณคุณควรติดตั้งที่เก็บ Maven ในเครื่อง

ผมขอแนะนำให้Artifactory โอเพนซอร์ส นี่คือสิ่งที่เราใช้ในองค์กรของเรามันง่ายมากในการติดตั้ง

Artifactory ทำหน้าที่เป็นพร็อกซีระหว่างเครื่องมือสร้างของคุณ (Maven, Ant, Ivy, Gradle เป็นต้น) และโลกภายนอก

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

โดยจะบล็อกคำขอภายนอกที่ไม่ต้องการ (และบางครั้งก็มีความอ่อนไหวด้านความปลอดภัย) สำหรับสิ่งประดิษฐ์ภายในและควบคุมวิธีการและสถานที่ที่จะใช้งานอาร์ติแฟกต์และโดยใคร

หลังจากตั้งค่า Artifactory แล้วคุณเพียงแค่ต้องเปลี่ยน Maven settings.xmlในเครื่องพัฒนา:

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <mirrors>
    <mirror>
      <mirrorOf>*</mirrorOf>
      <name>repo</name>
      <url>http://maven.yourorganization.com:8081/artifactory/repo</url>
      <id>repo</id>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-release</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-snapshot</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>plugins-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-release</url>
        </pluginRepository>
        <pluginRepository>
          <snapshots />
          <id>snapshots</id>
          <name>plugins-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-snapshot</url>
        </pluginRepository>
      </pluginRepositories>
      <id>artifactory</id>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

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


ไม่มีเครื่องที่มีการเข้าถึงที่เชื่อมต่อกับ LAN

2
ด้วย Artifactory คุณสามารถสำรองที่เก็บข้อมูลทั้งหมดของคุณแล้วเรียกคืนในพีซีเครื่องใดเครื่องหนึ่งที่อยู่ใน LAN
Marcelo

7

คุณมีสองทางเลือกสำหรับสิ่งนี้:

1. ) ทำการเปลี่ยนแปลงในsettings.xmlเพิ่มสิ่งนี้ในแท็กแรก

<localRepository>C:/Users/admin/.m2/repository</localRepository>

2. ) ใช้แท็ก -o สำหรับคำสั่งออฟไลน์

mvn -o clean install -DskipTests=true
mvn -o jetty:run

6

Maven ต้องการการอ้างอิงในที่เก็บในเครื่องของคุณ วิธีที่ง่ายที่สุดในการเข้าถึงคือการเข้าถึงอินเทอร์เน็ต (หรือยากกว่าโดยใช้โซลูชันอื่นที่ให้ไว้ที่นี่)

สมมติว่าคุณสามารถเข้าถึงอินเทอร์เน็ตได้ชั่วคราวคุณสามารถเตรียมออฟไลน์ได้โดยใช้ปลั๊กอิน maven-dependency ที่มีการพึ่งพา:เป้าหมายออฟไลน์ สิ่งนี้จะดาวน์โหลดการอ้างอิงโปรเจ็กต์ทั้งหมดของคุณไปยังที่เก็บในเครื่องของคุณ (แน่นอนว่าการเปลี่ยนแปลงในการอ้างอิง / ปลั๊กอินจะต้องมีการเข้าถึงอินเทอร์เน็ต / ที่เก็บส่วนกลางใหม่)


4

น่าเศร้าที่dependency:go-offlineไม่ได้ผลสำหรับฉันเพราะมันไม่ได้แคชทุกอย่างเช่น ไฟล์ POMs และอื่น ๆ ที่กล่าวถึงการอ้างอิงโดยปริยาย

วิธีแก้ปัญหาคือระบุตำแหน่งที่เก็บโลคัลไม่ว่าจะภายในsettings.xmlไฟล์ที่มี<localRepository>...</localRepository>หรือโดยรันmvnด้วย-Dmaven.repo.local=...พารามิเตอร์ หลังจากสร้างโปรเจ็กต์เริ่มต้นแล้วอาร์ติแฟกต์ที่จำเป็นทั้งหมดควรถูกแคชจากนั้นคุณสามารถอ้างอิงตำแหน่งที่เก็บได้ด้วยวิธีเดียวกันในขณะที่รัน Maven build ในโหมดออฟไลน์ ( mvn -o ...)


3

ก่อนที่จะออฟไลน์คุณต้องตรวจสอบให้แน่ใจว่าทุกอย่างอยู่ใน repo ในพื้นที่ของคุณซึ่งจำเป็นในขณะทำงานแบบออฟไลน์ การเรียกใช้ "mvn dependency: go-offline" สำหรับโปรเจ็กต์ / pom (s) ที่คุณตั้งใจจะดำเนินการจะช่วยลดความพยายามในการบรรลุเป้าหมายนี้

แต่โดยปกติแล้วจะไม่ใช่เรื่องราวทั้งหมดเนื่องจากการพึ่งพา: ออฟไลน์จะดาวน์โหลดเฉพาะปลั๊กอิน "bare build" เท่านั้น (การใช้งานออฟไลน์ / ปลั๊กอินแก้ไขไม่ได้แก้ปัญหาการพึ่งพาปลั๊กอินทั้งหมด ) ดังนั้นคุณต้องหาวิธีดาวน์โหลดปลั๊กอิน deploy / test / site (และอื่น ๆ ) และการอ้างอิงลงใน repo ของคุณ

นอกจากนี้การพึ่งพา: go-offline ไม่ดาวน์โหลดสิ่งประดิษฐ์ pom´s เองดังนั้นคุณต้องพึ่งพา: คัดลอกถ้าจำเป็น

บางครั้ง - ตามที่ MaDa เขียน - คุณไม่รู้ว่าคุณต้องการอะไรในขณะออฟไลน์ซึ่งทำให้เป็นไปไม่ได้เลยที่จะมี repo ที่ "เพียงพอ"

อย่างไรก็ตามการมี repo ที่เติมเต็มอย่างถูกต้องคุณจะต้องเพิ่ม "<offline> true </offline>" ใน Maven´s settings.xml เพื่อออฟไลน์

อย่าเปลี่ยนโปรไฟล์ Maven (id) ที่คุณใช้เติม repo ของคุณในขณะออฟไลน์ Maven รับรู้อาร์ติแฟกต์ที่ดาวน์โหลดมาในข้อมูลเมตาด้วย "ข้อมูลประจำตัว" ซึ่งเชื่อมโยงกับ ID โปรไฟล์


3

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


1
ในทำนองเดียวกัน - Eclipse is Window -> Preferences -> Mavenและเลือก "Offline"
Stuart Brock

2

สิ่งนี้เหมาะกับคุณหรือไม่?

http://jojovedder.blogspot.com/2009/04/running-maven-offline-using-local.html

อย่าลืมเพิ่มลงในที่เก็บปลั๊กอินของคุณและชี้ url ไปที่ใดก็ได้ที่เก็บของคุณ

<repositories>
    <repository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </pluginRepository>
</pluginRepositories>

หากไม่เป็นเช่นนั้นคุณอาจต้องเรียกใช้เซิร์ฟเวอร์ภายในเช่น apache บนเครื่องของคุณ


ดูเหมือนว่าจะมีมากขึ้นสำหรับการอ้างอิงและปลั๊กอินเช่นปลั๊กอินท่าเทียบเรือแมวตัวผู้และอื่น ๆ ฉันกังวลมากขึ้นเกี่ยวกับปลั๊กอิน maven ภายในเช่น maven-compiler-plugin

1
@predhme: วิธีนี้ใช้ได้กับปลั๊กอินทั้งหมดเนื่องจากสิ่งเหล่านี้ทั้งหมดจะเข้าสู่ที่เก็บ maven ในเครื่องของคุณ
JoseK

2


(ที่มา: jfrog.com )

หรือ

เพียงแค่ใช้เซิร์ฟเวอร์ที่เก็บ Maven เช่น Sonatype Nexus http://www.sonatype.org/nexus/หรือ JFrog Artifactory https://www.jfrog.com/artifactory/

หลังจากนักพัฒนารายหนึ่งสร้างโปรเจ็กต์แล้วการสร้างโดยนักพัฒนารายต่อไปมิฉะนั้น Jenkins CI จะไม่ต้องการการเข้าถึงอินเทอร์เน็ต

เซิร์ฟเวอร์ที่เก็บ Maven ยังสามารถกำหนดค่าพร็อกซีเพื่อเข้าถึง Maven Central (หรือที่เก็บสาธารณะที่จำเป็นมากกว่า) และสามารถมีรายการสิ่งประดิษฐ์ที่ถูก cynch'ed ในที่เก็บระยะไกล


1

ประสบการณ์ของฉันแสดงให้เห็นว่าตัวเลือก -o ทำงานไม่ถูกต้องและเป้าหมายออฟไลน์ยังไม่เพียงพอที่จะอนุญาตการสร้างออฟไลน์แบบเต็ม:

วิธีแก้ปัญหาที่ฉันสามารถตรวจสอบได้รวมถึงการใช้--legacy-local-repositoryตัวเลือก maven แทนที่จะเป็น-o(ออฟไลน์) และการใช้ที่เก็บในเครื่องแทนที่เก็บการแจกจ่าย

นอกจากนี้ฉันต้องคัดลอกทุกmaven-metadata-maven2_central.xmlไฟล์ของ local-repo ลงในmaven-metadata.xmlแบบฟอร์มที่ maven คาดไว้

ดูวิธีการแก้ปัญหาที่ผมพบที่นี่


0

ตอบคำถามของคุณโดยตรง: ไม่จำเป็นต้องเชื่อมต่ออินเทอร์เน็ต แต่เข้าถึงที่เก็บบน LAN หรือดิสก์ภายใน (ใช้คำแนะนำจากบุคคลอื่นที่โพสต์ที่นี่)

หากโปรเจ็กต์ของคุณไม่ได้อยู่ในช่วงสุกงอมนั่นหมายความว่าเมื่อ POM มีการเปลี่ยนแปลงค่อนข้างบ่อยโหมดออฟไลน์จะไม่สามารถใช้งานได้จริงเนื่องจากคุณจะต้องอัปเดตที่เก็บของคุณค่อนข้างบ่อยเช่นกัน เว้นแต่คุณจะได้รับสำเนาของที่เก็บที่มีทุกสิ่งที่คุณต้องการ แต่คุณจะรู้ได้อย่างไร? โดยปกติคุณจะเริ่มต้นที่เก็บตั้งแต่เริ่มต้นและจะถูกโคลนทีละน้อยในระหว่างการพัฒนา (บนคอมพิวเตอร์ที่เชื่อมต่อกับที่เก็บอื่น) สำเนาของที่เก็บสาธารณะ repo1.maven.org มีน้ำหนักหลายร้อยกิกะไบต์ดังนั้นฉันจึงไม่แนะนำให้ใช้กำลังดุร้ายเช่นกัน


มันเป็น แต่ไม่ใช่โครงการ maven (มด) ดังนั้นฉันจึงมี libs ทั้งหมดที่ฉันต้องการ แต่สงสัยเป็นพิเศษเกี่ยวกับ libs ภายใน maven เช่น maven-plugin-compiler.

หากคุณมีการอ้างอิงทั้งหมดที่จัดการโดย Ant คุณอาจจะขาดข้อมูลเมตาของ Maven อยู่ดีดังนั้น Maven จะไม่หยิบมันขึ้นมา สำหรับ "Maven internal libs" วิธีเดียวในการดาวน์โหลดคือสร้างโครงสร้าง pom ของคุณและเรียกใช้บนคอมพิวเตอร์ที่เชื่อมต่ออินเทอร์เน็ต การ "เรียกใช้" หมายถึงการดำเนินการทุกเป้าหมายที่คุณคิดว่าจะใช้ไม่จำเป็นต้องเป็น "mvn clean install" เท่านั้น
MaDa

0

ในการเตรียมตัวก่อนทำงานออฟไลน์เพียงแค่เรียกใช้ mvn dependency:go-offline


0

ปลั๊กอินใหม่ดูเหมือนจะแก้ไขข้อบกพร่องของmvn dependency:go-offline:

https://github.com/qaware/go-offline-maven-plugin

เพิ่มใน pom mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependenciesของคุณทำงานแล้ว เมื่อคุณตั้งค่าการอ้างอิงแบบไดนามิกทั้งหมดแล้ว maven จะไม่พยายามดาวน์โหลดอะไรอีก (จนกว่าคุณจะอัปเดตเวอร์ชัน)


-2
<offline> false </offline>

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

ถึง

<offline> true <offline>

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

เปลี่ยนแท็กออฟไลน์จากเท็จเป็นจริง

จะดาวน์โหลดจาก repo ออนไลน์

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