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.
¿Está "Comenzando" el nombre de su clase que está tratando de ejecutar? ¿Está en el paquete predeterminado (no)? –
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
Posible duplicado de http://stackoverflow.com/questions/394616/running-jar-file-in-windows –