lib - ¿Diferencias entre "java-cp" y "java-jar"?
linux java jar classpath (6)
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.
¿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?
Con el argumento -cp
usted proporciona la ruta de -cp
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 intenta ejecutar java -cp folder/myexternallibrary.jar -jar myprogram.jar
entonces realmente no funcionará. El classpath para ese JAR debe especificarse en su Manifiesto, no como un argumento -cp
.
Puede encontrar más sobre esto here y here .
PS: -cp
y -classpath
son sinónimos.
Cuando se utiliza java -cp
, se le solicita que proporcione un nombre de clase principal completo, por ej.
java -cp com.mycompany.MyMain
Cuando utilice java -jar myjar.jar
su archivo jar debe proporcionar la información sobre la clase principal a través de manifest.mf contenido en el archivo jar en la carpeta META-INF
:
Main-Class: com.mycompany.MyMain
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.
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.
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
se puede utilizar si desea iniciar la aplicación con un solo comando corto. Puede especificar archivos jar dependientes adicionales en su MANIFIESTO usando frascos 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.