2011-04-29 16 views
17

Así que he estado escribiendo una sencilla aplicación 3D GUI que pretendía que los usuarios utilizaran simplemente haciendo doble clic en el archivo JAR. Lo hice funcionar perfectamente antes de ponerlo en el archivo JAR, y lo conseguí funcionando perfectamente en el archivo JAR mientras corría desde el símbolo del sistema (escribiendo "java -jar Modeler.jar" mientras estaba en el directorio del archivo jar). Sin embargo, cuando hago doble clic en él, no pasa nada. Se ejecuta perfectamente bien sin errores desde el símbolo del sistema. Sé por experiencia que los informes de fallos en la puesta en marcha no se muestran porque la consola no aparece (o desaparece demasiado rápido), pero cuando se ejecuta desde el símbolo del sistema no hay informes de fallos. ¿Alguna idea de por qué no funcionará? Estoy ejecutando Windows 7 Home Premium. Estos son los contenidos del archivo JAR si ayuda:¿Por qué mi archivo JAR se ejecuta en CMD, pero no al hacer doble clic?

Modeler.jar 
| 
+--*all the class files necessary* 
| 
+--META-INF 
    | 
    +--MANIFEST.MF 

Contenido de MANIFIEST.MF:

Manifest-Version: 1.0 
Built-By: AnonymousJohn 
Class-Path: bin/j3dcore.jar bin/j3dutils.jar bin/vecmath.jar 
Created-By: 1.6.0_16 (Sun Microsystems Inc.) 
Main-Class: Start 

EDIT: Así que después de jugar con las asociaciones de archivos utilizar java.exe en lugar de javaw. exe (proporcionando así una ventana para las impresiones), luego modificando un poco el mecanismo de inicio para imprimir el directorio de trabajo actual, descubrí que el archivo jar está ejecutándose desde "C: \ Windows \ system32" en lugar de la carpeta de mi escritorio Lo puse. Ve figura. Sin embargo, mover los archivos externos necesarios allí no ayuda en nada.

EDIT 2: Intenté hacer otro archivo JAR, esta vez con un JFrame simple con un botón que le indica el directorio de trabajo actual. Presione el botón y se abre un (inútil) JFileChooser. Esto funcionó haciendo doble clic sin importar dónde lo puse en mi computadora. Entonces debe haber algo mal con mi archivo JAR. Comenzaré a solucionar mi programa nuevamente.

EDIT 3: El problema es exactamente lo que pensé que era: no está cargando las bibliotecas correctamente cuando hago doble clic en él. La parte más extraña es que en mis pruebas donde visualizo la ruta actual y la ruta de la biblioteca, la salida es exactamente la misma ya sea que la ejecute a través del símbolo del sistema o haciendo doble clic en ella. Aquí está el seguimiento de la pila:

java.lang.UnsatisfiedLinkError: no j3dcore-d3d in java.library.path 
    at java.lang.ClassLoader.loadLibrary(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200) 
    at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157) 
    at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987) 
    at javax.media.j3d.VirtualUniverse<clinit>(VirtualUniverse.java:299) 
    at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.java:3881) 
    at ModelPreview.<init>(ModelPreview.java:51) 
    at Modeler.<init>(Modeler.java:76) 
    at Modeler.main(Modeler.java:1227) 
    at Start.main(Start.java:92) 

El único problema es que está en la ruta de la biblioteca. Lo configuré específicamente en el programa. Ahora que lo pienso, ese puede ser el problema. Me puse como tal (esto era un método que encontré algún lugar de Internet que no recuerdo dónde.):

//above was code to get newPath based on the Operating System. 
//all this code is set in a try-catch phrase. 
//reset the library path 
System.setProperty("java.library.path", ".\\bin\\natives" + newPath + ";"); 
//make sure the ClassLoader rereads the NEW path. 
Field f = ClassLoader.class.getDeclaredField("sys_paths"); 
f.setAccessible(true); 
f.set(null, null); //ClassLoader will automatically reread the path when it sees that it is null. 

edición final: Bueno, después de mirar y relooking en mi código, he descubierto que el problema era en algunos BS'ery que implica la detección de sistemas de 64 bits donde estaba cargando los dll incorrectos. Por qué funcionó desde la línea de comandos y no a través de un doble clic No sé y probablemente nunca lo sepa, pero funciona con un doble clic ahora, así que estoy contento. Perdón por los problemas.

+0

¿Está "Comenzando" el nombre de su clase que está tratando de ejecutar? ¿Está en el paquete predeterminado (no)? –

+0

Sí, "Inicio" es el nombre de la clase que estoy intentando ejecutar (configura el entorno) y sí, está en el paquete predeterminado. Intenté que el empaque funcionara en un punto, pero simplemente no funcionaba, así que lo dejé todo en el paquete predeterminado. – AnonymousJohn

+0

Posible duplicado de http://stackoverflow.com/questions/394616/running-jar-file-in-windows –

Respuesta

-3

Sólo para que la respuesta a la pregunta es evidente para cualquiera que pasa, voy a poner mi solución aquí (no pude antes debido a la regla de 8 horas):

Bueno, después de mirando y volviendo a mirar mi código, descubrí que el problema era en algunos BS'ery que implica la detección de sistemas de 64 bits donde estaba cargando dll's incorrectos. Por qué funcionó desde la línea de comandos y no a través de haga doble clic en No sé y probablemente nunca lo sepa, pero funciona a través de haga doble clic ahora, así que estoy contento. Lo siento sobre los problemas.

+7

Creo que puedo tener el mismo problema, pero no está claro cómo resuelvo la BS. – Thorn

+0

"BS'ery" no agrega nada al problema de cómo resolver realmente esto –

+4

Usted menciona que descubrió el problema, pero no describió las características específicas del problema, y ​​tampoco describió lo que hizo para corregir el problema. – purgatory101

7

El JAR es ejecutable desde CMD. Eso significa que el JAR en sí está formado correctamente. Bueno.

La única razón para que falle ahora es que hacer doble clic no produce un comando correcto. comando de esperar, como usted ha dicho correctamente, es

java -jar Modeler.jar 

Pero cuando javaw.exe asociado con una extensión JAR, sospecho que ejecuta

javaw Modeler.jar 

Es fácil de comprobar: hacer una javajar.archivo cmd, que contiene los siguientes

javaw -jar %* 

y asócielo con JAR. Si tu aplicación comienza bien, estoy en lo cierto. De lo contrario, lo siento.

+0

En realidad noté que la asociación de archivos era "javaw.exe -jar"% 1 "% *" (no incluí la ruta antes de javaw). No creo que eliminar el% 1 sea útil, pero puedo intentarlo. EDIT :: En vano. :/Eso tampoco funcionó. – AnonymousJohn

+0

Releyendo tu respuesta Me di cuenta de que dijiste que pusieras el comando en un archivo por lotes, así que lo hice. La asociación que hice fue como tal: '"C: \ test.bat"% *'. Lo extraño es que cuando se ejecutó el archivo por lotes, el resultado de ese comando (no apagué el eco) fue este: "javaw -jar". Obviamente, o utilicé la asociación incorrecta o Windows no está pasando parámetros como debería ser. – AnonymousJohn

+0

Pruebe% 1 para estar seguro. Aunque% * funcionará. (Estoy en Linux, no puedo probar) –

19

Ok, así que estuve atascado en este tema exacto durante más de una semana (ha sido para un proyecto paralelo para el cual solo pude dedicar unas pocas horas al día).

Esto sucedió en mi escritorio, pero por alguna razón no sucedería en la computadora portátil.

Después de mirar alrededor, encontré esta respuesta y pensé que la compartiría para las personas que son como yo, no encontré nada útil en la respuesta aceptada aquí. Los créditos van al usuario anónimo de Stack Overflow, cuyo nombre de usuario he perdido en toda la emoción.

Como se ha mencionado por alguna otra respuesta en algún lugar a un problema relacionado aparente, usar este pequeño programa para asociar los archivos JAR a la versión de 64 bits de Java:

http://johann.loefflmann.net/en/software/jarfix/index.html

Guardar el programa en algún lugar y ejecutarlo desde la línea de comandos con el parámetro/64: c: //path//jarfix.exe/64

Nada más trabajó para mí, pero esto era como magia. :)

+0

+1 Gracias por publicar sus experiencias con esto. –

+0

Gracias Eric. Me salvaste el día :) – sappu

+0

Gracias. ¡Puedo dormir ahora! : D –

0

Solo para poner mis dos centavos adentro, tuve este problema y fue causado por algo-o-otro en el manifiesto, supongo. Lo resolví generando el JAR ejecutable de otra manera:

El desarrollador anterior generó el Runnable JAR de Eclipse (clic derecho en el proyecto -> Exportar ... -> Runnable JAR) y funcionó bien para todos. Luego, llegué y generé el JAR ejecutable configurando un plugin de Maven ("assembly") en el pom.xml, por lo que una compilación Maven clásica produciría el JAR ejecutable.

Esto funcionó muy bien para mí (de cmd y haciendo doble clic) pero no para los usuarios finales (que todavía podían ejecutar la herramienta desde cmd, pero no haciendo doble clic en el archivo JAR).

He generado el JAR ejecutable de Eclipse y ahora todos están contentos de nuevo. No estoy seguro de por qué el JAR generado por Maven no se pudo ejecutar haciendo doble clic, pero no me puedo molestar en investigar más ahora que el trabajo está hecho. Espero que este medio consejo ayude a alguien.

0

Me cansé de no poder modificar las asociaciones de archivos en el Panel de control de Windows 7 y edité el registro (NOTA: no es una mala idea establecer un punto de restauración antes de continuar si cree que hay ALGUNA posibilidad meter la pata) (I ni establecer punto de restauración ni la pata):

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\jar_auto_file] 
@="" 
"EditFlags"=hex:00,00,00,00 

[HKEY_CLASSES_ROOT\jar_auto_file\shell] 

[HKEY_CLASSES_ROOT\jar_auto_file\shell\open] 

[HKEY_CLASSES_ROOT\jar_auto_file\shell\open\command] 
@="\"C:\\Program Files\\Java\\jdk1.7.0_60\\bin\\javaw.exe\" -jar \"%1\" %*" 

Esto asume que .jar archivos tienen (Default) valor jar_auto_file. Si no lo hace, haga lo siguiente:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\.jar] 
@="jar_auto_file" 

p.s. Un problema que encontré en el registro fue que jarfile estaba asociado con Netbeans, Chrome y java.exe, así como con Applications\java.exe. Eliminé ese nodo completo (después de exportarlo, solo para poder devolverlo si era esencial; no lo era). Ahora no hay jarfile en mi registro y todos los archivos .jar se ejecutan como antes.

Esto se manifiesta al mostrar más de un tipo de archivo asociado con los archivos .jar en el Panel de control. ¿Quieres esto:

enter image description here

Si hay más de un elemento se muestra en los programas recomendados, registro de búsqueda de jarfile y (exportación en primer lugar, a continuación) eliminar ese nodo:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jar

0

que tenía mismo problema con los archivos .jar después de probar todo, me di cuenta de que tengo más de una versión de Java instalada. Eliminar las versiones innecesarias resolvió mi problema. Puede ser porque el .jar se confundió entre las diferentes versiones de JRE.

Cuestiones relacionadas