Pregunta ¿Diferencias entre "java -cp" y "java -jar"?


¿Cuál es la diferencia entre ejecutar una aplicación Java con
java -cp CLASSPATH y java -jar JAR_FILE_PATH? ¿Se prefiere uno de ellos al otro para ejecutar una aplicación Java? Me refiero a cuál de estas formas es más costosa para JVM (de acuerdo con el uso de recursos de la máquina)?

¿Cuál causará que JVM genere más hilos mientras intenta ejecutar la aplicación?


76
2017-08-12 13:52


origen


Respuestas:


Prefiero la primera versión para iniciar una aplicación java solo porque tiene menos dificultades ("bienvenido al infierno de clase"). El segundo requiere un archivo jar ejecutable y el classpath para esa aplicación debe definirse dentro del manifiesto del jar (todas las demás declaraciones de classpath se ignorarán silenciosamente ...). Por lo tanto, con la segunda versión, debe examinar el archivo jar, leer el manifiesto e intentar averiguar si las entradas classpath son válidas desde donde se almacena el contenedor ... Eso es evitable.

No espero ninguna ventaja o desventaja de rendimiento para ninguna de las versiones. Simplemente le dice a jvm qué clase usar para el hilo principal y dónde puede encontrar las bibliotecas.


62
2017-08-12 13:59



Con el -cp argumento que proporciona el classpath, es decir, la (s) ruta (s) a clases o bibliotecas adicionales que su programa puede requerir al compilarse o ejecutarse. Con -jar especifica el archivo JAR ejecutable que desea ejecutar.

No puedes especificarlos a los dos. Si intentas correr java -cp folder/myexternallibrary.jar -jar myprogram.jar entonces realmente no funcionará. El classpath para ese JAR debe especificarse en su Manifiesto, no como -cp argumento.

Puedes encontrar más sobre esto aquí y aquí.

PD: -cp y -classpath son sinónimos


46
2017-08-12 13:56



Cuando usas java -cp debe proporcionar un nombre de clase principal completo, p.

java -cp com.mycompany.MyMain

Cuando usas java -jar myjar.jar su archivo jar debe proporcionar la información sobre la clase principal a través de manifest.mf contenida en el archivo jar en la carpeta META-INF:

Main-Class: com.mycompany.MyMain


10
2017-08-12 13:57



java -cp CLASSPATH es necesario si desea especificar todos los códigos en classpath. Esto es útil para depurar código.

El formato ejecutable jarred: java -jar JarFile puede usarse si desea iniciar la aplicación con un solo comando breve. Puede especificar archivos jar dependientes adicionales en su MANIFEST utilizando tarros separados por espacios en una entrada de Ruta de clase, por ejemplo:

Class-Path: mysql.jar infobus.jar acme/beans.jar

Ambos son comparables en términos de rendimiento.


10
2017-08-12 13:57



No habrá ninguna diferencia en términos de rendimiento. Usando java - cp podemos especificar las clases y los jar requeridos en el classpath para ejecutar un archivo de clase java.

Si es un archivo jar ejecutable. Cuando se usa el comando java -jar, jvm encuentra la clase que necesita ejecutar desde el archivo /META-INF/MANIFEST.MF dentro del archivo jar.


1
2017-08-12 15:57



Como ya se dijo, el -cp es solo para decirle a jvm en la línea de comando qué clase usar para el hilo principal y dónde puede encontrar las bibliotecas (definir classpath). En -jar espera que la class-path y la main-class se definan en el manifiesto del archivo jar. Entonces otro es para definir cosas en la línea de comando mientras que otras las encuentran dentro del manifiesto de jar. No hay diferencia en el rendimiento. No puede usarlos al mismo tiempo, -jar anulará el -cp.

Aunque incluso si usa -cp, aún revisará el archivo de manifiesto. Entonces puede definir algunas de las rutas de clase en el manifiesto y algunas en la línea de comando. Esto es particularmente útil cuando tiene una dependencia en un jar de terceros, que puede que no proporcione con su compilación o que no desee proporcionar (esperando que ya se encuentre en el sistema donde se va a instalar, por ejemplo). Entonces puede usarlo para proporcionar jarras externas. Su ubicación puede variar entre sistemas o incluso puede tener una versión diferente en un sistema diferente (pero con las mismas interfaces). De esta forma, puede compilar la aplicación con otra versión y agregar la dependencia real de terceros a class-path en la línea de comando cuando la ejecuta en diferentes sistemas.


1
2018-02-03 07:21