2012-09-24 20 views
6

Puedo hacer un archivo jar ejecutable con Eclipse. Digamos que se llama ast.jar, y la clase principal es ASTExplorer. Puedo verificar que esto funciona con java -jar ast.jar.La magia detrás del eclipse generado archivo jar ejecutable

Luego, descomprimo el archivo jar en un directorio aparte y verifico que ASTExplorer está en el directorio astexplorer. Pero cuando ejecuté este comando java -cp . astexplorer.ASTExplorer me sale este error.

java -cp . astexplorer/ASTExplorer 
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 

El hecho es que no hay un directorio org/eclipse/swt en el archivo jar.

Directory screenshot

¿Cuál es la magia detrás del archivo jar ejecutable? ¿Por qué no se ejecuta cuando se descomprime?

+0

Deberías intentar crear tu JAR con hormiga, sin la magia negra del eclipse. –

+0

¿Cuál es su ruta de clase cuando ejecuta 'java -jar ast.jar'. Cuando desempaquete el archivo jar su classpath es '.'. Supongo que hay una variable de entorno CLASSPATH configurada en algo que permite que funcione el 'java -jar ast.jar'. – km1

Respuesta

2

Cuando Eclipse empaqueta un archivo jar ejecutable, incluye las dependencias como archivos jar anidados, y también incluye un cargador de clases especial que comprende cómo encontrar clases en archivos jar anidados. Funciona solo con jarras anidadas y cuando extrae todo lo evita para que funcione.

He mirado en un frasco ejecutable producido en Eclipse, y aquí es lo que creo que había necesidad de hacer:

  1. Extracto de todo a un directorio. Los frascos de dependencia se extraen en el directorio de nivel superior
  2. Eliminar el directorio org/eclipse/jdt/interna
  3. ejecutar su clase principal del directorio de nivel superior con

    java -cp .;dep-jar;dep-jar;... your.main.class

Intenté esto con una jarra ejecutable que tuve por ahí y funciona. El paso 2 no es estrictamente necesario.

+0

Podría hacerlo ejecutar usando -cp.: TODOS LOS ARCHIVOS DE JAR DESDE ECLIPSE main.class. Creo que no parece haber gran magia detrás del archivo jar ejecutable generado por el eclipse que no sea envolviéndolo y hacer una referencia automática a los archivos jar – prosseek

+1

Plus sustituyendo el cargador de clases "jarinjar" en el archivo mainfest. –

Cuestiones relacionadas