2009-02-07 17 views
39

Desidero distribuire un'applicazione della riga di comando scritta in Java su Windows.File BAT per creare Java CLASSPATH

La mia applicazione è distribuita come un file zip, che ha una voce di directory lib che ha i file .jar necessari per richiamare la mia classe principale. Attualmente, per gli ambienti Unix, ho uno script di shell che richiama il comando java con un CLASSPATH creato aggiungendo tutti i file nella directory lib.

Come si scrive un file .BAT con funzionalità simili? Qual è l'equivalente di trovare il comando Unix nel mondo Windows?

risposta

63

si desidera utilizzare il ciclo for in script batch

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

Questo davvero mi ha aiutato quando ero alla ricerca di uno script batch per scorrere tutti i file in una directory, si tratta di eliminare i file ma è molto utile.

One-line batch script to delete empty directories

Per essere onesti, usano la risposta di Jon però, molto meglio se tutti i file sono in una directory, questo potrebbe dare una mano in un altro momento però.

+1

+1 poiché è l'unico che ha risposto alla domanda specifica. – paxdiablo

+0

Hai fatto davvero la mia giornata. Grazie per tale risposta al punto di risposta –

+0

se si utilizza un pushd/popd quindi è necessario "endLocal" prima del popd. – sunny

29

Perché dovresti usare find? Presumibilmente si conoscono tutte le librerie necessarie per il file jar in anticipo, quindi perché non elencarle?

In alternativa, è possibile utilizzare sempre -Djava.ext.dirs=lib e lasciare che raccolga tutto in questo modo.

+0

Jon, io non era a conoscenza della proprietà di sistema java.ext.dirs - grazie! Immaginate un'applicazione in cui si desidera che l'utente trascini il jar del driver nella directory lib, modifichi un file di proprietà e si connetta a un database usando JDBC - la mia applicazione è simile, e non conosco il CLASSPATH in anticipo. –

+0

@binil: Sì, questo ha senso. Era solo la tua descrizione nella domanda che faceva sembrare che tutti i file necessari fossero nel file zip. –

+0

Cambiare -Djava.ext.dirs è problematico. Ad esempio, quando provo a utilizzare -Djava.ext.dirs, le interruzioni di convalida dei certificati SSL vengono eseguite. –

4

Suoni come un executable JAR potrebbe funzionare per voi. Se stai distribuendo un ZIP con tutti i JAR di cui la tua routine principale ha bisogno, e lo esegui davvero in una shell di comandi, forse potresti creare un JAR eseguibile con la Main-Class e il Classpath definiti nel manifest. Tutti i tuoi utenti devono fare doppio clic sul JAR e Bob è tuo zio.

+0

Sì, grazie per avermi ricordato questa opzione! Penso che consideri i JAR eseguibili con una voce manifest appropriata. –

0

quello che faccio quando ho comunicato JAR della riga di comando per Windows/Linux è quello di incorporare tutte le librerie JAR dentro la mia JAR utilizzando il comando ANT:

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

In questo modo le librerie sono fondono con il tuo file di classe.

Non è il modo migliore di riusabilità binaria, ma se le librerie non sono così pesanti, l'applicazione viene eseguita semplicemente chiamando java -jar myApp.jar in qualsiasi sistema operativo.

+0

I (penso che) non può usare questa idea "uberjar" perché utilizzo due spring jars, che incorporano definizioni di schemi XML diverse in voci con lo stesso nome, che potrei aver bisogno di unire a mano e sarebbe un passo di build extra. –

18

Da 6.0, Java supporta i percorsi di classe caratteri jolly.

Java command-line classpath syntax

+0

Grazie, non ero a conoscenza di questa funzionalità! Ma il mio ambiente di destinazione è Java5, quindi potrei non essere in grado di utilizzare questa tecnica in questa applicazione. –

+0

Tuttavia non è supportato in Manifest.MF purtroppo – leokom

5

Una variazione se si desidera impostare il CLASSPATH di tenere al di fuori dello script e non ha avviare la shell con/V, si può fare qualcosa di simile:

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

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

Utile per impostare il vostro ambiente quando stai solo giocando sulla riga di comando.

+0

merita sicuramente un punto in più – hephestos

0

È possibile utilizzare un modo leggermente diverso se si utilizza Maven per creare il progetto. Application Assembler Maven Plugin è progettato per la creazione di launcher di app Java. Questo plug-in genera file di avvio file bat per te e inserisce le dipendenze nella cartella specificata. Facoltativamente, il programma di avvio è in grado di registrare l'applicazione come servizio \ demone.

This is a topic about using it

Questo plug-in aiuta tenervi cm parti del DRY progetto.

2
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 
0

C'è un modo più semplice per fare questo?

Sì;

Dalla versione 6, è possibile utilizzare i caratteri jolly del percorso classe.

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

Vedi anche questo relativo Q&A.

0

un'opzione per rendere le cose portatile è per impostare il percorso di classe relativo alla posizione del file batch stesso.

In Windows (assumendo Java 6+, le classi in ./bin, vasi in ./lib):

@java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1 
Problemi correlati