2015-11-05 10 views
27

Sto usando Maven 3.3.3 con Java 8 su Mac Yosemite. Ho un progetto multi-modulo.Come faccio a forzare Maven a utilizzare il mio repository locale invece di uscire dai repository remoti per recuperare gli artefatti?

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

Quando costruisco il mio uno dei miei moduli bambino, per esempio, “il mio modulo” dall'alto, l'utilizzo di “mvn clean install”, la build tenta di scaricare i manufatti modulo bambino da un repository remoto che ho definito nel mio file ~/.m2/settings.xml. L'uscita è al di sotto

[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 

Come forzo Maven per controllare il mio locale ~/.m2/repository prima di cercare di scaricare dai repository remoti? Qui di seguito è dove ho i miei repository remoti definiti nel mio file ~/.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> 

Edit: In risposta alla risposta sayhing che il download si verifica tra il manufatto non c'era, sotto è l'uscita del terminale in cui dimostro il file era lì nel mio repo ma Maven è tryihng per scaricarlo comunque ...

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 
+1

Maven _viene controllare il repository locale prima di provare a scaricare un artefatto da un repository remoto. Sei sicuro che il tuo locale avesse questi artefatti prima di provare questa build? Ora puoi ispezionare il tuo repository locale e provare comunque un'altra build. Inoltre, puoi specificare dove si trova il tuo repository locale in 'settings.xml' (vedi [qui] (https://maven.apache.org/settings.html)). – mystarrocks

+0

Sebbene non abbia specificato il mio repository nel mio file settings.xml, è l'impostazione predefinita che Maven ha impostato per me - ~/.m2/repository. Devo specificarlo anche quando è il valore predefinito? – Dave

+0

Per me ci sono altri file nei miei repository locali, come * .sha1 o * .lastUpdate. cancella altri file eccetto * .jar e * .pom impedirà a maven di scaricare nuovamente il file dal repository remoto – Harun

risposta

18

La dipendenza ha una versione di istantanea. Per le istantanee, Maven controllerà il repository locale e se l'artefatto trovato nel repository locale è troppo vecchio, tenterà di trovarne uno aggiornato nei repository remoti. Questo è probabilmente quello che stai vedendo.

Si noti che questo comportamento è controllato dalla direttiva updatePolicy nella configurazione del repository (che è daily per impostazione predefinita per archivi di istantanee).

+7

possibile "sovrascrivere" questo argomento di comando della console? Come: mvn clean install -FORCE_COMMAND – Naxos84

+2

"Troppo vecchio" significa che cosa? Prende la più recente istantanea che riesca a trovare, sia locale che remota? Sarebbe sicuramente un comportamento orribile. Ho appena creato un'istantanea, voglio davvero usare quella, non quella che la build CI ha costruito solo un momento dopo .. –

-2

Maven controlla sempre repository locale prima, però, la vostra dipendenza deve essere installato nel tuo repository perché Maven lo trovi.

Eseguire prima il modulo di dipendenza mvn install e quindi creare il modulo dipendente.

+0

Ho modificato la mia domanda per mostrare che l'artefatto è nel repository (notare il comando "ls -al" che eseguo. Maven sta tentando di scaricarlo comunque. Altre idee? – Dave

+3

@Oliver: ti manca il fatto che per gli artefatti nel repository locale, Maven può ancora consultare i repository remoti se l'artefatto è un'istantanea troppo vecchia. –

1

Nel mio caso ho avuto un progetto multi modulo proprio come te. Ho dovuto cambiare un Id di gruppo di una delle librerie esterne il mio progetto dipendeva come mostrato di seguito.

Da:

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

A:

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

Prestare attenzione alla sezione di > < groupId. Si è scoperto che mi stavo dimenticando di modificare la sezione corrispondente dei sottomoduli che definiscono questa dipendenza nei loro file pom.

Mi ha fatto impazzire perché il modulo era disponibile localmente.

8

Utilizzare mvn --help ed è possibile visualizzare l'elenco di opzioni.

C'è un'opzione come -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Quindi utilizzare il comando mvn install -nsu può forzare la compilazione con repository locale.

+0

Y Puoi anche usare '-o' per il comportamento" offline "di maven – Sean

+0

L'opzione -nsu non impedisce a mvn di provare e non riesce a scaricare un artefatto da remoto se non è stato ancora scaricato invece di usare la build locale come quando l'artefatto è stato costruito e installato localmente. - – user1767316

0

Per veramente forza Maven per solo usare il repo locale, è possibile eseguire con mvn <goals> -o. Il -o dice a Maven di farti lavorare "offline", e rimarrà fuori dalla rete.

+0

L'opzione -o non impedisce a mvn di provare e non riesce a scaricare un artefatto da remoto se non è stato ancora scaricato, invece di usare la build locale come quando la risorsa è stata creata e installata localmente. – user1767316

+2

è vero, se non hai una copia locale, sei sfortunato. Questo è utile per i progetti che hai creato in precedenza, ma potenzialmente hanno modifiche SNAPSHOT recenti di cui non ti interessa. – Sean

+0

Oppure, anche se non hai mai costruito il progetto, potresti prepararti per la sua creazione offline con 'mvn dependency: go-offline' – Aldian

Problemi correlati