Cómo ejecutar un archivo JAR

207

Creé un archivo JAR como este:

jar cf Predit.jar *.*

Ejecuté este archivo JAR haciendo doble clic en él (no funcionó). Así que lo ejecuté desde el indicador de DOS de esta manera:

java -jar Predit.jar

Levantó excepciones de "Error al cargar la clase principal". Entonces extraje este archivo JAR:

jar -xf Predit.jar

y ejecuté el archivo de clase:

java Predit

Funcionó bien No sé por qué el archivo JAR no funcionó. Por favor, dime los pasos para ejecutar el archivo JAR

Martin Prikryl
fuente

Respuestas:

207

Debe especificar una clase principal en el manifiesto del archivo jar.

Tutorial de Oracle contiene una demostración completa, pero aquí hay otra desde cero. Necesitas dos archivos:

Test.java:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Hello world");
    }
}

manifest.mf:

Manifest-version: 1.0
Main-Class: Test

Tenga en cuenta que el archivo de texto debe terminar con una nueva línea o retorno de carro. La última línea no se analizará correctamente si no termina con una nueva línea o retorno de carro.

Entonces corre:

javac Test.java
jar cfm test.jar manifest.mf Test.class
java -jar test.jar

Salida:

Hello world
Jon Skeet
fuente
1
Si la clase de prueba se refiere a otra clase a través del archivo jar, en ese caso, ¿qué modificaciones se deben hacer?
Anand
@Anand entonces debes incluir una línea Class-Path en tu manifiesto y hacer referencia a los otros jar (s). docs.oracle.com/javase/tutorial/deployment/jar/downman.html
Rob
Por favor, ayúdenme en esta pregunta: stackoverflow.com/questions/24740803/…
Sajad
Creo que tener Manifest-version: 1.0 no es necesario porque el contenido del archivo de manifiesto dado se adjunta al archivo de manifiesto predeterminado que ya tiene la versión docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Georgii Oleinikov
2
Esta es solo una muestra de extremo a extremo. Perfecto simple crujiente. Estuve buscando algo como esto por horas. No estoy seguro de por qué todo Internet está lleno de basura sin un ejemplo tan simple, cuando se busca Cómo crear un "java mundo" Hola. Muchas muchas gracias.
Atul
58
java -classpath Predit.jar your.package.name.MainClass
Linchar
fuente
Si este frasco usa otros frascos, ¿no debería ser classpath como "/ path / to / jars / *"?
Maxim Chetrusca
55
@Max Chetrusca Si pero el separador está :utilizando *no funcionará debido a que su cáscara se expandirá así: "/path/to/jars/a.jar" "/path/to/jars/b.jar"pero lo que realmente quiere es: "/path/to/jars/a.jar:/path/to/jars/b.jar".
Lynch
29

Antes de ejecutar la verificación jar Main-Class: classnameestá disponible o no en el archivo MANIFEST.MF . MANIFEST.MF está presente en jar.

java -jar filename.jar
KARTHIKEYAN.A
fuente
16

Debe agregar un manifiesto al jar, que le dice al tiempo de ejecución de Java cuál es la clase principal. Cree un archivo 'Manifest.mf' con el siguiente contenido:

Manifest-Version: 1.0
Main-Class: your.programs.MainClass

Cambie 'your.programs.MainClass' a su clase principal real. Ahora coloque el archivo en el archivo Jar, en una subcarpeta llamada 'META-INF'. Puede usar cualquier utilidad ZIP para eso.

Florian Fankhauser
fuente
1
Solo por curiosidad, ¿el nombre de la subcarpeta 'Meta-inf' distingue entre mayúsculas y minúsculas? Tradicionalmente lo he visto deletreado 'META-INF'
Adam Paynter
Tienes razón. La especificación dice "META-INF" y no dice nada sobre la insensibilidad a mayúsculas y minúsculas ( java.sun.com/j2se/1.4.2/docs/guide/jar/… )
Florian Fankhauser
12

Un enfoque muy simple para crear .class, archivo .jar.

Ejecutando el archivo jar. No hay que preocuparse demasiado por el archivo de manifiesto. Hazlo simple y elegante.

Programa Java Hello World de muestra

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Compilar el archivo de clase

javac HelloWorld.java

Crear el archivo jar

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

o

jar cvfe HelloWorld.jar HelloWorld *.class

Ejecutando el archivo jar

 java -jar HelloWorld.jar

O

java -cp HelloWorld.jar HelloWorld
nagendra547
fuente
Sí, la jaropción 's le epermite especificar el Main-Class(punto de entrada ) y también crea un archivo de manifiesto correspondiente para usted. Consulte la documentación oficial de jar .
Petr Bodnár el
11

Si no desea crear un manifiesto solo para ejecutar el archivo jar, puede hacer referencia a la clase principal directamente desde la línea de comandos cuando ejecute el archivo jar.

java -jar Predit.jar -classpath your.package.name.Test

Esto establece qué clase principal ejecutar en el archivo jar.

Egil
fuente
2
-classpathviene justo después javay se deshace de él -jar(es decir, esta respuesta es incorrecta)
Pete
4

Java

class Hello{
   public static void main(String [] args){
    System.out.println("Hello Shahid");
   }
}

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

En la línea de comando:

$ jar cfm HelloMss.jar  manifest.mf Hello.class 
$ java -jar HelloMss.jar

Salida:

Hello Shahid
Mohammad Shahid Siddiqui
fuente
3

Si no desea tratar esos detalles, también puede usar los asistentes de jar de exportación de Eclipse o NetBeans.

fortran
fuente
3

Archivo JAR ejecutable de Eclipse

Crear un proyecto Java RunnableJAR

  • Si hay archivos jar se utilizan , agréguelos a la ruta de compilación del proyecto.
  • Seleccione la clase que tiene main () mientras crea el archivo Jar ejecutable. ingrese la descripción de la imagen aquí

Clase principal

public class RunnableMainClass {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Name : "+args[0]);
        System.out.println(" ID  : "+args[1]);
    }
}

Ejecute el archivo Jar utilizando el programa java ( cmd ) proporcionando argumentos y obtenga la salida y la pantalla en la consola eclipse.

public class RunJar { 
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        String jarfile = "D:\\JarLocation\\myRunnable.jar";
        String name = "Yash";
        String id = "777";

        try { // jarname arguments has to be saperated by spaces
            Process process = Runtime.getRuntime().exec("cmd.exe start /C java -jar "+jarfile+" "+name+" "+id);
                    //.exec("cmd.exe /C start dir java -jar "+jarfile+" "+name+" "+id+" dir");
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream ()));
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line).append("\n");
            }
            System.out.println("Console OUTPUT : \n"+sb.toString());
            process.destroy();
        }catch (Exception e){
            System.err.println(e.getMessage());
        }
   }
}

En Eclipse para encontrar atajos :

Ayuda ► Contenido de la ayuda ► Guía del usuario de desarrollo de Java ► Referencias ► Menús y acciones

Yash
fuente
3

Tengo esta estructura de carpetas:

D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ Main.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ press \ OlivePress.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Kalamata .clase D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Ligurian.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Olive.class

Main.class está en el paquete com.lynda.olivepress

Hay otros dos paquetes:

com.lynda.olivepress.press

com.lynda.olivepress.olive

1) Cree un archivo "Manifest.txt"con dos líneas, primero con la clase principal y una segunda línea vacía.

Main-Class: com.lynda.olivepress.Main

D: \ JavaProjects \ OlivePressApp \ Manifest.txt

2) Crear JAR con manifiesto y punto de entrada de clase principal

D: \ JavaProjects \ OlivePressApp>jar cfm OlivePressApp.jar Manifest.txt com/lynda/olivepress/Main.class com/lynda/olivepress/*

3) Ejecutar JAR

java -jar OlivePressApp.jar

Nota: com/lynda/olivepress/*significa incluir los otros dos paquetes mencionados anteriormente, antes del punto 1)

Gabriel D
fuente
-2

Para ejecutar jar, primero debes crear

jar ejecutable

luego

java -jar xyz.jar

comando funcionará

Deepa
fuente