Pour mes besoins actuels, j'ai un projet Maven qui crée un fichier war
, et je veux voir quel chemin de classe réel il utilise lors de la création du war
. Existe-t-il un moyen de le faire en une seule commande - sans avoir à compiler l'intégralité du projet?
Une idée est de faire générer par Maven le target/classpath.properties
fichier, puis arrêtez-vous à ce point.
Pour obtenir le chemin de classe par lui-même dans un fichier, vous pouvez:
mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
Ou ajoutez ceci au 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>
De: http://maven.Apache.org/plugins/maven-dependency-plugin/usage.html
ou appelez "mvn -e -X ...." et vérifiez la sortie ...
Cette commande sorties le chemin de classe sur Mac et Linux:
mvn -q exec:exec -Dexec.executable=echo -Dexec.args="%classpath"
Faire imprimer le résultat et non l'enregistrer dans un fichier peut être utile, par exemple, lors de l'affectation du résultat à une variable dans un script Bash. Cette solution fonctionne uniquement sur Mac et Linux, mais les scripts Bash Shell aussi.
Sous Windows (par exemple dans les fichiers BAT), où il n'y a pas d'exécutable echo
, vous aurez besoin de quelque chose comme ceci (non testé):
mvn -q exec:exec -Dexec.executable=cmd -Dexec.args="/c echo %classpath"
Alternativement, vous pouvez simplement exécuter le programme Java
avec le chemin de classe:
mvn -q exec:exec -Dexec.executable=Java -Dexec.args="-cp %classpath Main"
Ou même comme ça (il utilisera automatiquement le chemin de classe correct):
mvn -q exec:Java -Dexec.mainClass="Main"
Cependant, ces deux approches alternatives souffrent de Maven ajoutant ses messages d'erreur lorsque votre programme échoue.
La commande mvn dependency:list
listera le chemin de classe avec tous les fichiers JAR utilisés pour la compilation, le runtime et le test au format suivant:
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
La seule exigence est que la compilation soit terminée. Cela ne fonctionne pas si la compilation n'est pas exécutée.
Une autre commande est la commande mvn dependency:tree
.
Comme ecerulm l'a noté dans son commentaire à réponse de Janik , vous pouvez spécifier la portée de dependency:build-classpath
, car la sortie du chemin de classe différera pour différentes portées (par défaut test
est utilisé pour une raison quelconque). Je me suis retrouvé avec une commande comme celle-ci:
mvn -DincludeScope=compile dependency:build-classpath
Au sein du POM, il pourrait être utilisé comme ceci:
<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>
<includeScope>compile</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/compile-classpath.txt</outputFile>
</configuration>
</execution>
<execution>
<id>build-test-classpath</id>
<phase>generate-test-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<!-- Omit to print on console: -->
<outputFile>${project.build.directory}/test-classpath.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Cela produira 2 versions de classpath, une pour la construction principale et l'autre pour les tests.
Il s'agit d'une solution de commande unique mais compile le code .
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}'
Exemple d'utilisation du script shell
MAVEN_CLASSPATH=$(mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}')
J'en ai utilisé une variante dans un script Shell pour exécuter un principal autonome () (pour la génération de schéma Hibernate) de cette façon
#/bin/bash
MAVEN_TEST_CLASSPATH=$(mvn -e -X clean package | grep -o -P '\-classpath .*?test.*? ')
Java $MAVEN_TEST_CLASSPATH foo.bar.DBSchemaCreate
Exemple de sortie de fichier
mvn -e -X -Dmaven.test.skip=true clean compile | grep -o -P '\-classpath .*? ' | awk '{print $2}' > maven.classpath