2011-03-25 20 views
26

Primero: me doy cuenta de que este problema debería ser bastante simple y que mucha gente parece haberlo experimentado. Sin embargo, parece que mi problema puede ser ligeramente diferente de las publicaciones existentes."No se pudo encontrar la clase principal" al hacer doble clic en el archivo .jar

Estoy usando NetBeans para compilar una aplicación Java. Cuando se termina de compilar, la salida entra en la carpeta dist \ correctamente. El archivo jar está presente allí. Si voy a la línea de comandos, vaya a esa carpeta, y llamar a los siguientes:

java-jar Prosperity.jar

todo funciona bien. Obviamente, el nombre de la aplicación es Prosperidad. El siguiente comando también funciona bien:

javaw-jar Prosperity.jar

Sin embargo, hacer doble clic en el archivo .jar da el mensaje: "No se pudo encontrar la clase principal:" y luego da la ruta de acceso a el archivo .jar. He comprobado cientos de veces que la carpeta META-INF existe dentro del archivo .jar, y que dentro de ella existe un MANIFEST.MF con el nombre correcto de la clase principal. También he comprobado que el archivo clase principal (App.class) .class existe dentro del archivo .jar.

Entonces la pregunta es: ¿cuál es la diferencia entre hacer doble clic en un archivo y ejecutar javaw en él? ¡Es realmente frustrante que no solo se ejecute!

Gracias por cualquier dirección que pueda darme, ¡me estoy arrancando el pelo aquí!

+1

Parece que de alguna manera Java está teniendo la idea de que mi clase principal en realidad se llama PATH para el archivo jar que estoy ejecutando. No tengo idea de cómo se viene con eso. Parece ignorar el valor dentro del manifiesto y buscar una clase principal con el nombre: C: \ Users \ MyUser \ MyApp \ Prosperity.jar. Asumo que si pudiera descubrir cómo se está convirtiendo en el nombre de la clase principal que está buscando, entonces podría resolver el problema. – aardvarkk

Respuesta

24

Quizás sus asociaciones de archivos se dañaron. En el símbolo del sistema, intente ejecutar

ftype | find "jarfile" 

En mi 64-bit de Windows 7 ordenador, que muestra

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 

También puede cambiar con ftype:

ftype jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 
+1

Este fue el boleto. Para realmente hacer que las cosas se muevan, descargué un programa llamado unassoc cuyo propósito es eliminar todos los rastros de asociaciones de archivos. También cabe destacar el hecho de que mi instalación de la aplicación estaba haciendo una instalación * silenciosa * del JRE, que (¡silenciosamente, por supuesto!) * No * asocia los archivos .jar correctamente. Así que tuve que cambiar la instalación del programa principal para no hacer una instalación silenciosa, y también limpiar mis asociaciones de archivos. Después de volver a instalar el JRE, podría ejecutar el archivo .jar haciendo doble clic en él. Solo desearía saber cómo era la asociación de archivos cuando se rompió ... – aardvarkk

+0

Me alegro de ver que funciona. Supongo que a la asociación incorrecta le faltaba el parámetro '-jar'. Eso causaría el error que mencionaste. –

+1

Basado en "Parece que de alguna manera Java está teniendo la idea de que mi clase principal en realidad se llama PATH" Creo que lo que sucedió fue que% 1 no tenía comillas y que el jarrón estaba ubicado en una ruta que incluía un espacio . – Fredrik

0

sólo tenía exactamente el mismo problema, arreglado de la misma manera. Tuve que eliminar completamente la asociación, no solo la personalización del usuario, y volver a instalar el JRE.

La asociación antes de que la solución era todavía:

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 

y después (el mismo):

jarfile="C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %* 
+3

lo siento, eso fue para ser un comentario – James

9

Acabo de encontrar este post ...

Si sólo tiene el problema al hacer doble clic en el archivo jar y no en el inicio de cmd, es probable que sea porque la versión de JRE es incorrecta (6 en lugar de 7).

Sólo cambia el valor en regedit en:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jarfile\shell\open\command] "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -jar "%1" %*

a:

"C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %*

No debe haber ningún problema si se actualiza este valor.


Nota: Cambio entre 32 y 64 Bits en Windows:

->"C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %* utilizará la versión de 64 bits de JRE ->"C:\Program Files (x86)\Java\jre7\bin\javaw.exe" -jar "%1" %* va a utilizar la versión de 32 bits de JRE

+1

Lo mismo. Como alternativa, podría usar el comando 'ftype' de la respuesta aprobada (con una nueva ruta). –

+0

Esto realmente ayudó. Gracias. – CodeBlue

0

Si los métodos anteriores no pueden resolver el problema, intente eliminar el tipo de archivo .jar de su pc (puede buscar en Google un software llamado Unassoc.exe y eliminar el tipo de archivo), y luego se soluciona el problema. (Por lo menos, esta es mi caso!)

1

buscar su regedit y control de supervisión elemento

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 


[HKEY_CLASSES_ROOT\jarfile\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 


[HKEY_CURRENT_USER\Software\Classes\Applications\javaw.exe\shell\open\command] 
@="\"C:\\Program Files (x86)\\Java\\jre6\\bin\\javaw.exe\" -jar \"%1\"" 
1

me encontré con este error también. Comprobé la asociación del archivo usando el símbolo del sistema y todo fue correcto. No fue hasta que intenté ejecutar .jar desde la línea de comandos usando java -jar MyProgram.jar que realmente me mostró la raíz del problema.

Resulta que el .jar se compiló bajo JDK 7, mientras que sólo estaba corriendo JRE 6. Este fue el error que me ha dado en el aviso de que me llevan a la verdadera solución:

Exception in thread "main" java.lang.UnsupportedClassVersionError: MyProgram/Program : Unsupported major.minor version 51.0 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$000(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: MyProgram.Program. Program will ex 
it. 
Cuestiones relacionadas