2012-04-05 10 views
5

Sto utilizzando Maven 3 per creare un'applicazione java con 3 livelli: server, ejb e ui. Il progetto EJB dipende dal progetto Server e il progetto UI dipende solo da EJB e fornisce un'esclusione per la dipendenza transitiva del server.Maven Build different to Dependency Tree

Quando il progetto dell'interfaccia utente viene creato come una guerra, la dipendenza del server viene inclusa nonostante non venga visualizzata la dipendenza: comando albero.

Ecco la relativa uscita di correre mvn dependency:tree

**project.name:UI:war:1.0 SNAPSHOT** 
+- project.name:Common:jar:1.0 SNAPSHOT:compile 
| + org_common:_lib:jar:16.0.006:compile 
| | +- log4j:log4j:jar:1.2.16:compile 
| | \- commons configuration:commons configuration:jar:1.6:compile 
| |  +- commons lang:commons lang:jar:2.4:compile 
| |  +- commons digester:commons digester:jar:1.8:compile 
| |  \- commons beanutils:commons beanutils core:jar:1.8.0:compile 
| +- org_common:_security_lib:jar:16.0.006:compile 
| \- org.springframework:spring:jar:2.0:compile 
+- **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile** 
| \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile 
+- org_common:_uicomponent:jar:16.0.006:compile 

E qui è l'albero di uscita della dipendenza da quando si esegue mvn clean install -X

**project.name:UI:war:1.0 SNAPSHOT** 
+- project.name:Common:jar:1.0 SNAPSHOT:compile 
| + org_common:_lib:jar:16.0.006:compile 
| | +- log4j:log4j:jar:1.2.16:compile 
| | \- commons configuration:commons configuration:jar:1.6:compile 
| |  +- commons lang:commons lang:jar:2.4:compile 
| |  +- commons digester:commons digester:jar:1.8:compile 
| |  \- commons beanutils:commons beanutils core:jar:1.8.0:compile 
| +- org_common:_security_lib:jar:16.0.006:compile 
| \- org.springframework:spring:jar:2.0:compile 
+- **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile** 
| +- **project.name:Server:jar:1.0 SNAPSHOT:compile** 
| | +- javassist:javassist:jar:3.4.GA:compile 
| | +- project.filestore:filestore_client:jar:7.0.003:compile 
| | +- com.ibm.db2:db2jcc:jar:9.7.fp1.aix64.s091114:compile 
| | +- com.ibm.db2:db2java:jar:9.7.fp1.aix64.s091114:compile 
| | +- com.ibm.db2:db2jcc_license_cu:jar:9.7.fp1.aix64.s091114:compile 
| \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile 
+- org_common:_uicomponent:jar:16.0.006:compile 

La dipendenza Server è l'unica differenza tra i due alberi. Non dovrebbero queste due uscite essere sempre le stesse? Cosa potrebbe causare l'inclusione di una libreria che non viene visualizzata nella dipendenza: tree?

Il POM genitore definisce i moduli:

<modules> 
    <module>Server</module> 
    <module>EJB</module> 
    <module>UI</module> 
</modules> 

La dipendenza elencato nella POM EJB è:

<dependencies> 
     <dependency> 
      <groupId>project.name</groupId> 
      <artifactId>Server</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

La dipendenza nell'interfaccia utente è:

<dependencies> 
     <dependency> 
      <groupId>project.name</groupId> 
      <artifactId>EJB</artifactId> 
      <version>${project.version}</version> 
      <type>ejb-client</type> 
      <exclusions> 
       <exclusion> 
        <groupId>project.name</groupId> 
        <artifactId>Server</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
</dependencies> 

I Sono consapevole del fatto che posso escludere esplicitamente il server jar dall'essere incluso nel WAR, ma preferirei correggere l'actua l problema.

+0

Se l'interfaccia utente dipende da EJB e EJB dipende dal server, l'interfaccia utente dipende dal server. Quindi, si esclude EJB con le sue dipendenze transitive da 'WEB-INF/lib' impostando il suo ambito su' provided', o impacchettandoli tutti in guerra.Per quanto ne sappia, non c'è modo di includere nella guerra solo gli artefatti di base senza le sue dipendenze transitive. –

+0

Stai utilizzando il plug-in di dipendenza più aggiornato (2.4)? – khmarbaise

+0

@AndrewLogvinov Ecco perché ho l'esclusione sul server quando il progetto EJB viene aggiunto come dipendenza all'interfaccia utente. Il livello EJB è speciale in Maven - è suddiviso in contenitori Client e Server - il jar del Cliente da cui dipende l'IU non ha una dipendenza dal Server. Se la dipendenza transitiva è esclusa esplicitamente, perché dovrebbe essere inclusa? –

risposta

1

Come abbiamo capito nei commenti, sorgente del problema era buggy Maven 3.0.3. La versione 3.0.4 ha risolto il problema.

Il mio commento non:

Quali esatto Maven versione usi? Se non è 3.0.4, provare e dire se aiuta. Ho trovato davvero, davvero schifoso problemi durante l'utilizzo di precedenti versioni di Maven 3, per lo più con 3.0.2.

2

Hai ragione che l'uscita dovrebbe essere uguale in entrambi i casi. Tuttavia Maven 3 si è mosso verso l'utilizzo di Aether per la risoluzione delle dipendenze ma fino ad ora la dipendenza: tree utilizza il vecchio meccanismo di risoluzione delle dipendenze ed è per questo che la differenza. Controlla il seguente link per i dettagli.

https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html#Maven3.xCompatibilityNotes-DependencyResolution

causa di questo motivo si dovrebbe fare affidamento solo sulla produzione di mvn clean install -X per la gestione delle dipendenze.

Modifica

Dalla versione 2.5 del Maven Dipendenza Plugin, dependency:tree utilizza anche Etere (vedere il bug report, e il release notes)

+0

Questo spiega perché i due alberi sono diversi. Qualche idea su come correggere il problema della dipendenza transitiva? –