web-dev-qa-db-fra.com

Fichier BAT pour créer Java CLASSPATH

Je souhaite distribuer une application de ligne de commande écrite en Java sous Windows. 

Mon application est distribuée sous la forme d'un fichier Zip, qui comporte une entrée de répertoire lib contenant les fichiers .jar nécessaires pour appeler ma classe principale. Actuellement, pour les environnements Unix, j'ai un script Shell qui appelle la commande Java avec un CLASSPATH créé en ajoutant tous les fichiers du répertoire lib. 

Comment écrire un fichier .BAT avec une fonctionnalité similaire? Quel est l'équivalent de la commande find Unix dans le monde Windows?

39
Binil Thomas

Vous voulez utiliser la boucle for dans le script batch

 @echo off
 setLocal EnableDelayedExpansion
 set CLASSPATH="
 for /R ./lib %%a in (*.jar) do (
   set CLASSPATH=!CLASSPATH!;%%a
 )
 set CLASSPATH=!CLASSPATH!"
 echo !CLASSPATH!

Cela m’a vraiment aidé lorsque je recherchais un script de traitement par lots pour parcourir tous les fichiers d’un répertoire. Il s’agissait de supprimer des fichiers mais c’était très utile.

Script par lots d'une ligne pour supprimer les répertoires vides

Pour être honnête, utilisez la réponse de Jon, bien mieux si tous les fichiers sont dans un répertoire, cela pourrait vous aider à un autre moment.

65
Henry B

Pourquoi voudriez-vous utiliser find? Vous connaissez probablement à l'avance toutes les bibliothèques dont votre fichier jar a besoin, alors pourquoi ne pas les lister?

Alternativement, vous pouvez toujours utiliser -Djava.ext.dirs=lib et le laisser tout prendre de cette façon.

29
Jon Skeet

Depuis la version 6.0, Java prend en charge les classpath génériques.

Syntaxe du chemin d'accès aux classes en ligne de commande Java

18
basszero

Une variante si vous souhaitez que le paramètre CLASSPATH soit en dehors du script et que vous n'avez pas démarré le shell avec/V, vous pouvez procéder comme suit:

@echo off
FOR /R ./lib %%a in (*.jar) DO CALL :AddToPath %%a
ECHO %CLASSPATH%
GOTO :EOF

:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF

Utile pour configurer votre environnement lorsque vous jouez en ligne de commande.

5
Eric Sorensen

Cela ressemble à un JAR exécutable pourrait fonctionner pour vous. Si vous distribuez un fichier Zip avec tous les JAR dont votre routine principale a besoin et que vous l'exécutez vraiment dans un shell de commande, vous pourriez peut-être créer un JAR exécutable avec la classe Main et le Classpath définis dans le manifeste. Tout ce que vos utilisateurs doivent faire est de double-cliquer sur le fichier JAR et sur Bob, votre oncle.

4
duffymo
SET CLASSPATH=""
FOR /R /lib %%a in (*.jar) DO CALL :AddToPath %%a
echo %CLASSPATH%

Java -cp %CLASSPATH% com.a.b.MyClass

pause

:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF
2
Shirin Joshi

Ce que je fais lorsque je publie des fichiers JAR en ligne de commande pour Windows/Linux consiste à incorporer toutes les bibliothèques de fichiers JAR dans mon fichier JAR à l'aide de la commande ANT:

       <fileset dir="${module.classes.dir}"/>
       <zipfileset src="${endorsed.lib.dir}/myLibrary.jar"/>

De cette façon, les bibliothèques se fondent avec vos fichiers de classe.

Ce n'est pas le meilleur moyen de réutilisation binaire, mais si les bibliothèques ne sont pas si lourdes, vous exécutez votre application en appelant simplement Java -jar myApp.jar dans n'importe quel système d'exploitation.

0
Demiurgo

Une option pour rendre les choses portables consiste à définir le chemin d'accès aux classes par rapport à l'emplacement du fichier de commandes lui-même.

Sous Windows (en supposant Java 6+, classes dans ./bin, jars dans ./lib):

@Java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1
0
Mike Godin

Vous pouvez utiliser une manière légèrement différente si vous utilisez Maven pour construire votre projet . Application Assembler Maven Plugin est destiné à la création de lanceurs d'applications Java. Ce plug-in génère un lanceur de fichiers bat pour vous et place des dépendances dans le dossier spécifié. Vous pouvez également enregistrer votre application en tant que service\démon.

Ceci est un sujet d'utilisation

Ce plug-in vous permet de garder les parties CM de votre projet au sec.

0
Andrii Khaisin

Y a-t-il un moyen plus facile de faire cela?

Oui; 

Depuis la version 6, vous pouvez utiliser des caractères génériques de chemin de classe.

javac -cp .;../lib/* yourJavaCodeDir/YourJavaFile.Java

Voir aussi ce sujet Q & A.

0
shridutt kothari