Esse artigo faz parte da revista Java Magazine edição 37. Clique aqui para ler todos os artigos desta edição

 

 

uma ferramenta de desenvolvimento. O Eclipse oferece muitas facilidades de personalização e extensão, e não é à toa que se tornou líder de mercado. Neste artigo abordaremos o funcionamento dos plug-ins desta IDE e os passos para criar um plug-in totalmente funcional, para o Eclipse 3.x.

A arquitetura do Eclipse

Grande parte do sucesso do IDE Eclipse deve-se à sua arquitetura extensível (“uma IDE aberta e extensível para tudo e nada em específico”). O Eclipse (neste artigo usaremos “Eclipse” para nos referir ao IDE e não ao projeto como um todo) é constituído de um pequeno núcleo e um imenso conjunto de plug-ins, que trabalham em conjunto para fornecer as diversas funcionalidades da IDE[1].

A plataforma Eclipse gerencia todo o ciclo de vida dos plug-ins, sendo responsável por localizar, carregar e executar os plug-ins instalados. Quando o Eclipse é iniciado ele “descobre” quais plug-ins estão disponíveis (procurando no diretório plugins) e constrói um repositório, denominado plug-in registry, que é utilizado posteriormente para carregar os plug-ins[2]. A Figura 1, adaptada da documentação do Eclipse, ilustra a arquitetura da plataforma e do SDK (que a inclui) e seus principais componentes.

 

Figura 1. Arquitetura do Eclipse.

 

Para permitir extensibilidade, o Eclipse foi projetado com baixo acoplamento entre suas partes, e é um ótimo exemplo de arquitetura modular e extensível. Com a exceção de um pequeno núcleo de runtime, todas as outras partes do Eclipse são plug-ins. A customização da IDE é conseguida estendendo-se seus plug-ins, o que é feito através de extension points (“pontos de extensão”).

A idéia é simples: sempre que um plug-in deseja permitir a extensão ou a customização de uma de suas funcionalidades, ela deve declarar um ponto de extensão. Os pontos de extensão definem “contratos” (normalmente documentos XML e interfaces Java) que devem ser obedecidos pelos plug-ins que implementam a extensão/customização. É interessante notar que o plug-in que está sendo estendido não conhece (nem precisa conhecer) cada implementação específica. Isso permite que plug-ins de diferentes autores trabalhem conjuntamente com facilidade.

Enquanto alguns plug-ins são extremamente complexos e compostos de arquivos de diversos tipos, outros são simplesmente bibliotecas Java que podem ser utilizadas por outros plug-ins. A plataforma Eclipse é organizada em níveis de plug-ins, com plug-ins de “baixo nível” fornecendo pontos de extensão para plug-ins de mais alto nível. Alguns dos plug-ins básicos são:

·         Standard Widget Toolkit (SWT): conjunto de ferramentas que oferecem uma API gráfica portável e integrada com o sistema operacional (SO). O SWT utiliza JNI para acessar as bibliotecas gráficas nativas do SO e renderizar os componentes gráficos utilizados na IDE (botões, imagens, labels etc.);

·         JFace: extensão de “alto nível” do SWT, que oferece mecanismos para construção de diálogos, wizards, actions etc. O JFace implementa a arquitetura MVC;

·         Java Developer Toolkit (JDT): ferramentas para manipulação de código Java;

·         GEF (Graphical Editing Framework): APIs para construção de editores gráficos;

·         EMF (Eclipse Modeling Framework): APIs para construção de modelos;

·         Help: ferramentas para criação de arquivos de ajuda;

·         Team: APIs para acesso a repositórios e versionamento de arquivos.

 

Além desses, dois outros plug-ins merecem atenção especial: o Workbench (interface gráfica comum para recursos e ferramentas) e o Workspace (que gerencia os recursos relativos aos projetos criados pelo usuário). Extensões do Workbench permitem alterar a “aparência” do Eclipse, criando novas views[3], menus e editores, enquanto que extensões do Workspace permitem interagir com novos recursos, como projetos e arquivos.

Estrutura de um plug-in

A partir da versão 3.0 do Eclipse, a descoberta e a ativação de plug-ins passaram a ser comandadas por um mecanismo baseado no Open Services Gateway initiative (OSGi). O uso dessa tecnologia melhorou a portabilidade da ferramenta entre diversos sistemas operacionais e fez com que os plug-ins passassem a ser implementados segundo um novo modelo (OSGi bundles).

O OSGi foi concebido originalmente para aplicações móveis, mas ao poucos tem sido adotado por aplicações fora desse mercado. Seu objetivo é padronizar a maneira como os componentes devem ser registrados em uma aplicação, permitindo que sejam carregados ou descarregados dinamicamente. O OSGi tem ganhado bastante destaque ultimamente, e diversos projetos da Apache já utilizam a tecnologia (ex.: Apache Directory).

Plug-ins podem ser compostos de diversos tipos de arquivos (classes, imagens, bibliotecas etc.), e incluem descritores com informações sobre suas características (versão, classpath, pacotes exportados, pontos de extensão, classes envolvidas, ícones etc.). Essas informações são usadas pelo Eclipse para configurar o ambiente de execução do plug-in e seus componentes.

Antes da versão 3.0 do Eclipse, cada plug-in era armazenado em um diretório próprio (um subdiretório do diretório plugin) e todas as informações do plug-in estavam contidas no arquivo plugin.xml, também localizado nesse diretório. Após a migração para o modelo OSGi, os plug-ins passaram a ser empacotados em arquivos JAR[4]. Além disso, as informações básicas sobre suas características foram movidas para o arquivo de manifest (META-INF/MANIFEST.MF). Assim, plug-ins construídos a partir da versão 3.0 contêm dois descritores: plugin.xml e MANIFEST.MF.

O arquivo plugin.xml

O documento XML a seguir, extraído da documentação do Eclipse, ilustra um descritor de plug-in simples, que implementa uma nova view no Eclipse.

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
    <extension point="org.eclipse.ui.views">
        <category name="Hello Category"
            id="com.example.helloworld">
        </category>
        <view name="Hello View"
            icon="icons/sample.gif"
            category="com.example.helloworld"
            class="com.example.helloworld.HelloWorldView"
            id="com.example.helloworld.HelloWorldView">
        </view>
    </extension>
</plugin>

A implementação da nova view é conseguida através do uso do ponto de extensão org.eclipse.ui.views, indicado no elemento <extension>. No elemento <category> são descritos o nome (name) e o código identificador (id) da categoria. A nova view é descrita no elemento <view>, onde são indicados seu ícone (icon), a referência à sua categoria (category), a classe implementadora (class) e o código identificador da nova view (id). Os atributos de “baixo nível” do plug-in (ex.: informações sobre como o plug-in deve ser empacotado) são descritos no arquivo MANIFEST.MF que, por simplicidade, não é mostrado neste artigo.
Como veremos adiante, o Eclipse disponibiliza recursos que facilitam muito a geração e manuseio dos descritores de plug-ins (plugin.xml e MANIFEST.MF).

Plug-in Development Environment (PDE)

Vimos que a plataforma Eclipse é responsável por gerenciar todo o ciclo de vida de um plug-in, escondendo do desenvolvedor os detalhes de infra-estrutura. Assim, o desenvolvedor passa a se preocupar apenas com a implementação da “lógica de negócios” do plug-in, podendo aproveitar os recursos de uma ferramenta bastante valiosa (que também é um plug-in!): o Eclipse PDE. O Plug-in Development Environment é um ambiente completo para desenvolvimento de plug-ins, que contempla recursos para sua construção, teste, depuração e empacotamento. O Eclipse SDK já inclui o PDE, que vem configurado e pronto para uso.

Um exemplo completo

As funcionalidades do PDE serão apresentadas através do desenvolvimento completo de um plug-in que automatiza a codificação de caracteres especiais.

Quando escrevemos documentação javadoc ou arquivos de propriedades (.properties) é um boa prática utilizar codificação HTML para caracteres especiais, permitindo que o texto seja exibido corretamente em diversos browsers. Desse modo, o caractere “ã” deve ser substituído por “&atilde;”, o caractere “ç” por “&ccedil;” e assim sucessivamente (veja referência ao final do artigo).

O maior problema dessa abordagem é que o desenvolvedor deve conhecer os códigos dos caracteres e digitá-los corretamente. O nosso plug-in fará isso automaticamente, substituindo caracteres especiais por seus correspondentes em HTML.

A utilização do plug-in será feita da seguinte maneira: o usuário seleciona, no Package Explorer, o arquivo que deseja editar, clica com o botão direito e seleciona no menu popup o item correspondente. Todos os caracteres especiais do arquivo (que deve estar aberto no editor) serão substituídos automaticamente, e uma barra de progresso indicará o andamento da operação.

Criando o projeto do plug-in

A maneira mais fácil de criar um plug-in é usando o wizard disponível no Eclipse. Para iniciar o wizard, selecione File|New>Project e escolha a opção Plug-in Project dentro da categoria Plug-in Development. A primeira tela do wizard será exibida (Figura 2). Nesta tela devem ser informadas as características do projeto.

 

Figura 2. Informando os dados básicos do projeto.

 

É possível perceber que a criação de um projeto de plug-in é semelhante à de um projeto Java comum. Vamos aceitar as opções default, e fornecer “br.com.jm.plugin” como o nome do projeto (é uma boa prática utilizar nomenclatura de pacotes para o nome do plug-in). Ao clicar no botão Next, o wizard é direcionado para a próxima página (Figura 3).

 

...

Quer ler esse conteúdo completo? Tenha acesso completo