2012-04-09 15 views
6

Attualmente sono nel bel mezzo della conversione di un grande progetto multi-modulo (~ 100 sottomoduli) per utilizzare Maven. Attualmente usiamo Ant + Ivy.Gestione delle dipendenze native più intelligente con Maven

Finora non sono emersi problemi importanti e sono a mio agio che Maven è ancora una buona idea. Tuttavia, mi chiedo se esiste un modo migliore per gestire le dipendenze native.

Finora sono giunto alle seguenti conclusioni.

  1. È meglio installare ciascuna dipendenza nativa nel repository Maven come libreria autonoma o pacchetto archiviato contenente più dipendenze.
  2. Piuttosto che perdersi nel dichiarare ogni dipendenza con il plugin di dipendenza Maven, ho optato per dare ad ogni un classificatore (ad esempio nativi-win32) e utilizzare il seguente nella POM genitore:

     <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-dependency-plugin</artifactId> 
         <version>2.4</version> 
         <executions> 
          <execution> 
           <id>copy</id> 
           <phase>compile</phase> 
           <goals> 
            <goal>copy-dependencies</goal> 
           </goals> 
           <configuration> 
            <includeScope>runtime</includeScope> 
            <includeClassifiers>natives-win32</includeClassifiers> 
            <outputDirectory>${project.build.directory}/natives</outputDirectory> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
    

Finora questa sembra essere una semplice soluzione a tutto tondo che non richiede troppi problemi per aggiungere nuove dipendenze native. Mi offre anche una soluzione a tutto tondo per la gestione dei nativi. L'unica cosa che devo fare è assicurarsi che la mia directory/native/sia definita su java.library.path.

Una cosa che mi dà fastidio (un po ') di questo approccio è che tutte le mie dipendenze native vengono copiate in ogni sottomodulo che esprime una dipendenza transitiva su di esse, mentre le mie librerie jar felici vengono aggiunte al classpath a cui si fa riferimento dove si siedono nel mio deposito locale (nessuna copia richiesta).

Non c'è modo di essere più intelligente su questo e di far riferimento ai miei nativi dalla loro posizione di repository (presumendo che non li abbia archiviati, cioè dll). Ciò farebbe risparmiare un mucchio di copie inutili.

Ci sono altri potenziali trucchi che dovrei preoccuparmi dell'approccio sopra riportato?

+0

Come hai risolto via Ivy? Il modo in cui l'hai descritto? – khmarbaise

+0

Sembra essere risolto abbastanza male con le nostre configurazioni Ivy. Innanzitutto, le configurazioni di debug/run per eclipse impostano le dipendenze di runtime facendo riferimento a ciascuna di esse in un repository condiviso che è una directory mappata su ogni macchina degli sviluppatori. Quando vengono implementati o testati, gli script delle formiche prendono il sopravvento e spostano le dipendenze secondo necessità. È un bel casino. – S73417H

+0

Hmmm, mi piace la tua soluzione.Sembra che quello che vuoi veramente sia un ulteriore obiettivo del plugin delle dipendenze che imposta una proprietà come elenco di path delle dipendenze risolte. Quello sarebbe l'ultimo pezzo del puzzle. Dovrebbe essere facile, perché non prendere una coltellata in un patch? Suonami se riesci a scrivere una tale patch e darò un'occhiata a come applicarla. –

risposta

0

Ho finito per usare il maven natives plugin e ho a che fare con il fatto che ho copie ridondanti delle librerie native intorno al luogo. Il motivo è dovuto principalmente alla semplicità offerta dal plug-in e al fatto che ha anche un plug-in di eclissi relativo che consente di impostare i nativi negli ambienti di eclipse degli sviluppatori senza alcun intervento.

+0

Per la cronaca, ho biforcato il plugin di mavennatives e ho migliorato la cosa. Offre le stesse funzionalità e alcuni miglioramenti di velocità non scaricando le dipendenze non correlate alla tua piattaforma e molto altro. Trova nativedependencies-maven-plugin qui se interessato: https://github.com/fmarot/nativedependencies-maven –

0

Lo snippet mostra un obiettivo collegato a una fase di costruzione, non una dipendenza. L'obiettivo 'copia le dipendenze' in un super-pom ed è ereditato da tutti i moduli? Non c'è modo di spostarlo solo sui moduli che verranno eseguiti/pacchettizzati come app?

0

Potrebbe essere che non ce l'ho. Ma perché non distribuire tutte le librerie native nel repository all'inizio. Se le librerie native sono stabili e cambiano raramente, ciò potrebbe essere fatto in un reattore separato.

E successivamente si fa riferimento a tali dipendenze native semplicemente tramite GAV come qualsiasi altra dipendenza. Anche il problema di una copia non necessaria viene risolto da questo.

Problemi correlati