
Estoy desarrollando una aplicación que tenía cierta dependencia y para eso utilizo herramientas externas. Un ejemplo es que uso la herramienta de línea de comandos de PuTTY, plink.exe, para hacer telnet/ssh en una máquina remota desde el programa Java.
Ahora, cuando cambio a Ubuntu, para eso hay una utilidad sshpass que hace lo mismo por mí. Ahora el problema es que sshpass aún no está instalado y antes de instalarlo, mi programa no funcionará.
En Windows, si algo no está ahí, puedo empaquetar un ejecutable portátil en mi programa, por ejemplo, este plink.exe y usarlo en tiempo de ejecución para hacer el trabajo. Ahora en Ubuntu, quiero saber si hay alguna forma de empaquetar un archivo similar a .exe, al que pueda simplemente llamar con argumentos para realizar tareas similares.
Básicamente, quiero saber si hay alguna forma en Ubuntu de ejecutar un archivo sin tener que instalarlo. si es así ¿cómo es posible?
Respuesta1
En Linux, como en Windows, puedes compilar cualquier programa con todas sus dependencias vinculadas como archivos estáticos. Pero la diferencia es que en Linux esta no es la forma habitual de hacer las cosas.
La forma Linux es instalar cada programa solo una vez, si necesita usar shhpass, no debe incluirlo con su software, pero debe incluirlo como una dependencia en su paquete de instalación (es decir, archivo deb para Ubuntu). La administración del paquete se buscará y se instalará cuando esté instalando su programa.
Hay un par de razones para este comportamiento, desde eficiencia (uso de memoria compartida) hasta seguridad (puede incluir un error de seguridad con el programa incluido). Como todo, este enfoque también tiene sus inconvenientes, principalmente la necesidad de un lugar centralizado para instalar el software, pero el punto importante de su respuesta es cómo son las cosas, no cómo podrían ser.
La respuesta corta es sí, puedes hacerlo., pero será difícil. Estarías luchando contra la cultura y el diseño de sistemas operativos tipo Unix. Probablemente necesitarás compilar tus propias versiones de cada programa que quieras agrupar, y a la mayoría de los empaquetadores y usuarios no les gustará.
Respuesta2
El enfoque idiomático en Ubuntu sería entregar, no su programa sin formato, sino un paquete .deb que contenga su programa y también enumere sus dependencias. Luego, al instalar su paquete se instalarán automáticamente las dependencias que falten (suponiendo que estén disponibles en las fuentes estándar).
Hay alguna documentacionaquísobre la creación de paquetes.
El enfoque alternativo, más estilo Windows (e incluso algo OSX-y), es agrupar compilaciones vinculadas estáticamente de todas sus dependencias con su aplicación y descomprimirlas en un directorio temporal desde donde las ejecuta. Puedes usar una herramienta comohacersePara hacer esto: coloque todos los ejecutables que necesita, además de sus archivos jar y un script de inicio adecuado en un directorio, y él hará el resto.
Respuesta3
En Linux, se puede ejecutar cualquier archivo (siempre que tenga los privilegios). Desde su programa Java, puede llamar a cualquier archivo .exe que empaquete con él.
Probablemente necesites asegurarte de que el archivo .exe sea ejecutable en Linux. Algunos, si no la mayoría, de los .exe son específicos de un sistema operativo. Por ejemplo, el sitio web de PuTTY sólo proporciona código fuente para Unix que debe compilarse en un ejecutable (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html). Para Windows, el ejecutable ya está compilado, pero probablemente no se pueda ejecutar en Linux/Unix.