it-swarm.com.de

BAT-Datei zum Erstellen von Java CLASSPATH

Ich möchte eine in Java geschriebene Befehlszeilenanwendung unter Windows verteilen. 

Meine Anwendung wird als Zip-Datei verteilt, die über einen Eintrag im Verzeichnis lib verfügt, in dem sich die .jar-Dateien befinden, die zum Aufrufen meiner Hauptklasse erforderlich sind. Derzeit habe ich für Unix-Umgebungen ein Shell-Skript, das den Java-Befehl mit einem CLASSPATH aufruft, der durch Anhängen aller Dateien im Verzeichnis lib erstellt wird. 

Wie schreibe ich eine .BAT-Datei mit ähnlicher Funktionalität? Was ist das Äquivalent zum Finden von Unix-Befehlen in der Windows-Welt?

39
Binil Thomas

Sie möchten die for-Schleife im Batch-Skript verwenden

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

Das hat mir sehr geholfen, als ich nach einem Batch-Skript gesucht habe, das alle Dateien in einem Verzeichnis durchläuft. Es geht darum, Dateien zu löschen, aber es ist sehr nützlich.

Einzeiliges Batch-Skript zum Löschen leerer Verzeichnisse

Um ehrlich zu sein, verwenden Sie die Antwort von Jon. Weitaus besser, wenn sich alle Dateien in einem Verzeichnis befinden. Dies kann Ihnen jedoch zu einem anderen Zeitpunkt helfen.

65
Henry B

Warum würdest du find verwenden? Vermutlich kennen Sie alle Bibliotheken, die Ihre JAR-Datei im Voraus benötigt.

Alternativ können Sie auch -Djava.ext.dirs=lib verwenden und alles auf diese Weise aufnehmen.

29
Jon Skeet

Java unterstützt seit 6.0 Platzhalter-Klassenpfade.

Java-Befehlszeilen-Klassenpfad-Syntax

18
basszero

Eine Variante, wenn Sie möchten, dass die Einstellung CLASSPATH außerhalb des Skripts bleibt und Sie die Shell nicht mit/V gestartet haben, können Sie Folgendes tun:

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

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

Nützlich zum Einrichten Ihrer Umgebung, wenn Sie nur auf der Kommandozeile herumspielen.

5
Eric Sorensen

Klingt nach einem ausführbaren JAR , das für Sie funktionieren könnte. Wenn Sie eine Zip-Datei mit allen JAR-Dateien verteilen, die Ihre Hauptroutine benötigt, und Sie sie wirklich in einer Befehls-Shell ausführen, können Sie möglicherweise eine ausführbare JAR-Datei mit der im Manifest definierten Main-Class und Classpath erstellen. Alles, was Ihre Benutzer tun müssen, ist ein Doppelklick auf JAR und Bob ist Ihr Onkel.

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

Wenn ich Befehlszeilen-JARs für Windows/Linux freigebe, kann ich alle JAR-Bibliotheken in meinem JAR mit dem ANT-Befehl einbetten:

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

Auf diese Weise verschmelzen die Bibliotheken mit Ihren Klassendateien.

Dies ist nicht der beste Weg der binären Wiederverwendbarkeit, aber wenn die Bibliotheken nicht so umfangreich sind, müssen Sie Ihre Anwendung ausführen, indem Sie einfach in jedem Betriebssystem Java -jar myApp.jar aufrufen.

0
Demiurgo

Eine Möglichkeit, Dinge portabel zu machen, besteht darin, den Klassenpfad relativ zum Speicherort der Batchdatei selbst festzulegen.

Unter Windows (Java 6+ vorausgesetzt, Klassen in ./bin, Jars in ./lib):

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

Sie können eine etwas andere Methode verwenden, wenn Sie Maven zum Erstellen Ihres Projekts verwenden Application Assembler Maven Plugin ist für die Erstellung von Java-Apps-Launchern vorgesehen. Dieses Plug-in generiert ein Bat-Dateiluncher für Sie und legt Abhängigkeiten in den angegebenen Ordner ab. Optional kann Ihr Launcher Ihre Anwendung als Dienst\Dämon registrieren.

Dies ist ein Thema über die Verwendung

Dieses Plug-in hilft Ihnen, CM-Teile Ihres Projekts trocken zu halten.

0
Andrii Khaisin

Gibt es einen einfacheren Weg, dies zu tun?

Ja; 

Seit Version 6 können Sie Platzhalter für Klassenpfade verwenden.

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

Siehe auch diese verwandten Q & A.

0