2009-02-07 41 views
39

Quiero distribuir una aplicación de línea de comandos escrita en Java en Windows.Archivo BAT para crear Java CLASSPATH

Mi aplicación se distribuye como un archivo zip, que tiene una entrada de directorio lib que tiene los archivos .jar necesarios para invocar mi clase principal. Actualmente, para entornos Unix, tengo un script de shell que invoca el comando java con un CLASSPATH creado al agregar todos los archivos en el directorio lib.

¿Cómo escribo un archivo .BAT con una funcionalidad similar? ¿Cuál es el equivalente de encontrar el comando Unix en el mundo de Windows?

Respuesta

63

que desea utilizar el bucle en escritura por lotes

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

Esto realmente me ayudó cuando yo estaba buscando un script por lotes para iterar a través de todos los archivos en un directorio, se trata de borrar archivos pero es muy útil.

One-line batch script to delete empty directories

Para ser sinceros, utilice la respuesta de Jon embargo, mucho mejor si todos los archivos se encuentran en un directorio, esto podría ayudarle a cabo en otro momento sin embargo.

+1

+1 ya que es el único que respondió la pregunta específica. – paxdiablo

+0

Realmente hiciste mi día. Gracias por su respuesta al punto –

+0

si utiliza un pushd/popd, entonces necesita "endLocal" antes del popd. – sunny

29

¿Por qué usaría encontrar? Presumiblemente, usted conoce todas las bibliotecas que su archivo jar necesita con anticipación, entonces ¿por qué no solo enumerarlas?

Como alternativa, siempre puede usar -Djava.ext.dirs=lib y dejar que lo recoja todo de esa manera.

+0

Jon, yo no estaba al tanto de la propiedad del sistema java.ext.dirs - gracias! Imagine una aplicación donde desee que el usuario suelte el contenedor del controlador en el directorio lib, edite un archivo de propiedad y se conecte a una base de datos usando JDBC; mi aplicación es similar y no conozco el CLASSPATH con anticipación. –

+0

@binil: Sí, eso tiene sentido. Fue solo su descripción en la pregunta lo que hizo que pareciera que todos los archivos que necesitaba estaban en el archivo zip. –

+0

Cambiar -Djava.ext.dirs es problemático. Por ejemplo, cuando intento usar -Djava.ext.dirs, la validación del certificado SSL se rompe. –

4

Parece un executable JAR podría funcionar para usted. Si está distribuyendo un ZIP con todos los JAR que necesita su rutina principal, y realmente lo ejecuta en un shell de comandos, quizás podría crear un JAR ejecutable con Main-Class y Classpath definidos en el manifiesto. Todos tus usuarios tienen que hacer doble clic en el JAR y Bob es tu tío.

+0

Sí, ¡gracias por recordarme esta opción! Creo que considero los JAR ejecutables con una entrada de manifiesto apropiada. –

0

Lo que hago cuando suelto JAR de línea de comandos para Windows/Linux es la de insertar todas las bibliotecas JAR dentro de mi JAR utilizando el comando ANT:

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

De esta manera, las bibliotecas se funden con su archivos de clase.

No es la mejor forma de reutilización binaria, pero si las bibliotecas no son tan pesadas, tiene su aplicación ejecutada simplemente llamando a java -jar myApp.jar en cualquier sistema operativo.

+0

Creo que no puedo usar esta idea "uberjar" porque utilizo dos jarras de resorte, que incorporan diferentes definiciones de esquema XML en entradas con el mismo nombre, que podría necesitar combinar a mano y sería un paso de construcción adicional. –

18

Desde 6.0, Java admite classpaths wildcard.

Java command-line classpath syntax

+0

¡Gracias, no estaba al tanto de esta característica! Pero mi entorno de destino es Java5, por lo que es posible que no pueda utilizar esta técnica en esta aplicación. –

+0

Sin embargo, no es compatible con Manifest.MF desafortunadamente – leokom

5

Una variación si desea configurar el CLASSPATH para mantener fuera del guión y no empezar con la cáscara/V, se puede hacer algo como esto:

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

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

útil para configurar su entorno cuando solo estás jugando en la línea de comando.

+0

se merece un punto más seguro – hephestos

0

Puede usar un poco diferente si usa Maven para construir su proyecto. Ensamblador de aplicaciones El complemento Maven está destinado a crear iniciadores de aplicaciones Java. Este complemento genera el iniciador de archivos bat para usted y coloca las dependencias en la carpeta especificada. Opcionalmente, el iniciador puede registrar su aplicación como un servicio \ demonio.

This is a topic about using it

Este plug-in ayuda a mantenerlo cm partes de su DRY proyecto.

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

¿Hay una manera más fácil de hacer esto?

Sí;

Desde la versión 6, puede utilizar comodines de ruta de clase.

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

Ver también esta relacionada Q&A.

0

Una opción para hacer que las cosas portátil es establecer la ruta de clases con respecto a la ubicación del archivo por lotes en sí.

En Windows (suponiendo Java 6+, las clases en ./bin, frascos en ./lib):

@java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1 
Cuestiones relacionadas