Come si configura Maven per lo sviluppo offline?


117

Maven richiede una connessione a Internet ad un certo punto per poterlo utilizzare? Significa ottenere specificamente i plugin interni di Maven per la compilazione, la pulizia, il confezionamento, ecc.?


Hai qualche macchina con accesso a Internet? Forse un server?
Marcelo

2
Lo facciamo, ma portare le cose da lì all'ambiente di sviluppo è bene, noioso.

Risposte:


163

Puoi eseguire Maven in modalità offline mvn -o install. Ovviamente qualsiasi artefatto non disponibile nel tuo repository locale fallirà. Maven non è basato su repository distribuiti, ma certamente rendono le cose più semplici. È per questo motivo che molti negozi utilizzano mirror interni sincronizzati in modo incrementale con i repository centrali.

Inoltre, mvn dependency:go-offlinepuò essere utilizzato per assicurarsi che tutte le dipendenze siano installate localmente prima di iniziare a lavorare offline.


In disaccordo con questa risposta, ho scoperto che mvn viene fornito con i suoi plugin "core" (cioè compilatore). Quindi con l'installazione di mvn posso ottenere ciò di cui ho bisogno.

8
Considera inoltre che puoi usare "mvn dependency: go-offline" per assicurarti che tutte le dipendenze a cui si fa riferimento nel tuo pom.xml siano presenti nel tuo repository locale.
Thorbjørn Ravn Andersen

10
Purtroppo mvn dependency:go-offlinesemplicemente non cattura tutto. All'interno di una nuova macchina virtuale, ad esempio, il mio progetto deve ancora scaricare cose anche dopo aver eseguito questo obiettivo. Vedi anche questo numero .
phs

2
Mia esperienza dimostra che l'opzione -o non funziona correttamente e che l'obiettivo di go-offline è ben lungi dall'essere sufficiente per consentire un accumulo completo non in linea: Vedere la soluzione che ho trovato qui: stackoverflow.com/q/43661755/1767316
user1767316

Se aggiungi il flag -llr in aggiunta a -o dovrebbe funzionare.
Udo

10

Se si dispone di un PC con accesso a Internet nella LAN, è necessario installare un repository Maven locale.

Raccomando Artifactory Open Source . Questo è ciò che usiamo nella nostra organizzazione, è davvero facile da configurare.

Artifactory funge da proxy tra il tuo strumento di costruzione (Maven, Ant, Ivy, Gradle ecc.) E il mondo esterno.

Memorizza nella cache gli artefatti remoti in modo che non sia necessario scaricarli più e più volte.

Blocca le richieste esterne indesiderate (e talvolta sensibili alla sicurezza) per gli artefatti interni e controlla come e dove vengono distribuiti gli artefatti e da chi.

Dopo aver impostato Artifactory devi solo cambiare Maven settings.xmlnelle macchine di sviluppo:

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

Abbiamo utilizzato questa soluzione perché abbiamo avuto problemi con l'accesso a Internet nelle nostre macchine di sviluppo e alcuni artefatti hanno scaricato file danneggiati o non sono stati scaricati affatto. Da allora non abbiamo più avuto problemi.


Non è presente una macchina con accesso collegata alla LAN.

2
Con artifactory puoi eseguire il backup dell'intero repository e quindi ripristinarlo in uno dei PC che si trova nella LAN.
Marcelo

7

Hai due opzioni per questo:

1.) apporta modifiche nel settings.xml aggiungilo nel primo tag

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

2.) utilizzare il tag -o per il comando offline.

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

6

Maven ha bisogno delle dipendenze nel tuo repository locale. Il modo più semplice per ottenerli è con l'accesso a Internet (o più difficile utilizzando altre soluzioni fornite qui).

Quindi, supponendo che tu possa ottenere temporaneamente l'accesso a Internet, puoi prepararti a andare offline usando il plug-in di dipendenza maven con la sua dipendenza: obiettivo go-offline . Questo scaricherà tutte le dipendenze del tuo progetto nel tuo repository locale (ovviamente le modifiche alle dipendenze / plug-in richiederanno un nuovo accesso a Internet / al repository centrale).


4

Purtroppo dependency:go-offlinenon ha funzionato per me in quanto non ha memorizzato nella cache tutto, ad es. File POM e altri riferimenti impliciti alle dipendenze.

La soluzione alternativa è stata quella di specificare una posizione del repository locale , all'interno di settings.xmlfile con <localRepository>...</localRepository>o eseguendo mvncon -Dmaven.repo.local=...parametro. Dopo la compilazione iniziale del progetto, tutti gli artefatti necessari devono essere memorizzati nella cache, quindi è possibile fare riferimento alla posizione del repository nello stesso modo, mentre si esegue la compilazione Maven in modalità offline ( mvn -o ...).


3

Prima di andare offline devi assicurarti che tutto sia nel tuo repository locale, che è richiesto quando lavori offline. L'esecuzione di "mvn dependency: go-offline" per il / i progetto / i su cui intendi lavorare ridurrà gli sforzi per raggiungere questo obiettivo.

Ma di solito non è tutta la storia, perché dependency: go-offline scaricherà solo i plug -in "bare build" ( go-offline / resolver-plugins non risolve tutte le dipendenze dei plug-in ). Quindi devi trovare un modo per scaricare plugin di deploy / test / site (e forse altri) e le loro dipendenze nel tuo repository.

Inoltre dipendenza: go-offline non scarica l'artefatto stesso del pom, quindi devi dipendenza: copialo se necessario.

A volte - come ha scritto MaDa - non sai di cosa avrai bisogno, pur essendo offline, il che rende praticamente impossibile avere un repo "sufficiente".

In ogni caso, avendo un repository correttamente compilato, devi solo aggiungere "<offline> true </offline>" al settings.xml di Maven per andare offline.

Non modificare il profilo Maven (id) che hai usato per riempire il tuo repository, mentre sei offline. Maven riconosce gli artefatti scaricati nei suoi metadati con una "identità", che è associata all'ID del profilo.


3

Se stai usando IntelliJ, puoi semplicemente andare su Preferenze -> Compila, Esecuzione, Distribuzione -> Strumenti di compilazione -> Maven e selezionare / deselezionare Lavora offline .


1
Allo stesso modo - Eclipse è Finestra -> Preferenze -> Maven e seleziona "Offline"
Stuart Brock

2

Per te funziona?

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

Non dimenticare di aggiungerlo al tuo repository di plugin e puntare l'URL ovunque sia il tuo repository.

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

In caso contrario, potrebbe essere necessario eseguire un server locale, ad esempio apache, sulle macchine.


Questo sembra essere più per dipendenze e plugin come i plugin jetty, tomcat, ecc. Sono più preoccupato per i plugin interni di Maven come Maven-Compiler-Plugin

1
@predhme: questo approccio funzionerà per tutti i plugin, poiché tutti questi vanno nel repository
Maven

2


(fonte: jfrog.com )

o

Usa semplicemente i server di repository Maven come Sonatype Nexus http://www.sonatype.org/nexus/ o JFrog Artifactory https://www.jfrog.com/artifactory/ .

Dopo che uno sviluppatore ha costruito un progetto, compilato dagli sviluppatori successivi o Jenkins CI non richiederà l'accesso a Internet.

Il server di repository Maven può anche avere proxy configurati per accedere a Maven Central (o più repository pubblici necessari) e possono avere un elenco sincronizzato di artefatti nei repository remoti.


1

La mia esperienza mostra che l'opzione -o non funziona correttamente e che l'obiettivo di andare offline è lungi dall'essere sufficiente per consentire una compilazione offline completa:

La soluzione che potrei convalidare include l'uso --legacy-local-repositorydell'opzione maven piuttosto che quella -o(offline) e l'uso del repository locale al posto del repository di distribuzione

Inoltre, ho dovuto copiare tutti i maven-metadata-maven2_central.xmlfile del repository locale nel maven-metadata.xmlformato previsto da Maven.

Guarda la soluzione che ho trovato qui .


0

Rispondere direttamente alla tua domanda: non richiede una connessione a Internet, ma l'accesso a un repository, su LAN o disco locale (usa i suggerimenti di altre persone che hanno postato qui).

Se il tuo progetto non è in una fase matura, significa che quando i POM vengono cambiati abbastanza spesso, la modalità offline sarà molto poco pratica, poiché dovrai aggiornare anche il tuo repository abbastanza spesso. A meno che tu non possa ottenere una copia di un repository che ha tutto ciò di cui hai bisogno, ma come faresti a saperlo? Di solito si avvia un repository da zero e questo viene clonato gradualmente durante lo sviluppo (su un computer connesso a un altro repository). Una copia del repository pubblico repo1.maven.org pesa centinaia di gigabyte, quindi non consiglierei nemmeno la forza bruta.


Lo è, ma non come un progetto esperto (formica). Quindi ho tutte le librerie di cui ho bisogno, ma mi chiedevo specificamente di librerie interne di Maven. Come maven-plugin-compiler.

Se hai tutte le dipendenze gestite da Ant, probabilmente ti mancano comunque i metadati di Maven, quindi Maven non li raccoglierà. Per quanto riguarda le "librerie interne di Maven", l'unico modo per scaricarle è creare la struttura del tuo pom ed eseguirla su un computer connesso a Internet. Con "run it" intendo eseguire ogni target che pensi di utilizzare, non necessariamente solo "mvn clean install".
MaDa

0

In preparazione prima di lavorare offline, corri mvn dependency:go-offline


0

È apparso un nuovo plugin per correggere i difetti di mvn dependency:go-offline:

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

Aggiungilo nel tuo pom, quindi corri mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Dopo aver impostato tutte le dipendenze dinamiche, Maven non proverà a scaricare di nuovo nulla (fino a quando non aggiorni le versioni).


-2
<offline> false </offline>

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

per

<offline> true <offline>

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

Modifica il tag offline da falso a vero.

verrà scaricato dal repository in linea

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.