Cómo crear un archivo JAR ejecutable. ¿Alguien puede ayudarme?
^^Tutorial de Java^^ "Cómo crear un JAR ejecutable" Este artículo explica cómo hacer ejecutable un archivo JAVAArchive (JAR) no ejecutable sin operar directamente el archivo de manifiesto. Aprenderá a escribir un programa corto que ejecute cualquier archivo JAR ejecutando el comando java-jar o haciendo doble clic en un sistema operativo como Windows. Puede empaquetar fácilmente el conjunto completo de archivos de clase y archivos de recursos de una aplicación en un JAR. De hecho, este es el propósito de los archivos jar. Otro propósito es permitir a los usuarios ejecutar fácilmente aplicaciones empaquetadas en archivos jar. Entonces, ¿por qué los archivos jar solo ocupan una posición secundaria en todo Java como archivos, mientras que se ignora la ejecución local? Para ejecutar un archivo jar, puede utilizar la opción -jar del comando java. Por ejemplo, supongamos que tiene un archivo llamado myjar.jar. Este jar es ejecutable, puede ejecutarlo: java-jarmyjar.jar. Otra forma es asociar el archivo jar con la JVM (asociar java.exe y el archivo jar). Juntos, puede ejecutar la aplicación haciendo doble clic en el jar. Por supuesto, el archivo jar debe ser ejecutable. La pregunta ahora es: ¿Cómo hacer un jar ejecutable? Archivo de manifiesto y entrada de clase principal En la mayoría de los archivos jar, un archivo llamado MANIFEST.MF se guarda en un directorio llamado META-INF. Ese archivo contiene una entrada especial llamada Main-Class, que le dice al comando java-jar qué clase debe ejecutarse. El problema es que debe agregar manualmente la entrada apropiada al archivo de manifiesto, y debe estar en una ubicación determinada y en. un formato determinado. Desafortunadamente, no a todo el mundo le gusta abrir WordPad y editar archivos de configuración. Deje que la API le ayude a completar la tarea. Desde el lanzamiento de java1.2, ha aparecido un paquete llamado java.uil.jar que le permite procesar archivos jar cómodamente. (Nota: este paquete se basa en java.util.zip) En particular, el paquete jar le permite manipular fácilmente archivos de manifiesto a través de la clase Mainfest. Escribamos un programa usando esta API. Primero, este programa debe saber tres cosas: 1. El archivo jar que queremos que sea ejecutable. 2. Ejecute la clase principal del jar (esta clase debe estar incluida en el jar). 3. Genere el nombre del nuevo archivo jar, ya que no podemos simplemente sobrescribir el archivo original. Redacción del programa Los tres requisitos enumerados anteriormente formarán los parámetros de nuestro programa. Ahora, elijamos un nombre apropiado para este programa. ¿Cómo suena MakeJarRunnable? Comprobación de parámetros para el método principal Supongamos que nuestro punto de entrada al método principal es un método principal estándar (String[]). Deberíamos verificar los parámetros del programa de esta manera: if(args.length!=3){ System.out.println("Usage: MakeJarRunnable" " "); System.exit(0); se describe, porque esto es importante en el siguiente código. El orden y el contenido de los parámetros no son fijos; sin embargo, si los cambia, recuerde modificar el resto del código en consecuencia.
Accediendo al jar y al archivo de manifiesto del jar Primero, tenemos que crear algunos objetos que entiendan el jar y el manifiesto: //CreatetheJarInputStreamobject, andgetitsmanifest JarInputStreamjarIn=newJarInputStream(newFileInputStream(args[0])); if(manifest ==null){ //Esto sucederáifnomanifestexists manifest=newManifest(); } Para establecer el atributo Main-Class, colocamos la entrada Main-Class en la sección de atributos principales del archivo de manifiesto. Una vez que obtenga esta propiedad del objeto de manifiesto, puede configurar la clase principal requerida. Sin embargo, ¿qué pasa si el atributo main-Class ya existe en el archivo jar original? Aquí simplemente imprimimos una advertencia y salimos. Podemos agregar un argumento de línea de comando para indicarle al programa que use el nuevo valor en lugar del anterior: Attributesa=manifest.getMainAttributes(); StringoldMainClass=a.putValue("Main-Class", args[1]); Si existe un valor antiguo, dígale al usuario que salga if(oldMainClass!=null){ System.out.println("Advertencia: oldMain-Classvalueis:" oldMainClass); salida nuevo JAR Necesitamos crear un nuevo archivo JAR, por lo que Se debe utilizar la clase JarOutputStream. Nota: Debemos asegurarnos de no nombrar el archivo de salida igual que el archivo de entrada. Otra solución es que el programa debería tener en cuenta la situación en la que ambos archivos jar son iguales, solicitando al usuario que sobrescriba el archivo original si está dispuesto a hacerlo. Sin embargo, dejo esto como ejercicio para el lector.
Comience con el siguiente código: System.out.println("Writingto" args[2] "..."); JarOutputStreamjarOut=newJarOutputStream(newFileOutputStream(args[2]), manifest); ingrese el JAR al JAR de salida, así que itere sobre cada entrada: //Createareadbuffertotransferdatafromtheinput byte[]buf=newbyte[4096]; //Itera las entradas JarEntryentry; while((entry=jarIn.getNextJarEntry())!=null){ //Excluir el archivo de manifiesto del antiguo JAR if ("META-INF/MANIFEST.MF".equals(entry.getName()))continue; //Escribe la entrada en el JAR de salida jarOut.putNextEntry(entry); 1 ){ jarOut.write(buf, 0, read); } jarOut.closeEntry(); } //Flushandcloseallthestreams jarOut.flush(); , debemos poner estos El código se coloca en el método principal de una clase y requiere mucho código de importación. Programa completo: /javaworld/javatips/javatip127/MakeJarRunnable.zip Ejemplo de uso del programa Apliquemos este programa a un ejemplo. Suponga que tiene una aplicación y el punto de entrada del programa es una clase llamada HelloRunnableWorld. Suponga que ha creado un archivo jar llamado myjar.jar, que contiene el programa completo. Ejecute MakeJarRunnable: javaMakeJarRunnablemyjar.jarHelloRunnableWorldmyjar_r.jar Como mencioné anteriormente, preste atención al orden de mis parámetros. Si olvida la secuencia y ejecuta el programa sin parámetros, responderá con un mensaje de aviso de uso. Intente ejecutar el comando java-jar en myjar.jar. Luego a myjar_r.jar. ¡Observa la diferencia! Bien, ya has terminado todo esto, explora el archivo de manifiesto de cada jar (META-INF/MANIFEST.MF)