2015-12-10 14 views
7

Posso configurare Maven per scegliere la dipendenza "più recente" su un conflitto, anziché "più vicina"?Maven imposta la strategia di mediazione delle dipendenze più recente che più vicina

L ' "ultimo" è l'impostazione predefinita di edera e altri manager di dipendenza sensibile, vedere http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

trovo la strategia "più vicino" raramente è quello che voglio.

Utilizzo Maven 3.3.3, ma è possibile passare da una versione all'altra se necessario.

So come ignorare la scelta di Maven sui singoli conflitti, ma preferirei modificare l'impostazione predefinita in modo da non dover rilevare e correggere ogni conflitto uno alla volta.

(vedere the Maven docs su "Dipendenza mediazione")

+1

Se si dice che raramente non si desidera è un'opinione. Per quanto ne so non c'è un modo semplice per cambiare questo comportamento ... Quello che puoi fare è fornire una patch che modifichi il comportamento in Maven Core ... Per rilevare tali cose puoi usare le regole di enforcer per identificare tali situazioni .. .. – khmarbaise

+2

[Questa discussione] (http://maven.40175.n5.nabble.com/Adding-support-for-new-dependency-mediation-strategy-td5768185.html) su un precedente tentativo di aggiungere questa funzionalità a Maven vale la pena leggere – heenenee

+3

Grazie, @heenenee. Ora vedo perché Maven non si è affatto evoluto negli ultimi 10 anni o giù di lì, sembra essere completamente moribondo. Forse cercherò di passare il mio progetto a SBT, che ha la più recente risoluzione dei conflitti di dipendenza e può utilizzare Maven deps ed è supportato da IntelliJ. – Rich

risposta

2

Posso configurare Maven utilizzare automaticamente la versione "recente" di una dipendenza al posto dei "più vicino", quando risolvere i conflitti di versione?

No, non è possibile configurare la strategia di mediazione dipendenza Maven per qualcosa di diverso da più vicino.

Aggiunta configurable dependency mediation strategies has been proposed before, ma alla fine è stato abbandonato perché la proposta implicava la modifica del POM XSD, che non è accaduto da anni.

Perché Maven utilizza la strategia più vicina come predefinita?

La strategia del più vicino è favorita da Maven per due motivi:

  1. Facile prioritario di conflitti individuali: Per ogni particolare in conflitto dipendenza, è possibile specificare la sua versione all'interno della propria POM, e quella versione diventa la più vicina.
  2. riproducibile costruisce: Questo sarebbe veramente un risultato di avere version ranges in qualsiasi punto grafo delle dipendenze, ma una strategia di mediazione di "più recente" sarebbe certamente magnificare l'impatto di qualsiasi intervallo versione sul accumulo riproducibilità.

Ma io voglio davvero una diversa strategia di mediazione delle dipendenze. Cosa posso fare?

questi sono i tuoi migliori opzioni:

  1. Fai un prolungamento Maven: Uso della strategia "più vicino" è specificato da NearestVersionSelector in MavenRepositorySystemUtils. Puoi create your own Maven extension che definisce il tuo VersionSelector che implementa la strategia di tua scelta, quindi nel metodo afterSessionStart del tuo interno, sostituisci lo DependencyGraphTransformer della sessione con uno che utilizza il tuo VersionSelector personalizzato.
  2. Passare a un altro strumento di costruzione: Ovviamente.
+0

Grazie. Un plug-in di compilazione potrebbe non sovrascrivere questo comportamento? Ciò darebbe un percorso per cambiare questo senza cambiare il POM XSD. – Rich

+0

Questo commento suggerisce che un plugin di build non può cambiare le dipendenze: "Maven 3.x ha introdotto modifiche nella risoluzione delle dipendenze che rende impossibile il funzionamento ottimale di questo plugin.In Maven 3.x tutte le dipendenze vengono risolte prima che le fasi del ciclo di vita vengano avviate, rendendo impossibile che un plugin scarichi e installi le dipendenze esterne prima che Maven risolva le dipendenze del progetto. " https://github.com/UniversalMediaServer/external-maven-plugin#external-dependency-maven-plugin – Rich

+0

A cosa serve questa classe? https://github.com/apache/maven/blob/master/maven-compat/src/main/java/org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver.java – Rich

1

È inoltre possibile utilizzare la regola "requireUpperBoundDeps" per il Maven plug-in "Enforcer", che non attuerà direttamente una politica di risoluzione dei conflitti "più nuove vittorie", ma applicherà che il risultato finale è lo stesso. Dovrai aggiungere manualmente le regole di dipendenza transitoria <exclusions> o <dependencyManagement> al tuo POM per scegliere la più recente dipendenza in ogni conflitto, ma almeno avrai la certezza che il risultato finale è "le nuove vincite".

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.4.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <requireUpperBoundDeps /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
Problemi correlati