2010-11-11 16 views
5

Soy un tipo de Java desde hace mucho tiempo, y saben que la forma de dirigir un frasco con una clase principal que se hace referencia en un archivo MANIFEST.MF dentro del tarro es fácil:¿Por qué puedo ejecutar JAR directamente desde bash?

java -jar theJar.jar

que estaba usando para poner en marcha este el servidor Fabric3 (contenido en bin/server.jar en su distribución estándar). Noté que cuando lo desempaqué del tarball de distribución, se marcaba como ejecutable. En un capricho, he intentado

./server.jar

de mi bash línea de comandos (bash versión 4.1.5 en Ubuntu 10.10), y he aquí, el servidor puso en marcha como si hubiera escrito el comando normal de java -jar .... El JAR está estructurado como un JAR normal; Hice un head en él, y no había ningún comando #! en los primeros bytes, por lo que bash no debería saber mágicamente para iniciar una máquina virtual de Java con él, ¿verdad? ¿O esta versión de bash ha aumentado la capacidad de iniciar JAR con un manifiesto correcto correctamente? Las mentes que preguntan quieren saber ...

Respuesta

12

Esto puede no ser una característica de bash en absoluto. Si está ejecutando Linux (como ha etiquetado), puede tener el módulo kernel binfmt_misc, que hace un poco de magia, cuando intenta ejecutar un programa. Básicamente, lo que hace es ampliar los formatos binarios que Linux puede ejecutar desde solo elf para incluir también algunos formatos definidos por el usuario, con suficientes instrucciones para ejecutarlos.

+5

Sí, eso es todo. Puede ejecutar update-binfmts --display en Ubuntu 10.10 para ver la lista si hay controladores instalados. – kkress

+0

gnarly, aparentemente puedo ejecutar llvm bytecode desde la línea de comando ^^. – SingleNegationElimination

+0

ok, eso es increíble! Gracias por la ciencia. – aarestad