Pergunta

Quero criar um programa Java que possa ser estendido com plugins.Como posso fazer isso e onde devo procurar?

Eu tenho um conjunto de interfaces que o plugin deve implementar e deve estar em um jar.O programa deve procurar novos jars em uma pasta relativa (ao programa) e registrá-los de alguma forma.


Embora eu goste do Eclipse RCP, acho que é demais para minhas necessidades simples.

A mesma coisa vale para o Spring, mas como eu ia dar uma olhada de qualquer maneira, é melhor tentar.

Mesmo assim, prefiro encontrar uma maneira de criar minha própria "estrutura" de plugin da maneira mais simples possível.

Foi útil?

Solução

Eu fiz isso para softwares que escrevi no passado, é muito útil.Fiz isso primeiro criando uma interface que todas as minhas classes de 'plugin' precisavam implementar.Eu então usei o Java Carregador de classe para carregar essas classes e criar instâncias delas.

Uma maneira de fazer isso é esta:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

Isso carregou a classe, agora você precisa criar uma instância dela, assumindo que o nome da interface seja MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();

Outras dicas

Investigar OSGi.

Por um lado, o OSGi fornece todo tipo de infraestrutura para gerenciar, iniciar e fazer muitas outras coisas com componentes de software modulares.Por outro lado, pode ser muito pesado para suas necessidades.

Aliás, o Eclipse usa OSGi para gerenciar seus plugins.

Eu recomendo que você dê uma olhada de perto a API do provedor de serviços Java (SPI).Ele fornece um sistema simples para encontrar todas as classes em todos os Jars no caminho de classe que se expõem como implementando um serviço específico.Eu usei isso no passado com sistemas de plugins com grande sucesso.

Embora eu apoie a solução aceita, se for necessário suporte básico a plugins (o que é o caso na maioria das vezes), há também o Estrutura de plug-ins Java (JPF) que, embora sem documentação adequada, é uma implementação de estrutura de plugin muito elegante.

É facilmente implantável e - quando você passa pelas idiossincrasias do carregamento de classe - muito fácil de desenvolver.Um comentário acima é para estar ciente de que os caminhos de carregamento do plugin abaixo do diretório do plugin devem ser nomeados após o completo classpath além de ter seus arquivos de classe implantados em um caminho de pacote normal denominado path.Por exemplo.

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class

Na abordagem do carregador de classe caseiro:Embora seja definitivamente uma boa maneira de aprender sobre carregadores de classe, existe algo chamado "inferno do carregador de classe", conhecido principalmente por pessoas que lutaram com ele quando se trata de uso em projetos maiores.Classes conflitantes são fáceis de introduzir e difíceis de resolver.

E há uma boa razão pela qual o Eclipse mudou para OSGi anos atrás.Então, se for mais do que um projeto favorito, dê uma olhada séria no OSGi.Vale a pena dar uma olhada.Você aprenderá sobre classloaders MAIS um padrão tecnológico emergente.

Você já pensou em construir sobre a Rich Client Platform do Eclipse e depois expor a estrutura de extensão do Eclipse?

Além disso, dependendo das suas necessidades, o Spring Framework pode ajudar com isso e outras coisas que você pode querer fazer: http://www.springframework.org/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top