
Estou desenvolvendo uma aplicação que tinha alguma dependência e para isso utilizo ferramentas externas. Um exemplo é que eu uso a ferramenta de linha de comando plink.exe do putty para máquina remota telnet/ssh a partir do programa java.
Agora, quando mudo para o Ubuntu, para isso existe um utilitário sshpass que faz o mesmo por mim. Agora o problema é que o sshpass ainda não está instalado e antes de ser instalado meu programa não funcionará.
No Windows, se algo não estiver lá, posso empacotar um executável portátil em meu programa, por exemplo, este plink.exe e usá-lo em tempo de execução para fazer o trabalho. Agora, no Ubuntu, quero saber se existe alguma maneira de empacotar um arquivo semelhante a .exe, que posso simplesmente chamar com argumentos para executar tarefas semelhantes?
Basicamente eu quero saber se existe alguma maneira no Ubuntu de executar um arquivo sem precisar instalá-lo? se sim, como é possível??
Responder1
No Linux, assim como no Windows, você pode compilar qualquer programa com todas as suas dependências vinculadas como arquivos estáticos. Mas a diferença é que no Linux esta não é a forma usual de fazer as coisas.
A maneira do Linux é instalar cada programa apenas uma vez, se você precisar usar shhpass, você não deve agrupá-lo com seu software, mas deve listá-lo como uma dependência em seu pacote de instalação (ou seja, arquivo deb para Ubuntu). O gerenciamento de pacotes irá buscar e instalar quando estiver instalando seu programa.
Existem algumas razões para esse comportamento, desde eficiência (uso de memória compartilhada) até segurança (você pode enviar um bug de segurança com o programa incluído). Como tudo, essa abordagem também tem suas desvantagens, principalmente a necessidade de um local centralizado para instalação de software, mas o ponto importante para sua resposta é como as coisas são, não como poderiam ser.
A resposta curta é sim, você consegue, mas será difícil. Você estaria lutando contra a cultura e o design de sistemas operacionais do tipo Unix. Você provavelmente precisará compilar suas próprias versões de cada programa que deseja agrupar, e a maioria dos empacotadores e usuários não vão gostar disso.
Responder2
A abordagem idiomática no Ubuntu seria distribuir não o seu programa bruto, mas um pacote .deb contendo o seu programa e também listando suas dependências. Então, a instalação do seu pacote instalará automaticamente todas as dependências ausentes (assumindo que estejam disponíveis nas fontes padrão).
Existe alguma documentaçãoaquina criação de pacotes.
A abordagem alternativa, mais Windows (e até mesmo um pouco OSX-y), é agrupar compilações vinculadas estaticamente de todas as suas dependências com seu aplicativo e descompactá-las em um diretório temporário de onde você as executa. Você pode usar uma ferramenta comofaça você mesmopara fazer isso: coloque todos os executáveis que você precisa, mais seus jars e um script de inicialização adequado em um diretório, e ele fará o resto.
Responder3
No Linux, qualquer arquivo pode ser executado (desde que você tenha privilégios). No seu programa Java, você pode chamar qualquer arquivo .exe empacotado com ele.
Você provavelmente precisará ter certeza de que o arquivo .exe é executável no Linux. Alguns, senão a maioria dos .exe, são específicos de um sistema operacional. Por exemplo, o site do putty fornece apenas código-fonte para unix que precisa ser compilado em um executável (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html). Para Windows, o executável já está compilado, mas provavelmente não pode ser executado em Linux/Unix.