Class PluginClassLoader

All Implemented Interfaces:
Closeable, AutoCloseable

public class PluginClassLoader extends URLClassLoader
ClassLoader para carregar um arquivo de plugin da pasta de plugins. A cada vez que este ClassLoader é instanciado, verifica os arquivos da pasta de plugins, sem usar cache. Assim não é preciso reiniciar a VM para usar atualizações desses arquivos.

A maneira mais simples de obter um provedor para um plugin é instanciar um ClassLoader conveniente desta classe, e chamar getProvider(Class), por exemplo:

Provedor provedor = new PluginClassLoader().getProvider(Provedor.class);

Quando já se sabe o nome do arquivo que contém o plugin, é mais eficiente fazer como:

Provedor provedor = new PluginClassLoader("systextil-meuplugin").getProvider(Provedor.class);

Se, no entanto, o plugin já estiver disponível no classloader padrão do sistema, não sendo necessário obtê-lo mediante um classloader personalizado, então é muito mais eficiente obter o provedor diretamente através do método estático, assim:

Provedor provedor = PluginClassLoader.findProvider(Provedor.class);

Formas de carregamento dos provedores em plugins

Existem plugins que podem ser carregados sob demanda, isto é, somente quando forem usados (e se forem usados). Esses plugins geralmente contêm customizações de clientes ou processos opcionais. Esses plugins podem se beneficiar deste classloader, podendo ser atualizados sem reiniciar a VM. Para isso, eles não podem estar declarados no classpath dos arquivos MANIFEST.MF desta API de plugins. Sendo assim, podem usar este classloader em dois modos:

  1. informando o nome do arquivo de plugin onde o provedor deve ser encontrado, ou
  2. não informando o nome de arquivo, fazendo o classloader procurá-lo em todos os arquivos na pasta de plugins.

Outros plugins devem ser carregados no início da VM, principalmente se contiverem formulários em NXJ. Estes plugins devem estar declarados no classpath dos arquivos MANIFEST.MF desta API de plugins. Para atualizá-los é preciso reiniciar a VM. O carregamento dos provedores desses plugins é feito de preferência usando um método estático desta classe.

Author:
sergio
  • Constructor Details

    • PluginClassLoader

      public PluginClassLoader(String pluginName)
      Cria um ClassLoader que carrega um plugin pelo nome dele.
      Parameters:
      pluginName - o nome do arquivo de plugin, sem a extensão .jar
    • PluginClassLoader

      public PluginClassLoader()
      Cria um ClassLoader que carrega todos os plugins, quando não se sabe o nome do plugin que se quer usar.
  • Method Details

    • hasPlugin

      public static boolean hasPlugin(String pluginName)
      Verifica se o plugin existe
      Parameters:
      pluginName - o nome do arquivo de plugin, sem a extensão .jar
      Returns:
      se o plugin existe
    • getProvider

      public <T> T getProvider(Class<T> claz)
      Retorna o primeiro provedor encontrado para a classe informada neste classloader, ou nulo se não houver.

      Se o ClassLoader não encontrar um provedor, é fechado imediatamente. Se encontrar, fica aberto para ser usado pelo plugin.

      (Quando ele é fechado? Isso não dá problema?)

      Type Parameters:
      T - o tipo de provedor que se quer obter
      Parameters:
      claz - a classe cujo provedor vai ser procurado
      Returns:
      o provedor encontrado
    • findProvider

      public static <T> T findProvider(Class<T> claz)
      Retorna o primeiro provedor encontrado para a classe informada no classloader do contexto atual, ou nulo se não houver.
      Type Parameters:
      T - o tipo de provedor que se quer obter
      Parameters:
      claz - a classe cujo provedor vai ser procurado
      Returns:
      o provedor encontrado