2013-05-20 11 views
25

Per i miei scopi attuali ho un progetto Maven che crea un file war e voglio vedere che percorso classe effettivo sta usando durante la creazione dello war. C'è un modo per farlo in un unico comando - senza dover compilare l'intero progetto?In Maven, in che modo viene utilizzato il classpath in uscita?

Un'idea è di avere Maven generare il file target/classpath.properties e quindi fermarsi a quel punto.

+0

questo dovrebbe essere un requisito di base per Maven. ma sono sicuro che non saranno d'accordo. – weima

risposta

46

Per ottenere il percorso di classe da sola in un file, è possibile:

mvn dependency:build-classpath -Dmdep.outputFile=cp.txt 

Or aggiungere questo alla pom.xml:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.9</version> 
     <executions> 
      <execution> 
      <id>build-classpath</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>build-classpath</goal> 
      </goals> 
      <configuration> 
       <!-- configure the plugin here --> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

da: http://maven.apache.org/plugins/maven-dependency-plugin/usage.html

+1

La 'dipendenza mvn: build-classpath' per impostazione predefinita arriverà il classpath per il' test' [dependency scope] (https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope) che include 'system',' provided', 'compile',' runtime' e 'test'. Se si desidera ottenere il classpath per gli ambiti 'compile' o' runtime'. Puoi usare '-Dmdep.includeScope = compile' – ecerulm

12

o chiamare il "mvn -e -X ...." e controllare l'uscita ...

+0

Non penso che risolva il problema perché mostrare errori e informazioni di debug non aiuta a produrre il classpath usato. –

+3

le informazioni di debug contengono l'intero classpath per ogni plug-in del ciclo di vita coinvolto (comprese anche altre cose) –

+0

Grazie signore, ho scritto un'iterazione sulla soluzione, sentitevi liberi di riutilizzarla se lo ritenete utile per il futuro lettore , perché in questo momento la mia risposta è in fondo e poche persone lo leggeranno (http://stackoverflow.com/a/37551032/2265487) – ElMesa

1

questo è un cantare la soluzione di comando ma compila il codice.

mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' 

Shell script di esempio utilizzo

MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}') 

ho usato una variazione di esso in un script di shell per eseguire un main() (per la generazione dello schema di Hibernate) in questo modo

#/bin/bash 

MAVEN_TEST_CLASSPATH=$(mvn -e -X clean package | grep -o -P '\-classpath .*?test.*? ') 

java $MAVEN_TEST_CLASSPATH foo.bar.DBSchemaCreate 

esempio di output del file

mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath 
+0

Con maven 3.3.9, il comando grep non restituisce nulla (sfortunatamente, non riesco a vedere alcun classpath quando è in esecuzione con -e -X). C'è forse un aggiornamento a questa soluzione? –

+0

Testato proprio ora su Mint 18 (basato su Ubuntu 16.04) e funziona: O. Potresti fornire le risposte della console per 'uname -a' e' maven --version'? Sul sistema testato con risultati positivi sono $ uname -a -> '" Linux ******* 4.4.0-21-generiC# 37-Ubuntu SMP Lun 18 Apr 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux "'. $ mvn --version -> '" Apache Maven 3.3.9; Versione Java: 1.8.0_111, fornitore: Oracle Corporation; Nome OS: 'linux', versione: '4.4.0-21-generic', arch: ' amd64 ', family:' unix'' – ElMesa

+0

Nota che se non sei in Linux grep potrebbe non essere sul tuo sistema (come in windows) o potrebbe comportarsi diversamente (come su macos per alcune combinazioni di opzioni) .Se sei su windows potresti provare Cygwin o MinGW per avere grep, ma non so se avrai problemi simili a macos, dove Cygwin o MinGW potrebbero comportarsi in modo diverso da quello usato sui pacchetti di Ubuntu 16.04 (se usi windows e trovare utile l'approccio MinGW o Cygwin per favore fatemi sapere per aggiornare la risposta) – ElMesa

3

Il comando mvn dependency:list elenca lo classpath con tutti i vasi utilizzati per la compilazione, esecuzione e collaudo nel seguente formato:

INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ MyProject --- 
[INFO] 
[INFO] The following files have been resolved: 
[INFO] org.netbeans.api:org-openide-filesystems:jar:RELEASE80:compile 
[INFO] org.netbeans.api:org-netbeans-modules-queries:jar:RELEASE80:compile 
[INFO] org.netbeans.api:org-netbeans-api-progress:jar:RELEASE80:compile 
[INFO] org.netbeans.api:org-openide-dialogs:jar:RELEASE80:compile 
[INFO] org.apache.derby:derby:jar:10.11.1.1:compile 
[INFO] org.netbeans.api:org-openide-windows:jar:RELEASE80:compile 

L'unica il requisito è che la compilazione sia finita. Non funziona se la compilazione non è stata eseguita.

Un altro comando è Il comando mvn dependency:tree.

3

Questo comando uscite il classpath su Mac e Linux:

Avendo il risultato stampati e non salvati in un file potrebbe essere utile, ad esempio, durante l'assegnazione del risultato a una variabile in un Bash script. Questa soluzione funziona solo su Mac e Linux, ma anche sugli script di shell Bash.

In Windows (ad es.nella BAT file), dove non c'è echo eseguibile, sarà necessario qualcosa di simile (non testata):

mvn -q exec:exec -Dexec.executable=cmd -Dexec.args="/c echo %classpath" 

In alternativa, si può solo eseguire java programma con il percorso di classe:

mvn -q exec:exec -Dexec.executable=java -Dexec.args="-cp %classpath Main" 

O anche così (utilizzerà automaticamente il classpath corretto):

mvn -q exec:java -Dexec.mainClass="Main" 

Tuttavia, entrambi questi approcci alternativi soffrono di Maven che aggiunge i suoi messaggi di errore quando il programma fallisce.

+0

Come è migliore questa risposta accettata a questa domanda? – iehrlich

+0

Emette il classpath invece di salvarlo in un file. – Danilcha

Problemi correlati