¿Hay alguna manera de incluir todos los archivos jar dentro de un directorio en el classpath?
Estoy intentando java -classpath lib/*.jar:. my.package.Program
y no puedo encontrar archivos de clase que ciertamente están en esos frascos. ¿Necesito agregar cada archivo jar al classpath por separado?
java
command-line
classpath
Chris Serra
fuente
fuente
.jar
parte, (2) debe tener al menos 2 partes, separadas por a;
en Windows (que generalmente está en:
otro lugar). Por ejemplo:java -classpath ".;lib/*" Program
Respuestas:
Con Java 6 o posterior, la opción classpath admite comodines. Tenga en cuenta lo siguiente:
"
)*
, no*.jar
Ventanas
Unix
Esto es similar a Windows, pero usa en
:
lugar de;
. Si no puede usar comodines,bash
permite la siguiente sintaxis (dondelib
está el directorio que contiene todos los archivos de almacenamiento Java):(Tenga en cuenta que el uso de un classpath es incompatible con la
-jar
opción. Consulte también: Ejecutar archivo jar con múltiples bibliotecas classpath desde el símbolo del sistema )Comprender los comodines
Del documento de Classpath :
Nota: debido a un error conocido en Java 8, los ejemplos de Windows deben usar una barra diagonal inversa que preceda las entradas con un asterisco final: https://bugs.openjdk.java.net/browse/JDK-8131329
fuente
tr
works!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
sin comillas y funciona bien. Me pregunto por qué Shell no lo está expandiendo y produciendo errores.~
en el -cpDebajo de Windows esto funciona:
y esto no funciona:
observe el * .jar, por lo que el comodín * debe usarse solo .
En Linux, lo siguiente funciona:
Los separadores son dos puntos en lugar de punto y coma.
fuente
*.jar
pero solo con*
.:
una plataforma y;
la otra. :) Compilo con Java desde la línea de comandos aproximadamente una vez al año, lo suficiente como para no recordar con qué frecuencia lo suficiente como para ser molesto.Eludimos este problema implementando un archivo jar principal
myapp.jar
que contiene un archivo manifest (Manifest.mf
) que especifica una ruta de clase con los otros archivos jar necesarios, que luego se implementan junto a él. En este caso, solo necesita declararjava -jar myapp.jar
cuando ejecuta el código.Entonces, si implementa el main
jar
en algún directorio, y luego coloca los frascos dependientes en unalib
carpeta debajo de eso, el manifiesto se verá así:NB: esto es independiente de la plataforma: podemos usar los mismos frascos para iniciar en un servidor UNIX o en una PC con Windows.
fuente
Mi solución en Ubuntu 10.04 usando java-sun 1.6.0_24 con todos los archivos jar en el directorio "lib":
Si esto falla, el siguiente comando debería funcionar (imprime todos los * .jars en el directorio lib en el parámetro classpath)
fuente
Respuesta corta:
java -classpath lib/*:. my.package.Program
Oracle proporciona documentación sobre el uso de comodines en classpaths aquí para Java 6 y aquí para Java 7 , en la sección titulada Descripción de comodines de ruta de clase . (Mientras escribo esto, las dos páginas contienen la misma información). Aquí hay un resumen de los aspectos más destacados:
En general, para incluir todos los JAR en un directorio dado, puede usar el comodín
*
( no*.jar
).El comodín solo coincide con JAR, no con archivos de clase; para obtener todas las clases en un directorio, simplemente finalice la entrada classpath en el nombre del directorio.
Las dos opciones anteriores se pueden combinar para incluir todos los archivos JAR y de clase en un directorio, y se aplican las reglas de precedencia de classpath habituales. P.ej
-cp /classes;/jars/*
El comodín no buscará JAR en subdirectorios.
Los puntos anteriores son verdaderos si utiliza la
CLASSPATH
propiedad del sistema o los indicadores de línea de comando-cp
o-classpath
. Sin embargo, si usa elClass-Path
encabezado de manifiesto JAR (como lo haría con un archivo de compilación de hormigas), no se aceptarán comodines .Sí, mi primer enlace es el mismo que se proporciona en la respuesta de mayor puntuación (que no tengo esperanzas de superar), pero esa respuesta no proporciona mucha explicación más allá del enlace. Dado que este tipo de comportamiento se desaconseja en Stack Overflow en estos días , pensé en ampliarlo.
fuente
Ventanas :
Linux :
Recuerde:
- El separador de ruta de Windows es
;
- El separador de ruta de Linux es
:
- En Windows si el argumento cp no contiene espacios en blanco, las "comillas" son opcionales
fuente
Para mí esto funciona en Windows.
Para linux
Estoy usando Java 6
fuente
Puede probar java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlDirectorio de jarras externas cuando se ejecuta Java
fuente
-Djava.ext.dirs=
ANTES-jar
Correcto :
Incorrecto:
fuente
Si realmente necesita especificar todos los archivos .jar dinámicamente, puede usar scripts de shell o Apache Ant . Hay un proyecto de commons llamado Commons Launcher que básicamente te permite especificar tu script de inicio como un archivo de compilación de hormigas (si ves lo que quiero decir).
Luego, puede especificar algo como:
En su archivo de compilación de lanzamiento, que iniciará su aplicación con el classpath correcto.
fuente
Si está utilizando Java 6, puede usar comodines en el classpath.
Ahora es posible usar comodines en la definición de classpath:
Ref: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
fuente
Tenga en cuenta que la expansión de comodines está rota para Java 7 en Windows.
Consulte este problema de StackOverflow para obtener más información.
La solución consiste en poner un punto y coma justo después del comodín.
java -cp "somewhere/*;"
fuente
A quien le interese,
Encontré este comportamiento extraño en Windows bajo un shell MSYS / MinGW.
Trabajos:
No funciona
Estoy bastante seguro de que el shell no expande el comodín porque, por ejemplo,
(También lo probé con otro programa, en lugar del integrado
echo
, con el mismo resultado).Creo que es lo
javac
que está tratando de expandirlo, y se comporta de manera diferente si hay un punto y coma en el argumento o no. Primero, puede estar tratando de expandir todos los argumentos que parecen caminos. Y solo entonces los analizaría,-cp
tomando solo la siguiente ficha. (Tenga en cuenta quecom.comsol.aco_1.0.0.jar
es el segundo JAR en ese directorio). Eso es todo una suposición.Esto es
fuente
Todas las soluciones anteriores funcionan muy bien si desarrolla y ejecuta la aplicación Java fuera de cualquier IDE como Eclipse o Netbeans.
Si está en Windows 7 y usó Eclipse IDE para desarrollo en Java, puede tener problemas si usa el símbolo del sistema para ejecutar los archivos de clase creados dentro de Eclipse.
Por ejemplo, su código fuente en Eclipse tiene la siguiente jerarquía de paquetes: edu.sjsu.myapp.Main.java
Tiene json.jar como una dependencia externa para Main.java
Cuando intente ejecutar Main.java desde Eclipse, se ejecutará sin ningún problema.
Pero cuando intente ejecutar esto utilizando el símbolo del sistema después de compilar Main.java en Eclipse, detectará algunos errores extraños que dicen "Error de ClassNotDef bla, bla".
Supongo que estás en el directorio de trabajo de tu código fuente.
Use la siguiente sintaxis para ejecutarla desde el símbolo del sistema:
[No te pierdas el. encima]
Esto se debe a que ha colocado Main.java dentro del paquete edu.sjsu.myapp y java.exe buscará el patrón exacto.
Espero eso ayude !!
fuente
Para Windows se requieren cotizaciones y; debe usarse como separador. p.ej:
fuente
Forma abreviada: si su main está dentro de un jar, probablemente necesitará una '-jar pathTo / yourJar / YourJarsName.jar' adicional declarada explícitamente para que funcione (aunque 'YourJarsName.jar' estaba en el classpath) (o , expresado para responder a la pregunta original que se hizo hace 5 años: no es necesario volver a declarar cada jarra explícitamente, pero parece que, incluso con java6, debe volver a declarar su propia jarra ...)
Forma larga: (He hecho esto explícito hasta el punto de que espero que incluso los intrusos en Java puedan hacer uso de esto)
Como muchos aquí, estoy usando eclipse para exportar frascos: (Archivo-> Exportar -> 'Archivo JAR ejecutable'). Hay tres opciones en las ofertas de eclipse (Juno) de 'Manejo de biblioteca':
Por lo general, usaría opt2 (y opt1 definitivamente se estaba rompiendo), sin embargo, el código nativo en uno de los frascos que estoy usando descubrió rupturas con el práctico truco "jarinjar" que el eclipse aprovecha cuando elige esa opción. Incluso después de darme cuenta de que necesitaba opt3, y luego encontrar esta entrada de StackOverflow, todavía me tomó un tiempo descubrir cómo iniciar mi principal fuera del eclipse, así que esto es lo que funcionó para mí, ya que es útil para otros ...
Si nombró su jar: "fooBarTheJarFile.jar" y todo está configurado para exportar al directorio: "/ theFully / qualifiedPath / toYourChosenDir".
(lo que significa que el campo 'Destino de exportación' se leerá: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')
Después de presionar finalizar, encontrará eclipse y luego colocará todas las bibliotecas en una carpeta llamada 'fooBarTheJarFile_lib' dentro de ese directorio de exportación, dándole algo como:
Luego puede iniciar desde cualquier lugar de su sistema con:
(Para los principiantes de Java: 'package.path_to.the_class_with.your_main' es la ruta del paquete declarada que encontrarás en la parte superior del archivo 'TheClassWithYourMain.java' que contiene el 'main (String [] args) {.. .} 'que desea ejecutar desde fuera de Java)
El error a tener en cuenta: es que tener 'fooBarTheJarFile.jar' dentro de la lista de jarras en su classpath declarado no es suficiente. Debe declarar explícitamente '-jar' y volver a declarar la ubicación de ese jar.
Por ejemplo, esto se rompe:
reexpresado con rutas relativas:
(utilizando la versión de Java "1.6.0_27"; a través de OpenJDK 64-Bit Server VM en ubuntu 12.04)
fuente
La única forma en que sé cómo hacerlo es de forma individual, por ejemplo:
¡Espero que ayude!
fuente
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
clase de wepapp:
fuente
Debe agregarlos todos por separado. Alternativamente, si realmente necesita especificar un directorio, puede deshacer todo en un directorio y agregarlo a su classpath. Sin embargo, no recomiendo este enfoque, ya que corre el riesgo de problemas extraños en el versionado de classpath y la inmanejabilidad.
fuente
No es una solución directa para poder establecer / * en -cp, pero espero que pueda usar el siguiente script para facilitar un poco la situación de las rutas de clase dinámicas y los directorios lib.
Scripted para Linux, también podría tener uno similar para Windows. Si se proporciona el directorio apropiado como entrada a "libDir2Scan4jars"; el script escaneará todos los archivos jar y creará una cadena classpath y la exportará a una variable env "tmpCLASSPATH".
fuente
macOS, carpeta actual
Para Java 13 en macOS Mojave ...
Si todos sus
.jar
archivos están en la misma carpeta, usecd
para que sea su directorio de trabajo actual . Verificar conpwd
.Para el
-classpath
primero debe enumerar el archivo JAR para su aplicación. Usando un carácter de dos puntos:
como delimitador, agregue un asterisco*
para obtener todos los demás archivos JAR dentro de la misma carpeta. Por último, pase el nombre completo del paquete de la clase con sumain
método .Por ejemplo, para una aplicación en un archivo JAR llamado
my_app.jar
con unmain
método en una clase nombradaApp
en un paquete llamadocom.example
, junto con algunos tarros necesarios en la misma carpeta:fuente
Piense en un archivo jar como la raíz de una estructura de directorio. Sí, debe agregarlos todos por separado.
fuente
Establezca el classpath de una manera adecuada para múltiples jarras y archivos de clase del directorio actual.
fuente
Tengo varios frascos en una carpeta. El siguiente comando funcionó para mí
JDK1.8
al incluir todos los frascos presentes en la carpeta. Tenga en cuenta que para incluir entre comillas si tiene un espacio en el classpathVentanas
Compilación:
javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java
Corriendo:
java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram
Linux
Compilación:
javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java
Corriendo:
java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram
fuente
Estoy tratando de ejecutar un archivo Java como jar o como clases en Ubuntu. Fallé en ambas opciones. La siguiente excepción es su salida.
o
o
Encontré la respuesta:
Mi estupidez
Primer paso: debe configurar el Java correspondiente: ¡tenía Java 11 pero configuré como ruta de acceso Java lib la octava versión! - Puedes configurar la versión de Java desde aquí:
2do paso: Luego ejecute el siguiente comando, cambiando la ruta y los nombres de archivo a su ruta y archivos correspondientes:
Se ejecutó con éxito!
fuente