Escolar Documentos
Profissional Documentos
Cultura Documentos
Distribuindo
sua aplicao
Java via RPM
Agilize a implantao de suas
aplicaes, transformando-a em
um processo simples como apertar um boto, independentemente
da quantidade de dependncias que ela possua.
/ 46
Diego Falco | dfalcaocc@gmail.com
Bacharel em Cincia da Computao, MBA em Gesto de Projetos pela FGV, possui as certificaes SCJP, SCWCD e CNAP e traba-
lha h 8 anos com a plataforma Java. Atualmente trabalha como pesquisador no INdT (Instituto NOKIA de Tecnologia).
vel agrupar vrios arquivos em apenas um atravs do quitetura em particular, ou seja, se voc deseja que
empacotamento, permitindo tambm que mltiplas a aplicao empacotada seja executada em duas ar-
verses de um pacote possam ser instaladas no mes- quiteturas diferentes, dois pacotes RPMs devero
mo sistema. Alm disso, as atualizaes na aplicao ser criados normalmente, um para cada arquitetura,
tornam-se mais fceis, pois o RPM capaz de re- exceto no caso em que a aplicao independente
mover dados antigos, preservar dados da instalao de plataforma. Nesse caso, o pacote ser sinalizado
anterior ou sobrescrev-los quando necessrio, alm com o nome noarch, conforme veremos no exemplo
de permitir que essas atualizaes sejam pontuais prtico em breve. J o pacote fonte deve conter todos
em apenas determinados componentes. os arquivos, scripts e comandos necessrios para se
Basicamente, o RPM um sistema de gerencia- criar o RPM binrio a qualquer momento para a pla-
mento de pacotes free, open-source, padro e nativo taforma em questo. Na tabela 1 podemos visualizar
em vrias distribuies Linux, capaz de empacotar os as plataformas e arquiteturas suportadas pelo RPM,
diversos arquivos de uma aplicao em apenas um ou seja, todos os valores que podem ser atribudos
pacote RPM e controlar o seu ciclo de vida, ou seja, o tag BuildArch do cabealho do arquivo de especifi-
que deve ser executado antes e depois da sua insta- cao.
lao e da sua remoo. Esse controle feito atravs
de uma especificao escrita em um arquivo com ex- PLATAFORMA ARQUITETURAS
tenso .spec que ser detalhado no prximo tpico.
Para facilitar na manuteno, os pacotes so i386, i486, i586, i686,
Intel-compatible
rotulados com nomes bem definidos, divididos em athlon, geode, pentium3,
32-bit
quatro partes: nome-verso-release.arquitetura. pentium4
rpm, por exemplo, mundoj-webapp-1.0-1.noarch. Intel-compatible
rpm. A primeira parte identifica geralmente o nome x86_64, amd64
64-bit
da aplicao, mas pode ser o nome que ser atribu-
do ao pacote. A segunda parte diz respeito verso Intel Itanium ia64
da aplicao que est empacotada e a terceira parte alpha, alphaev5, alphaev56,
identifica qual release dessa verso o pacote contm HPAlpha(Digital,
alphapca56, alphaev6,
e, por fim, a quarta parte diz respeito arquitetura- Compaq)
alphaev67
-alvo do pacote. Deve-se ressaltar que esse o pa-
dro para o nome do arquivo .rpm gerado, mas quan- sparc, sparcv8, sparcv9,
Sparc/Ultra Sparc
do esse pacote for instalado, por default, ele ser sparc64, sparc64v, sun4,
(Sun)
referenciado pelo seu nome configurado no arquivo sun4c, sun4d, sun4m, sun4u
de especificao.
Existem duas formas de pacotes RPM: binrio e
fonte. Um pacote binrio compilado para uma ar-
47 \
armv3l, armv4b, armv4l, Contm comandos para
ARM armv5tel, armv5tejl, limpar arquivos temporrios
armv6l,armv7l %clean
utilizados durante a criao
MIPS mips, mipsel do pacote.
/ 48
%install %postun
rm -rf $RPM_BUILD_ROOT echo POSTUN SECTION
echo Todos os arquivos foram removidos com
echo INSTALL SECTION sucesso!
JBOSS_DEPLOY_DIR=/usr/local/jboss/standalone/ %post
deployment echo POST SECTION
%clean %changelog
rm -rf $RPM_BUILD_ROOT * Thu Aug 09 2012 Manaus
rm -rf %{_tmppath} - Criacao inicial do spec
49 \
instalados. Aps a instalao do pacote, possvel O sistema RPM segue uma estrutura padro de
executar o comando 3 que far com que as sees diretrios que devemos respeitar para a criao do
%preun e %postun sejam executadas, normalmente pacote. Abaixo, podemos conhecer a estrutura e o que
removendo todos os arquivos que foram previamen- deve existir em cada diretrio:
te instalados pelo pacote. A seguir, esse ciclo de vida BUILD: armazena os itens que devem ser em-
passar a fazer mais sentido atravs de um exemplo pacotados. No caso do exemplo, o arquivo .war,
prtico. o shell script e o .sql do dump.
BUILDROOT: contm uma cpia do que ser
Criando o arquivo .rpm copiado para o sistema de arquivos durante o
Para se criar o pacote RPM, pode-se utilizar de processo de instalao.
uma abordagem tradicional que exige um conheci- RPMS: contm o arquivo RPM binrio gerado
mento mais avanado sobre os comandos do RPM e pela ferramenta rpm-build.
a sintaxe do arquivo spec, como tambm podemos SOURCES: contm os fontes, caso exista.
utilizar o plugin RPM para o maven. Abaixo, as duas SPECS: contm o arquivo spec que servir de
abordagens de empacotamento sero explicadas para fonte para a gerao do pacote RPM em ques-
a gerao de um pacote RPM binrio. to.
SRPMS: contm o RPM fonte gerado no proces-
Abordagem tradicional so de gerao do pacote RPM.
Apesar de ser um pouco mais complicada, essa Para criarmos a estrutura supracitada, vamos
abordagem bem mais robusta, pois existem coisas criar tambm um usurio comum para gerar nosso
que ainda no so possveis com o plugin do maven pacote RPM sem perigo de causar danos ao nosso sis-
at a escrita deste artigo, como, por exemplo, lidar tema. Para isso, abra o terminal e digite os comandos
com fontes. abaixo:
Para iniciarmos o exemplo, alguns pr-requisitos
precisam ser atendidos, como: # adduser mundoj-rpm -m
# passwd mundoj-rpm
CentOS5+: por mais que o RPM possa executar # su - mundoj-rpm
em outras distribuies linux, vamos utilizar o # cd /home/mundoj-rpm
CentOS 5 ou superior para desenvolver o exem- # mkdir rpm
plo prtico deste artigo; # cd rpm
rpm-build: ferramenta necessria para gerar o # mkdir BUILD BUILDROOT RPMS SOURCES
pacote RPM a partir do arquivo spec; SPECS SRPMS
YUM: gerenciador de pacotes que ser utiliza-
do para instalar o rpm-build; Alm disso, precisamos criar um arquivo chama-
JBoss 7: para simplificar o exemplo, assumimos do .rpmmacros na home do nosso usurio que infor-
que j existe um JBoss 7 instalado em /usr/lo- mar ao RPM qual diretrio utilizar para a estrutura
cal/jboss e rodando. Se no existir, a instalao de diretrios e para pasta temporria. Para isso, exe-
criar o diretrio e copiar o arquivo .war. Por- cute os comandos abaixo no terminal:
tanto, esse pr-requisito no obrigatrio caso # echo %_topdir /home/mundoj-rpm/rpm >>
voc no queira ver a aplicao rodando aps .rpmmacros
a instalao do pacote. O importante aqui no # echo %_tmppath /home/mundoj-rpm/rpm/tmp
ver a aplicao empacotada rodando e, sim, >> .rpmmacros
entender que podemos automatizar o deploy Agora que j temos a estrutura pronta e os paths
de uma aplicao atravs da cpia de um WAR, configurados, vamos copiar para a pasta BUILD os ar-
por exemplo. quivos que sero empacotados. Para isso, execute o
Primeiramente, vamos instalar o rpm-build que comando abaixo no terminal:
ser a ferramenta responsvel por gerar nosso pacote
RPM a partir do arquivo spec. Para isso, abra o termi- # cp dump.sql /home/mundoj-rpm/rpm/BUILD/
nal e execute o comando abaixo: # cp dump.sh /home/mundoj-rpm/rpm/BUILD/
# yum install rpm-build # cp mundoj-web-1.0-SNAPSHOT.war /home/
Aps a execuo do comando acima, o YUM ve- mundoj-rpm/rpm/BUILD/
rificar se o rpm-build j est instalado ou se precisa
ser atualizado. Caso contrrio, ser mostrada uma Como voc no possui esses arquivos, voc pode
opo para aceitar ou recusar a instalao. Se voc utilizar qualquer arquivo .war, qualquer arquivo .sh
no tem acesso Internet, ter que baix-lo e instal- e qualquer arquivo.sql nesse exemplo, contanto que
-lo manualmente. estejam com os mesmos nomes ou que voc faa as
/ 50
adaptaes necessrias. Voc pode tambm sim-
plesmente criar os arquivos em branco no diretrio
BUILD, pois o objetivo aqui voc entender que alm
de outras coisas, tambm podemos copiar arquivos
e executar scripts. Para criar os arquivos fictcios do
exemplo, execute no terminal os comandos abaixo:
# touch /home/mundoj-rpm/rpm/BUILD/dump.
sql
# touch /home/mundoj-rpm/rpm/BUILD/dump.
sh
# echo #!/bin/sh >> /home/mundoj-rpm/rpm/
BUILD/dump.sh
# echo echo Executando o script para popular o
banco de dados >> /home/mundoj-rpm/rpm/BUILD/
dump.sh
# touch /home/mundoj-rpm/rpm/BUILD/mun-
doj-web-1.0-SNAPSHOT.war
Feito isso, crie o arquivo mundoj.spec dentro da
pasta SPECS e copie o cdigo disponvel na Listagem
1. Em seguida, execute no terminal o comando abaixo
para a gerao do arquivo .rpm:
# rpmbuild bb /home/mundoj-rpm/rpm/SPECS/ Figura 2. Estrutura do projeto-exemplo.
mundoj.spec
Pronto, agora temos um pacote RPM pronto para Listagem 2. Contedo parcial do arquivo pom.xml.
ser instalado. Para instal-lo, execute no terminal o
<build>
comando abaixo como usurio root:
<plugins>
# rpm -ivh /home/mundoj-rpm/rpm/RPMS/noar- <plugin>
ch/mundoj-webapp-1.0-1.noarch.rpm <groupId>org.codehaus.mojo</groupId>
Aps a execuo do comando, podemos verificar <artifactId>rpm-maven-plugin</artifactId>
que foi criada a pasta /usr/local/mundoj/ no sistema <version>2.1-alpha-2</version>
de arquivos contendo o arquivo .sql e o arquivo .sh <executions>
responsvel por popular o banco de dados e que o ar- <execution>
quivo .war foi copiado para o diretrio de deploy do <goals>
<goal>rpm</goal>
JBoss 7, ou seja, /usr/local/jboss/standalone/deploy-
</goals>
ment. </execution>
Para remover o pacote, utilize o nome que foi </executions>
utilizado na tag name do arquivo spec, ou seja, <configuration>
mundoj-webapp. Logo, execute o comando abaixo no <name>mundoj-webapp</name>
terminal: <version>1.0</version>
# rpm -e mundoj-webapp <release>1</release>
51 \
</defineStatement> </postremoveScriptlet>
</defineStatements> </configuration>
<mappings> </plugin>
<mapping> <plugins>
<directory>/usr/local/jboss/ <build>
standalone/deployment/</directory>
<filemode>444</filemode>
<username>root</username> A partir da tag <configuration>, nota-se uma seme-
<groupname>root</groupname> lhana muito grande com o arquivo spec, pois defini-
<sources> mos todo o cabealho utilizando as mesmas keywor-
<source> ds utilizadas na abordagem tradicional e outras bem
<location>target/mundoj-web-1.0-
parecidas para mapear as sees do ciclo de vida do
SNAPSHOT.war</location>
</source> pacote. Para as aes que devem ser executas durante
</sources> o ciclo de vida, utilizamos a tag <mapping> onde
</mapping> possvel informar o arquivo que deve ser copiado, o
<mapping> diretrio de destino no sistema de arquivos e as per-
<directory>/usr/local/mundoj</directory> misses. Portanto, as mesmas coisas que foram feitas
<filemode>755</filemode>
na abordagem tradicional tambm foram feitas utili-
<username>root</username>
<groupname>root</groupname> zando o plugin, porm de forma muito mais simples,
<sources> intuitiva e rpida. Um ponto importante que deve
<source> ser explicado a linha _unpackaged_files_terminate_
<location>src/main/ build 0 que se repetiu tanto no arquivo spec quanto
resources/dump.sh</location> no pom.xml. Essa linha informa ao rpmbuild para no
</source>
abortar a gerao do pacote caso seja encontrado al-
</sources>
</mapping> gum arquivo no diretrio BUILDROOT que no esteja
<mapping> listado na seo %files para ser copiado para o pacote
<directory>/usr/local/mundoj</directory> RPM.
<filemode>440</filemode> Depois de preparar o pom.xml, execute o maven
<username>root</username> install no projeto. Aps o trmino do build possvel
<groupname>root</groupname>
verificar na pasta target que o plugin criou a mesma
<sources>
<source> estrutura que criamos na abordagem tradicional, com
<location>src/main/resources/ o arquivo spec gerado automaticamente na pasta
dump.sql</location> SPEC e o pacote RPM na pasta RPMS/noarch. Daqui
</source> em diante, os passos para manuseio do pacote so os
</sources> mesmos da abordagem tradicional, utilizando a linha
</mapping>
de comando para instalar, remover ou atualizar.
</mappings>
<preinstallScriptlet> Independentemente da abordagem de empacota-
<script>echo PRE SECTION</script> mento utilizada, a sada idntica, isto , um pacote
</preinstallScriptlet> RPM contendo todos os arquivos necessrios para
<preremoveScriptlet> a completa instalao da aplicao. De posse desse
<script>rm -rf /usr/local/jboss/standalone/ nico pacote, o sysadmin capaz de executar a insta-
deployment/mundoj-web-1.0-SNAPSHOT.war
lao sem risco de erros e de forma bem mais rpida
| rm -rf /usr/local/mundoj</script> do que se fosse instalar cada dependncia manual-
</preremoveScriptlet> mente. Alm disso, existem diversos gerenciadores
<postinstallScriptlet> de pacotes RPM que tornam essa forma de empaco-
<scriptFile>src/main/resources/ tamento mais poderosa e facilitam ainda mais esse
dump.sh</scriptFile> trabalho, pois se responsabilizam por encontrar em
algum repositrio local ou remoto, baixar e ins-
<fileEncoding>utf-8</fileEncoding>
talar a aplicao e todas as dependncias descritas
</postinstallScriptlet>
<postremoveScriptlet> no arquivo spec, bem como desinstalar tudo que foi
<script>echo Todos os arquivos foram instalado pelo pacote independentemente das sees
removidos com sucesso!</script> %preun e %postun declaradas nesse arquivo. No faz
parte do escopo deste artigo, mas convidamos o leitor
a conhecer um pouco mais sobre o YUM, um geren-
ciador de pacotes RPM open-source.
/ 52
Consideraes Finais
Este artigo apresentou de forma pragmtica uma /referncias
poderosa ferramenta para empacotamento, desen-
volvida em 1997 para ser usada no linux Red Hat, mas
que hoje pode ser utilizada em vrias distribuies
e pode servir perfeitamente para empacotar, distri-
buir e automatizar a implantao de aplicaes Java e > http://docs.fedoraproject.org/en-US/Fedora_Draft_
suas dependncias. Mostramos tambm que existem Documentation/0.1/html/RPM_Guide/
duas formas de gerao do pacote RPM: a abordagem
tradicional via linha de comando e o plugin RPM para > http://grahams.free-online.co.uk/RPMNotes.html
53 \