Distribuindo aplicações em pacotes .deb
É muito comum ver pessoas — em fóruns e listas de discussão — perguntando como fazer para gerar instaladores para suas aplicações. Mesmo no mundo Java, o que não falta são opções.
Se você acompanha este blog, é bem provável que você o esteja lendo agora com o Firefox rodando em um sistema GNU/Linux. E, se você está lendo este texto com o IE no Windows, só está fazendo isso porque é obrigado. Afinal, quem — em sã consciência — usa Windows/IE?
Enfim… o que muita gente ainda não percebeu é que esse procedimento de gerar instaladores é, de certa forma, uma “reinvenção da roda”, pelo menos quando se deseja instalar algo em um sistema GNU/Linux. Vamos supor que eu deseje distribuir uma aplicação minha em sistemas Debian. Por que eu iria querer gerar um instalador se eu posso fazer uso do sistema nativo de gerenciamento de pacotes, que, por sinal, é extremamente poderoso?
Um exemplo básico que ilustra o que estou falando:
# dpkg -i aplicacao.deb
Esse comandinho porcaria aí instala a aplicação contida no arquivo .deb. Simples assim. Ah, e se essa aplicação depender de outras que não estejam instaladas? Tais aplicações são automaticamente baixadas e instaladas! Tente, no Windows, instalar uma aplicação que precise do .Net (que você não tem instalado)… é bem provável que, no máximo, você tome uma mensagem de erro na cabeça.
Como eu uso o Ubuntu (que é um tipo de Debian), mostrarei neste post como fazer para distribuir uma aplicação em um pacote .deb.
A aplicação
Vamos tomar como exemplo uma aplicação Java qualquer. Uma aplicação Java SE típica teria uma estrutura de diretórios parecida com o seguinte:
/minha-appaplicacao.jarexecutar.shicone.png/liblib1.jarlib2.jarlib3.jar
Onde os arquivos da aplicação devem ser colocados?
Assim como acontece em outros sistemas, o GNU/Linux também tem diretórios específicos para cada tipo de arquivo. Precisamos então organizar os arquivos da nossa aplicação nos diretórios corretos dentro do sistema.
Uma forma simples de descobrir isso é olhar um pacote .deb de uma aplicação qualquer! Abra o diretório /var/cache/apt/archives e escolha um arquivo .deb como exemplo.
Caso você tenha o Pidgin instalado, tente abrir os arquivos .deb correspondentes e olhar a lista de arquivos. Isso nos dá uma idéia do lugar onde devemos colocar nossos arquivos:
- Executáveis:
/usr/bin; - Imagens:
/usr/share/pixmapse/usr/share/icons; - Atalhos:
/usr/share/applications; - Configurações globais:
/etc; - Bibliotecas:
/usr/lib.
Podemos facilmente adaptar a estrutura de arquivos mostradas no tópico anterior para que ela seja parecida com a que vimos no Pidgin:
/usr/binminha-app
/share/iconsminha-app.png
/applicationsminha-app.desktop
/lib/minha-appaplicacao.jar/liblib1.jarlib2.jarlib3.jar
Pode até parecer meio complexo num primeiro momento, mas na verdade tudo o que fizemos foi renomear alguns arquivos e definir o lugar certo para cada um deles.
O arquivo de controle
Todo pacote .deb precisa conter um arquivo que informa os dados do pacote, que chamamos de arquivo de controle. Abaixo segue um trecho do arquivo de controle do Pidgin:
Package: pidgin Version: 1:2.2.0-0debuntu2 Section: net Priority: optional Architecture: i386 Depends: pidgin-data ... Recommends: gstreamer0.10-plugins-base, ... Suggests: gnome-panel ... Replaces: gaim ... Installed-Size: 2664 Maintainer: Ubuntu Core Developers ... Description: multi-protocol instant messaging client Pidgin is a graphical, modular Instant Messaging client capable of using AIM/ICQ, Yahoo!, MSN, IRC, Jabber, Napster, Zephyr, Gadu-Gadu, Bonjour, Groupwise, Sametime, and SIMPLE all at once. . Some extra packages are recommended to use the core functionality present... Original-Maintainer: Robert McQueen ...
Grande parte do conteúdo deste arquivo é auto-explicativo. Não entrarei em detalhes aqui, mas este guia possui as informações necessárias para que você possa entender melhor os campos deste arquivo.
Criando um atalho
Ok, já sabemos como a aplicação deve ser estruturada. A menos que a aplicação rode em linha de comando, podemos facilitar um pouco mais as coisas ao adicionar um atalho no menu do GNOME. Mas, como fazer para criar um atalho no menu do GNOME?
Novamente, o jeito aqui é usar a imaginação. Se você quiser que sua aplicação fique no menu Applications - Accessories, então faça o seguinte:
- Abra um editor de texto (como o gedit);
- Arraste um atalho desse menu e o solte dentro do editor.
Veja abaixo um trecho do arquivo de atalho para a calculadora do GNOME, que fica no menu Applications - Accessories. O nome do arquivo é gcalctool.desktop:
[Desktop Entry] Encoding=UTF-8 Name=Calculator Comment=Perform calculations Exec=gcalctool Icon=gnome-calculator Terminal=false Type=Application StartupNotify=true Categories=GNOME;GTK;Utility;
Para criar um atalho, basta criar um arquivo minha-app.desktop com os valores adequados nos campos que vimos na listagem anterior. Como já sabemos, este arquivo deverá ficar no diretório /usr/share/applications.
Gerando o arquivo .deb
Antes de gerar o arquivo .deb precisamos criar uma estrutura de diretórios que “imite” a estrutura que organizamos nos primeiros tópicos. Um exemplo disso seria:
/home/usuario/minha-app/DEBIANcontrol
/usr/binminha-app
/share/iconsminha-app.png
/applicationsminha-app.desktop
/lib/minha-appaplicacao.jar/liblib1.jarlib2.jarlib3.jar
Veja que a única coisa diferente aqui foi que adicionamos o arquivo de controle em DEBIAN/control. Uma vez organizados os arquivos, basta gerar o pacote .deb com o comando dpkg:
$ cd /home/usuario $ ls -a . .. minha-app $ dpkg -b minha-app minha-app.deb
Agora tente instalar o pacote para verificar se ele foi gerado corretamente:
# dpkg -i minha-app.deb
Podemos facilmente automatizar esse processo com ajuda de alguma ferramenta de build, como o Gant. Um exemplo de script Gant para isso pode ser visto no pacote Source .zip deste projeto.
Tags: ant, build, deb, debian, distribuição, gant, gnome, instalador, linux, pacotes, script, ubuntu

28 de setembro de 2007 às 10:23 am
Muito boa a explicação, parabéns!
Somente o fato de poder colocar as dependências no .deb ja é uma dor de cabeça enorme a menos =P
28 de setembro de 2007 às 10:52 am
Opa, valeu
30 de setembro de 2007 às 11:32 pm
Legal kra, valeu.
Opinião a parte, eu ainda acho o linux complicado, imagina falar pra minha mãe q tem 53 anos e comprou nas casas Bahia um micro com linux, que ela tem q abrir um console, fazer um su para o root ou usar o sudo e digitar aquele comando para instalar esse programa ou qualquer outro?? Eu uso windows pq eu acho muito mais fácil de usar e melhor, ninguém me obrigou e estou em plena sã consciência, ahh, meu windows não é pirata.
.
“Tente, no Windows, instalar uma aplicação que precise do .Net (que você não tem instalado)”, da mesma forma tente instalar/rodar uma aplicacação java no linux que não tem o jre/sdk…
Mas essa é minha humilde opinião assim como vc posta aqui as suas
Parabéns pelo blog, sempre dou uma passada aqui pra ler seus posts que acho ótimos.
Até.
Teo.
30 de setembro de 2007 às 11:53 pm
Opa Teo, como vai?
Erro meu ter generalizado com base no que eu penso. Foi mal, é que às vezes eu sou sem noção, mesmo…
Mas, de qualquer forma, em muitas distribuições nem é preciso digitar comandos no terminal para instalar um pacote .deb; basta dar um duplo clique para que uma janela de instalação apareça (que mostra as dependências do pacote, arquivos a serem instalados, uma descrição do pacote etc.
Se “instalarmos” as aplicações do modo tradicional (unzip e run)… sim, acontece igualzinho.
Mas a idéia aqui foi justamente mostrar uma forma de se atacar problemas como esse, fazendo uso do sistema de gerenciamento de pacotes nativo. Sou suspeito para falar, mas acredito que não haja nada parecido para Windows (pelo menos, não de graça e ao alcance de simples mortais).
Pô, se todo mundo viesse aqui mostrar suas opiniões, eu ficaria muito contente!
Valeu pelo comentário!
Até mais.
1 de outubro de 2007 às 12:33 am
Hehe…
Nem esquente kra… tranquilo…
Kra, eu pensei dez vezes antes de dar o submit, eu pelo menos tenho medo de mostrar minha opinião e mais uma vez parábens pelo blog, vc tem coragem de mostrar sua opinião e aceitar críticas na boa.
Até.
Teo.
1 de outubro de 2007 às 8:12 pm
Às vezes é bom opinar sobre algo pois sempre existe a possibilidade de aprendermos algo novo a respeito (através de críticas e sugestões) e, conseqüentemente, ajustar nossas opiniões.