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':
opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"
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:
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
Luego puede iniciar desde cualquier lugar de su sistema con:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(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:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
reexpresado con rutas relativas:
cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS: java -cp "fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" -jar package.path_to.the_class_with.your_main.TheClassWithYourMain
WORKS: java -cp ".;fooBarTheJarFile_lib/*" -jar fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(utilizando la versión de Java "1.6.0_27"; a través de OpenJDK 64-Bit Server VM en ubuntu 12.04)