Como posso compartilhar bibliotecas não OSGi entre pacotes em um contêiner OSGi?

StackOverflow https://stackoverflow.com/questions/1235129

  •  22-07-2019
  •  | 
  •  

Pergunta

me deparei com esta questão quando tentando compartilhar os pacotes Struts entre os feixes múltiplos no interior de um recipiente OSGi. Queria evitar ambas as dependências de duplicação no interior dos feixes e a introdução de uma nova dependência entre eles (por ter uma exportação feixe suas dependências internas para o outro para partes).

Acontece que a resposta é muito fácil se tiver que usar Maven, e se você não for, você ainda pode usar a solução Maven para aprender a criar o mesmo resultado com algum outro mecanismo.

Eu encontrei esta abordagem útil várias vezes durante o meu projeto, então eu vou postar um exemplo aqui.

Foi útil?

Solução 2

Usando Maven, é muito fácil criar um pacote OSGi a partir de qualquer biblioteca. No entanto, acho que o mesmo resultado pode ser criado com outros mecanismos também. A solução Maven me ajudou a entender como ele funciona.

Criando o pacote é feito através da criação de um projeto que tem a biblioteca como uma dependência e, em seguida, a embalagem do projeto usando o maven-bundle-plugin do Apache Felix projeto e especificando os pacotes de bibliotecas com a instrução Export-Package. Eu usei isso para compartilhar Google Protocol Buffers entre pacotes dentro de um contêiner OSGi:

<?xml version="1.0" encoding="UTF-8" ?>
<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example.lib</groupId>
  <artifactId>protobuf-dist</artifactId>
  <version>2.1.0</version>
  <name>Google Protocol Buffers OSGi Distribution</name>
  <packaging>bundle</packaging>

  <dependencies>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>2.1.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Export-Package>com.google.protobuf</Export-Package>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Se você quiser todas as dependências transitivas laminados no feixe, também, usar o objetivo bundleall do plugin.

O plugin reconhece e homenageia manifesta OSGi existentes na dependência.

Você também pode usar o plugin pacote apenas para criar o manifesto e dizer o plugin embalagem jar (ou o jar-with-dependencies builtin montagem) para usar esse manifesto através da secção de arquivo. página do plugin ligada acima mostra como fazer isso.

Outras dicas

Um caminho adicional para aqueles que não tão interessado em maven, incapaz de porto, ou perfeitamente feliz com formiga / ivy

Eu encontrei o que maneira mais fácil de realizar a tarefa indicada é para transformar a biblioteca não-OSGi em uma biblioteca OSGi, deixando a exportação manifesto cada pacote e adicionar alguns nomes simbólicos / versões approriate. Eu tenho sido capaz de fazer isso muito facilmente com BND via formiga tarefas (ou mesmo linha de comando direto invocação). Há também repositórios que contêm a versão de muitas bibliotecas populares "ified-osgi". Algumas bibliotecas (joda-time) já estão enviando com manifesta OSGi corretas.

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