Làm cách nào để định cấu hình Maven để phát triển ngoại tuyến?


117

Có phải maven yêu cầu kết nối với internet tại một số điểm để có thể sử dụng nó? Có nghĩa là cụ thể nhận được các plugin maven nội bộ để biên dịch, làm sạch, đóng gói, vv?


Bạn có máy tính nào có truy cập internet không? Có lẽ là một máy chủ?
Marcelo

2
Chúng tôi làm, nhưng để có được những thứ từ đó đến môi trường phát triển thì tốt, tẻ nhạt.

Câu trả lời:


163

Bạn có thể chạy maven trong chế độ ngoại tuyến mvn -o install. Tất nhiên mọi hiện vật không có sẵn trong kho lưu trữ cục bộ của bạn sẽ thất bại. Maven không được xác nhận trên các kho lưu trữ phân tán, nhưng chúng chắc chắn làm cho mọi thứ liền mạch hơn. Vì lý do này mà nhiều cửa hàng sử dụng gương bên trong được đồng bộ hóa tăng dần với các repos trung tâm.

Ngoài ra, mvn dependency:go-offlinecó thể được sử dụng để đảm bảo bạn có tất cả các phụ thuộc được cài đặt cục bộ trước khi bạn bắt đầu làm việc ngoại tuyến.


Không đồng ý với câu trả lời này, tôi phát hiện ra rằng mvn đi kèm với các plugin "cốt lõi" của nó (tức là trình biên dịch). Vì vậy, với cài đặt mvn tôi có thể nhận được những gì tôi cần.

8
Ngoài ra, hãy xem xét bạn có thể sử dụng "phụ thuộc mvn: go-offline" để đảm bảo tất cả các phụ thuộc được đề cập trong tệp pom.xml của bạn có trong kho lưu trữ cục bộ của bạn.
Thorbjørn Ravn Andersen

10
Thật không may, mvn dependency:go-offlineđơn giản là không nắm bắt được mọi thứ. Ví dụ, bên trong một máy ảo mới, dự án của tôi vẫn phải tải xuống mọi thứ ngay cả sau khi chạy mục tiêu này. Xem thêm vấn đề này .
phs

2
Kinh nghiệm của tôi cho thấy tùy chọn -o không hoạt động chính xác và mục tiêu ngoại tuyến không đủ để cho phép xây dựng ngoại tuyến đầy đủ: Xem giải pháp tôi tìm thấy ở đây: stackoverflow.com/q/43661755/1767316
user1767316

Nếu bạn thêm cờ -llr thêm vào -o thì nó sẽ hoạt động.
Udo

10

Nếu bạn có PC có truy cập internet trong mạng LAN, bạn nên cài đặt kho lưu trữ Maven cục bộ.

Tôi khuyên dùng Nguồn mở Artifactory . Đây là những gì chúng tôi sử dụng trong tổ chức của chúng tôi, nó thực sự dễ dàng để thiết lập.

Artifactory hoạt động như một proxy giữa công cụ xây dựng của bạn (Maven, Ant, Ivy, Gradle, v.v.) và thế giới bên ngoài.

Nó lưu trữ các tạo phẩm từ xa để bạn không phải tải đi tải lại nhiều lần.

Nó chặn các yêu cầu bên ngoài không mong muốn (và đôi khi nhạy cảm với bảo mật) đối với các tạo phẩm bên trong và kiểm soát cách thức và nơi các tạo phẩm được triển khai và của ai.

Sau khi thiết lập Artifactory, bạn chỉ cần thay đổi Maven settings.xmltrong các máy phát triển:

<?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>

Chúng tôi đã sử dụng giải pháp này vì chúng tôi gặp sự cố với truy cập internet trong các máy phát triển của mình và một số tạo phẩm đã tải xuống các tệp bị hỏng hoặc hoàn toàn không tải xuống. Chúng tôi đã không có vấn đề kể từ đó.


Không có máy nào có quyền truy cập được kết nối với mạng LAN.

2
Với artifactory, bạn có thể sao lưu toàn bộ kho lưu trữ của mình và sau đó khôi phục nó trong một trong các PC có trong mạng LAN.
Marcelo

7

Bạn có hai lựa chọn cho việc này:

1.) thực hiện các thay đổi trong tệp settings.xml thêm điều này vào thẻ đầu tiên

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

2.) sử dụng thẻ -o cho lệnh ngoại tuyến.

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

6

Maven cần các phụ thuộc trong kho lưu trữ cục bộ của bạn. Cách dễ nhất để có được chúng là truy cập internet (hoặc khó hơn bằng cách sử dụng các giải pháp khác được cung cấp ở đây).

Vì vậy, giả sử rằng bạn có thể truy cập internet tạm thời, bạn có thể chuẩn bị ngoại tuyến bằng cách sử dụng plugin phụ thuộc maven với phụ thuộc của nó : mục tiêu go-offline . Điều này sẽ tải tất cả các phụ thuộc dự án của bạn vào kho lưu trữ cục bộ của bạn (tất nhiên thay đổi trong các phụ thuộc / plugin sẽ yêu cầu truy cập kho lưu trữ internet / trung tâm mới).


4

Đáng buồn thay dependency:go-offlineđã không làm việc cho tôi vì nó đã không lưu trữ mọi thứ, tức là. Các tập tin POM và các phụ thuộc khác đề cập ngầm.

Cách giải quyết là chỉ định vị trí kho lưu trữ cục bộ , trong settings.xmltệp có <localRepository>...</localRepository>hoặc bằng cách chạy mvnvới -Dmaven.repo.local=...tham số. Sau khi xây dựng dự án ban đầu, tất cả các tạo phẩm cần thiết phải được lưu vào bộ đệm, và sau đó bạn có thể tham chiếu vị trí kho lưu trữ theo cùng một cách, trong khi chạy Maven build trong chế độ ngoại tuyến ( mvn -o ...).


3

Trước khi ngoại tuyến, bạn phải đảm bảo rằng mọi thứ đều nằm trong repo cục bộ của bạn, điều này là bắt buộc khi làm việc ngoại tuyến. Chạy "phụ thuộc mvn: go-offline" cho (các) dự án / pom (s), bạn dự định làm việc, sẽ làm giảm các nỗ lực để đạt được điều này.

Nhưng nó thường không phải là toàn bộ câu chuyện, bởi vì sự phụ thuộc: go-offline sẽ chỉ tải xuống các plugin "bản dựng trần" ( go-offline / giải quyết-plugin không giải quyết tất cả các phụ thuộc của plugin ). Vì vậy, bạn phải tìm cách tải xuống các plugin triển khai / thử nghiệm / trang web (và có thể các plugin khác) và các phụ thuộc của chúng vào repo của bạn.

Hơn nữa, sự phụ thuộc: go-offline không tải xuống chính tạo phẩm pom, vì vậy bạn phải phụ thuộc: sao chép nó nếu cần.

Đôi khi - như MaDa đã viết - bạn không biết, bạn sẽ cần gì, trong khi ngoại tuyến, điều này khiến cho việc có một repo "đủ" là điều không thể.

Dù sao, có một repo được điền đúng cách, bạn chỉ phải thêm "<offline> true </ offline>" vào tệp cài đặt Maven ERICs để ngoại tuyến.

Không thay đổi hồ sơ Maven (id) bạn đã sử dụng để điền vào repo của mình khi đang ngoại tuyến. Maven nhận ra các tạo phẩm được tải xuống trong siêu dữ liệu của nó với một "danh tính", được liên kết với id hồ sơ.


3

Nếu bạn đang sử dụng IntelliJ, bạn chỉ cần truy cập Tùy chọn -> Xây dựng, Thực thi, Triển khai -> Công cụ xây dựng -> Maven và kiểm tra / bỏ chọn Công việc ngoại tuyến .


1
Tương tự - Eclipse là Cửa sổ -> Tùy chọn -> Maven và kiểm tra "Ngoại tuyến"
Stuart Brock

2

công việc này là dành cho bạn?

http://jojondder.blogspot.com/2009/04/rucky-maven-offline-USE-local.html

Đừng quên thêm nó vào kho lưu trữ plugin của bạn và trỏ url đến bất cứ nơi nào kho lưu trữ của bạn.

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

Nếu không, bạn có thể cần phải chạy một máy chủ cục bộ, ví dụ như apache, trên máy của bạn.


Điều đó dường như là nhiều hơn cho các phụ thuộc và plugin như các plugin, tomcat, v.v. Tôi quan tâm nhiều hơn về các plugin maven nội bộ như maven-Trình biên dịch-plugin

1
@predhme: Cách tiếp cận này sẽ hoạt động cho tất cả các plugin, vì tất cả các plugin này đều đi vào kho lưu trữ maven trên máy cục bộ của bạn
JoseK

2


(nguồn: jfrog.com )

hoặc là

Chỉ cần sử dụng các máy chủ kho lưu trữ Maven như Sonatype Nexus http://www.sonatype.org/nexus/ hoặc JFrog Artifactory https://www.jfrog.com/artifactory/ .

Sau khi một nhà phát triển xây dựng dự án, xây dựng bởi các nhà phát triển tiếp theo hoặc Jenkins CI sẽ không yêu cầu truy cập Internet.

Máy chủ kho lưu trữ Maven cũng có thể có các proxy được định cấu hình để truy cập Maven Central (hoặc các kho lưu trữ công cộng cần thiết hơn) và chúng có thể có danh sách các tạo phẩm trong các kho lưu trữ từ xa.


1

Kinh nghiệm của tôi cho thấy tùy chọn -o không hoạt động chính xác và mục tiêu ngoại tuyến không đủ để cho phép xây dựng ngoại tuyến đầy đủ:

Giải pháp tôi có thể xác thực bao gồm sử dụng --legacy-local-repositorytùy chọn maven thay vì -o(ngoại tuyến) và sử dụng kho lưu trữ cục bộ thay cho kho lưu trữ phân phối

Ngoài ra, tôi đã phải sao chép mọi maven-metadata-maven2_central.xmltệp của repo cục bộ vào maven-metadata.xmlbiểu mẫu mà maven mong đợi.

Xem giải pháp tôi tìm thấy ở đây .


0

Trả lời câu hỏi của bạn trực tiếp: nó không yêu cầu kết nối internet, nhưng truy cập vào kho lưu trữ, trên mạng LAN hoặc đĩa cục bộ (sử dụng gợi ý từ những người khác đã đăng ở đây).

Nếu dự án của bạn chưa ở giai đoạn trưởng thành, điều đó có nghĩa là khi các POM được thay đổi khá thường xuyên, chế độ ngoại tuyến sẽ rất không thực tế, vì bạn cũng sẽ phải cập nhật kho lưu trữ của mình khá thường xuyên. Trừ khi bạn có thể có được một bản sao của một kho lưu trữ có mọi thứ bạn cần, nhưng làm sao bạn biết? Thông thường, bạn bắt đầu một kho lưu trữ từ đầu và nó sẽ được nhân bản dần dần trong quá trình phát triển (trên một máy tính được kết nối với một kho lưu trữ khác). Một bản sao của kho lưu trữ công cộng repo1.maven.org nặng hàng trăm gigabyte, vì vậy tôi cũng không đề xuất vũ lực.


Nó là, nhưng không phải là một dự án maven (kiến). Vì vậy, tôi có tất cả các lib tôi cần nhưng đã tự hỏi cụ thể về libs nội bộ maven. Chẳng hạn như maven-plugin-trình biên dịch.

Nếu bạn có tất cả các phụ thuộc được xử lý bởi Ant, có thể bạn vẫn thiếu siêu dữ liệu Maven, vì vậy Maven sẽ không nhận chúng. Đối với "Maven libs nội bộ", cách duy nhất để tải xuống chúng là xây dựng cấu trúc pom của bạn và chạy nó trên một máy tính có kết nối internet. Bằng cách "chạy nó" Tôi có nghĩa là thực hiện mọi mục tiêu mà bạn nghĩ bạn sẽ sử dụng, không nhất thiết chỉ là "mvn cài đặt sạch".
MaDa

0

Để chuẩn bị trước khi làm việc ngoại tuyến, chỉ cần chạy mvn dependency:go-offline


0

Một plugin mới đã xuất hiện để khắc phục những thiếu sót của mvn dependency:go-offline:

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

Thêm nó vào pom của bạn, sau đó chạy mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Khi bạn đã thiết lập tất cả các phụ thuộc động, maven sẽ không thử tải xuống bất cứ thứ gì nữa (cho đến khi bạn cập nhật các phiên bản).


-2
<offline> false </offline>

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

đến

<offline> true <offline>

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

Thay đổi thẻ ngoại tuyến từ false thành true.

sẽ tải xuống từ repo trực tuyến

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.