Melhor maneira de construir um sistema Plugin com Java

145

Como você implementaria um sistema Plugin para seu aplicativo Java?

É possível ter um sistema fácil de usar (para o desenvolvedor) que consiga o seguinte:

  • Os usuários colocam seus plugins em um subdiretório do aplicativo
  • O plug-in pode fornecer uma tela de configuração
  • Se você usa uma estrutura, a licença é compatível com o desenvolvimento comercial?
Sven Lilienthal
fonte

Respostas:

107

Primeiro você precisa de uma interface que todos os plugins precisam implementar, por exemplo

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Os autores de plug-ins devem agrupar seus plug-ins em arquivos JAR. Seus aplicativos abrem o arquivo JAR e, em seguida, poderiam usar um atributo do manifesto JAR ou a lista de todos os arquivos no arquivo JAR para localizar a classe que implementa a interface do Plugin. Instanciar essa classe, o plugin está pronto para começar.

É claro que você também pode implementar algum tipo de sandbox para que o plug-in seja restrito ao que ele pode ou não fazer. Eu criei um pequeno aplicativo de teste (e publiquei um blog sobre ele ) que consiste em dois plug-ins, um dos quais tem acesso negado aos recursos locais.

Bombe
fonte
2
a caixa de areia que você mencionou é realmente a parte mais difícil! mas não se preocupe - osgi já faz isso por você, como mencionado acima.
Chii
1
Sandboxing não é tão difícil. Demorei duas semanas para descobrir como fazê-lo corretamente, mas depois que você souber que é bem simples. :)
Bombe
@Bombe Este exemplo de aplicação ainda está em algum lugar?
ataulm
* usando o anexo encontrado em bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm
@ timberwo7ves Eu não entendo o que você quer dizer. O aplicativo de teste de arquivo ainda pode ser baixado no local indicado na postagem e na página que você mencionou.
Bombe
41

Use OSGi .

É a base do sistema de plug-in Eclipse. Equinox é a implementação do Eclipse (EPL licenciado) e Felix é a implementação do Projeto Apache (licença pública Apache pública).

O Eclipse fornece um exemplo concreto de que o OSGi pode cobrir os pontos que você mencionou (ou você pode simplesmente construir seu aplicativo sobre o Eclipse RCP se desejar uma pilha completa do Eclipse / SWT / JFace).

Aaron Maenpaa
fonte
4
Eu brinquei com o OSGi, mas nunca encontrei uma cartilha realmente boa para isso. Seria ótimo se alguém pudesse recomendar alguns links aqui.
Brian Matthews
1
Incorporei o equinócio ao meu aplicativo e usei práticas OSGi padrão para fazer exatamente o que o OP deseja. No balanço também, não SWT. A Web também começou. bom recurso inicial: neilbartlett.name/blog
basszero 21/01
3
O OSGi é idealmente o sistema de plugins de fato. No entanto, o salto de Java padrão para modelo de programação OSGi é bastante ampla ...
Hendy Irawan
30

Desde a versão 1.6, existe o java.util.ServiceLoader que pode ser usado se você quiser codificar seu próprio sistema simples.

Mas se você quiser algo além de recursos básicos, use uma das estruturas existentes.

Pete Kirkham
fonte
16

Há também o JPF (Java Plugin Framework) .

jan
fonte
Alguém aqui usou o JPF? Soa interessante #
6111 Sven Lilienthal
1
O JabRef usa o JPF para seus plugins. Funciona muito bem.
koppor
Estou usando o JPF, mas está fortemente associado ao Ant. Quero me livrar dele, mas não sei quanto impacto isso terá no meu aplicativo.
MartinL
Criei um plugin JPF para um produto de código aberto (OpenEMM); Consegui fazê-lo com o maven (plugin maven-assembly); Com certeza, eu realmente aprecio a simplicidade do desenvolvimento, mesmo agora, provavelmente é o OSGI que é mais popular.
рüффп
Existe alguma restrição nas versões java para usar o JPF?
Madhav
16

Use PF4J . Tem suporte para Web, Spring e Wicket. Fácil de usar e criar aplicativos

Mallikarjuna Sangisetty
fonte
i achar que este é o que eu preciso e parece ser bastante simples, mas eu preciso de alguma ajuda sobre isso
nonybrighto
tente fazer perguntas para o Decebal no github. ele vai ajudar você
Daniel Jipa 27/05
veja meta.stackoverflow.com/questions/376686/… no status da conta Decebals aqui #
Wolfgang Fahl
1
Se você está olhando para o pf4j, também pode dar uma olhada no github.com/hank-cp/sbp . Ele é construído sobre o pf4j para oferecer suporte ao Spring Boot para criar um aplicativo Web completo.
Hank
13

Eu trabalhei no OSGi por uma semana - uma intensa, nada além da semana do OSGi. No final, foi como um pesadelo, mas eu aprendi muito.

Consegui fazer o OSGi funcionar (não é fácil, todos os exemplos estão desatualizados, tudo na rede tem pelo menos três anos, se não cinco), mas tive sérios problemas para integrá-lo a um projeto existente devido a problemas com o jar manifesta.

Em resumo, existem apenas algumas ferramentas obscuras usadas para criar manifestos e elas não estão bem documentadas (o BND Tools é dificilmente obscuro, mas foi projetado para um determinado processo no Eclipse). Além disso, a maioria das informações OSGi disponíveis não é direcionada a desenvolvedores de aplicativos que possuem um aplicativo de desktop existente.

Isso faz com que o contexto das informações fique embaçado ou inadequado. As postagens do blog de Neil Bartlett foram a maior ajuda, mas mesmo as que não conseguiram obter um sistema operacional (peguei algum código do tutorial Felix e o reuni para colocar a estrutura incorporada). Encontrei o rascunho do livro que ele publicou gratuitamente há alguns anos, o que é excelente, mas os exemplos no Eclipse não funcionam devido a alterações no suporte ao Eclipse OSGi.

Cada passo é um grande obstáculo. Vou tentar postar mais alguns detalhes aqui mais tarde.

Sean Anderson
fonte
17
Como isso é uma resposta? É mais um discurso retórico sobre OSGi, e você nem está explicando o que é OSGi.
Rabino Stealth
@StealthRabbi No momento desta "resposta", e por algum tempo depois, eram boas informações para alguém que tentava trabalhar com o OSGi na natureza. O OSGi já fazia parte da discussão - portanto, não havia necessidade de defini-lo. É uma resposta, pois pode ter poupado às pessoas uma semana de trabalho - o motivo todo do SO.
Sean Anderson
9

Penso que recomendar o OSGi para resolver o problema mencionado acima é um conselho extremamente ruim. OSGi é "a escolha certa", mas para um cenário como o acima, acho que o JPF ou alguma estrutura minimalista doméstica é suficiente.

Steen
fonte
3

Anos atrás, comecei um projeto como esse e espero que em breve esteja pronto. Me inspirei em projetos como o NetBeans e o Eclipse, mas, enquanto isso, mudou para algo um pouco diferente. O OSGi parece uma boa escolha agora, mas não tive a chance de compará-lo com o meu projeto. É semelhante ao JPF mencionado acima, mas ao mesmo tempo diferente em muitos aspectos.

A idéia básica que me motivou é ser o mais fácil possível para criar aplicativos Java, sem separação entre aplicativos da Web, aplicativos de desktop ou aplicativos de applet / JWS (é claro que isso ainda não cobre a interface do usuário) como uma funcionalidade principal.

Criei o projeto com alguns objetivos em mente:

  • não importa se você cria um aplicativo da Web ou um aplicativo de desktop, você deve iniciar o aplicativo da mesma maneira, um método principal simples, sem declaração sofisticada do web.xml (não que eu seja contra ter um descritor da Web padrão, mas não funciona bem com um sistema de plug-in, onde você adiciona "servlets" - eu os chamo de RequestHandler (s) - dinâmicos à sua vontade).
  • fácil conectar "extensões" em torno de um "ponto de extensão" - algo do Eclipse, mas com uma abordagem diferente.
  • auto-implementável, uma vez que todos os plugins são registrados (arquivos XML), o aplicativo deve ser auto-implementável independentemente do sistema de compilação - é claro que há uma tarefa Ant e um Maven MOJO, que são os links para o mundo externo, mas no final, chama o aplicativo e instrui-o a se auto-implantar em um local específico.
  • emprestado do Maven, ele pode fazer o download do código dos repositórios (incluindo os repositórios Maven 1 e 2) para que seu aplicativo possa ser implantado como um único jar pequeno, desde que você tenha acesso aos repositórios (útil em algum momento e, basicamente, fornece suporte para auto- atualizações - você não gosta da idéia de ser notificado pelo seu aplicativo da web que há uma versão mais recente, foi baixada e precisa apenas da sua permissão para instalá-la? Eu sei que amo isso).
  • monitoramento básico de aplicativos sobre a integridade do sistema, notificações por email em caso de falhas
adrian.tarau
fonte
2
Não pretendo incomodar, mas você trabalha nisso desde então? O código está disponível (talvez eu possa usá-lo como está ou adicionar a ele)?
Piccolo