| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = Usando o CDI para Injetar Pacotes OSGi como Serviços no NetBeans IDE |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: Usando o CDI para Injetar Pacotes OSGi como Serviços no NetBeans IDE - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, Usando o CDI para Injetar Pacotes OSGi como Serviços no NetBeans IDE |
| |
| Este documento demonstra como o suporte integrado para o framework link:http://www.osgi.org/Main/HomePage[+Open Services Gateway Initiative+] (OSGi) no NetBeans IDE simplifica o processo de criação de pacotes OSGi e o uso dos pacotes em seus projetos. Neste tutorial, você criará dois pacotes OSGi simples a partir do arquétipo de pacote Maven OSGi e, em seguida, implantará os pacotes no GlassFish Server Open Source Edition 3.1. |
| |
| Depois de criar os pacotes OSGi básicos, você criará uma aplicação cliente Web e usará o CDI para injetar os pacotes como um serviço. A seguir, você implantará a aplicação Web como um pacote no servidor. O tutorial, em seguida, demonstrará como usar a Console de Admin OSGi para trabalhar com pacotes OSGi. |
| |
| Utilizar um pacote OSGi em uma Aplicação Corporativa pode fornecer maior modularidade e flexibilidade em relação à atualização de pacotes individuais. O suporte predefinido para OSGi que acompanha o GlassFish Server torna a incorporação de pacotes na sua aplicação muito fácil. |
| |
| Este tutorial tem base na publicação do blog link:http://blogs.oracle.com/arungupta/entry/totd_154_dynamic_osgi_services[+ TOTD #154: Dynamic OSGi services in GlassFish 3.1 - Using CDI and @OSGiService +] e outras entradas do blog que podem ser encontradas no link:http://blog.arungupta.me/[+blog de Arun Gupta+]. Certifique-se de visitar o blog e ver muitas outras entradas excelentes relacionadas ao trabalho com o OSGi. |
| |
| Além disso, os recursos a seguir contêm uma variedade de informações sobre o uso do OSGi e CDI em aplicações híbridas. |
| |
| * link:http://weblogs.java.net/blog/2009/06/14/developing-hybrid-osgi-java-ee-applications-glassfish[+ Desenvolvendo aplicações Híbridas (OSGi + Java EE) no GlassFish+] |
| * link:http://blogs.oracle.com/sivakumart/entry/typesafe_injection_of_dynamic_osgi[+ Injeção segura de serviços OSGi dinâmicos em aplicações Java EE híbridas+] |
| * link:http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish[+ Aplicações Web compatíveis com OSGi no GlassFish+] |
| * link:http://www.youtube.com/watch?v=vaOpJJ-Xm70[+ Vídeo do YouTube: injeção segura de serviços OSGI dinâmicos com o GlassFish 3.1 e CDI +] |
| * link:http://glassfish.java.net/public/GF-OSGi-Features.pdf[+ Desenvolvimento de Aplicações OSGi usando o GlassFish Server"+] [PDF] |
| |
| *Exercícios do Tutorial* |
| |
| * <<Exercise_1,Criando o Projeto POM pai>> |
| * <<Exercise_2,Criando os Projetos de Pacotes OSGi>> |
| * <<Exercise_2a,Criando o Pacote da Interface MavenHelloServiceApi>> |
| * <<Exercise_2b,Criando o Pacote de Implementação MavenHelloServiceImpl>> |
| * <<Exercise_2c,Construindo e Implantando os Pacotes OSGi>> |
| * <<Exercise_3,Criando a Aplicação Cliente Web>> |
| * <<Exercise_3a,Configurando as Dependências no Projeto POM>> |
| * <<Exercise_3b,Criando a Aplicação Web MavenHelloWebClient>> |
| * <<Exercise_3c,Construindo a Aplicação Web como um Pacote>> |
| * <<Exercise_3d,Implantando o Pacote de Aplicações Web>> |
| * <<Exercise_4,Instalando e Usando a Console de Admin OSGi>> |
| * <<Exercise_5,Referências e Leitura Adicional>> |
| |
| *Para seguir este tutorial, são necessários os recursos e o software a seguir.* |
| |
| |=== |
| |Software ou Recurso |Versão Necessária |
| |
| |link:http://download.netbeans.org/netbeans/7.1/beta/[+NetBeans IDE+] |Versão Java EE 7.2, 7.3, 7.4, 8.0 |
| |
| |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+JDK (Java Development Kit)+] |versão 7 ou 8 |
| |
| |GlassFish Server Open Source Edition |3.1.x ou 4.x |
| |=== |
| |
| *Pré-requisitos* |
| |
| Este tutorial pressupõe que você tenha algum conhecimento básico das tecnologias a seguir, ou alguma experiência de programação com elas: |
| |
| * Programação em Java |
| * NetBeans IDE |
| * Framework Maven |
| |
| Antes de começar este tutorial, talvez você queira se familiarizar com a documentação a seguir. |
| |
| * link:http://wiki.netbeans.org/MavenBestPractices[+Melhores Práticas para o Apache Maven no NetBeans IDE+] |
| * link:http://books.sonatype.com/mvnref-book/reference/introduction.html[+Capítulo 1. Introdução ao Apache Maven+] (do link:http://books.sonatype.com/mvnref-book/reference/index.html[+Maven: A Referência Completa +]) |
| * link:http://www.osgi.org/javadoc/r4v42/[+Framework OSGi +] |
| |
| |
| |
| |
| == Criando o Projeto POM Pai |
| |
| Nesta seção você criará o projeto POM pai para os pacotes OSGi que serão criados neste tutorial. Você editará o projeto POM ( ``pom.xml`` ) para adicionar elementos de Gerenciamento de Dependências que serão herdados como dependências por projetos filho. |
| |
| 1. Selecione Novo Projeto (Ctrl-Shift-N; ⌘-Shift-N no Mac) no menu principal. |
| 2. Selecione o Projeto POM na categoria Maven. |
| |
| image::images/cdi-newpomproject.png[title="Arquétipo do Projeto POM Maven no Assistente de Novo Projeto"] |
| |
| |
| [start=3] |
| . Digite *MavenOSGiCDIProject* como nome do Projeto. Clique em Finalizar. |
| |
| Quando você clica em Finalizar, o IDE cria o projeto POM e abre o projeto na janela Projetos. |
| |
| |
| [start=4] |
| . Expanda o nó dos Arquivos do Projeto na janela Projetos e clique duas vezes em ``pom.xml`` para abrir o arquivo no editor. |
| |
| O POM básico do projeto deverá ser similar ao seguinte. |
| |
| |
| [source,xml] |
| ---- |
| |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| </project> |
| |
| ---- |
| |
| [start=5] |
| . Modifique o ``pom.xml`` pai para adicionar os elementos a seguir. Salve as alterações. |
| |
| [source,xml] |
| ---- |
| |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| *<dependencyManagement> |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.2.0</version> |
| <scope>provided</scope> |
| </dependency> |
| </dependencies> |
| </dependencyManagement>* |
| </project> |
| |
| ---- |
| |
| Neste exercício, você especificou explicitamente um artefato e a versão do artefato que serão usados no projeto. Ao usar o Gerenciamento de Dependências e especificar os artefatos no POM pai, é possível tornar os POMs nos projetos filho mais simples e garantir que as versões das dependências estejam consistentes no projeto. |
| |
| Para saber mais sobre o uso do Gerenciamento de Dependências, consulte link:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html[+Introdução ao Mecanismo de Dependências+]. |
| |
| |
| == Criando os Projetos de Pacotes OSGi |
| |
| A categoria Maven no assistente Novos Projetos inclui um arquétipo do Pacote OSGi para a criação de projetos de pacotes OSGi. Quando você cria um projeto de pacote OSGi, o POM gerado declara o JAR ``org.osgi.core`` como uma dependência e especifica o ``plug-in-do-pacote-maven`` para a construção do projeto. |
| |
| |
| === Criando o Pacote da Interface MavenHelloServiceApi |
| |
| Neste exercício, você utilizará o assistente Novo Projeto para criar um projeto de pacote OSGi que fornecerá uma interface simples que será implementada por outros pacotes. Depois de criar o pacote e a interface, você modificará o POM para atualizar a dependência no artefato ``org.osgi.core`` que foi especificado no projeto POM pai. |
| |
| 1. Selecione Arquivo > Novo Projeto para abrir o assistente de Novo Projeto. |
| 2. Selecione Pacote OSGi na categoria Maven. Clique em Próximo. |
| |
| image::images/cdi-new-osgiproject.png[title="Arquétipo do Pacote OSGI Maven no assistente de Novo Projeto"] |
| |
| |
| [start=3] |
| . Digite *MavenHelloServiceApi* como Nome do Projeto. |
| |
| [start=4] |
| . Clique em Procurar e selecione o projeto POM *MavenOSGiCDIProject* como o Local. Clique em Finalizar. |
| |
| Quando você clica em Finalizar, o IDE cria o projeto do pacote e abre o projeto na janela Projetos. Se você abrir ``pom.xml`` para o projeto MavenHelloServiceApi no editor, verá que o elemento ``encapsulamento`` especifica o ``pacote`` e que o ``plug-in-do-pacote-maven`` será usado ao construir o pacote. |
| |
| |
| [source,xml] |
| ---- |
| |
| <project> |
| <modelVersion>4.0.0</modelVersion> |
| <parent> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <groupId>com.mycompany</groupId> |
| <version>1.0-SNAPSHOT</version> |
| </parent> |
| |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenHelloServiceApi</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| *<packaging>bundle</packaging>* |
| <name>MavenHelloServiceApi OSGi Bundle</name> |
| |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.3.0</version> |
| <scope>provided</scope> |
| </dependency> |
| </dependencies> |
| |
| <build> |
| <plugins> |
| <plugin> |
| <groupId>org.apache.felix</groupId> |
| *<artifactId>maven-bundle-plugin</artifactId>* |
| <version>2.3.7</version> |
| <extensions>true</extensions> |
| <configuration> |
| <instructions> |
| <Bundle-Activator>com.mycompany.mavenhelloserviceimpl.Activator</Bundle-Activator> |
| <Export-Package /> |
| </instructions> |
| </configuration> |
| </plugin> |
| |
| ... |
| </plugins> |
| </build> |
| |
| ... |
| <project> |
| ---- |
| |
| Você também poderá ver que, ao criar um projeto de pacote OSGi utilizando o arquétipo do Pacote OSGi Maven, o IDE adicionou o artefato ``org.osgi.core`` como uma dependência por padrão. |
| |
| |
| [start=5] |
| . Clique com o botão direito do mouse no nó do projeto MavenHelloServiceApi na janela Projetos e selecione Propriedades. |
| |
| [start=6] |
| . Selecione a categoria Códigos-fonte na caixa de diálogo Propriedades do Projeto. |
| |
| [start=7] |
| . Defina *Source/Binary Format* como 1.6 e confirme se a *Codificação* é UTF-8. Clique em OK. |
| |
| [start=8] |
| . Clique com o botão direito do mouse no nó Pacotes de Código-fonte e selecione Novo > Interface Java. |
| |
| [start=9] |
| . Digite *Hello* como Nome da Classe. |
| |
| [start=10] |
| . Selecione *com.mycompany.mavenhelloserviceapi* como o Pacote. Clique em Finalizar. |
| |
| [start=11] |
| . Adicione o método ``sayHello`` a seguir à interface (em negrito) e salve as alterações. |
| |
| [source,java] |
| ---- |
| |
| public interface Hello { |
| *String sayHello(String name);* |
| } |
| ---- |
| |
| [start=12] |
| . Clique com o botão direito do mouse no nó do projeto na janela Projetos e selecione Construir. |
| |
| Depois de construir o projeto, se você abrir a janela Arquivos e expandir o nó do projeto, verá que ``MavenHelloServiceApi-1.0-SNAPSHOT.jar`` foi criado na pasta de ``destino`` . |
| |
| image::images/cdi-manifest.png[title="Exibir o conteúdo do JAR compilado na janela Arquivos"] |
| |
| O ``plug-in-do-pacote-maven`` trata da geração do arquivo ``MANIFEST.MF`` ao construir o projeto. Se abrir o arquivo ``MANIFEST.MF`` no JAR compilado, você verá que o plug-in gerou um cabeçalho de manifesto que declara os pacotes exportados. Para OSGi, todos os pacotes que você deseja que sejam expostos e estejam disponíveis para outros pacotes devem ser listados no elemento ``Exportar-Pacote`` no ``MANIFEST.MF`` . |
| |
| |
| [start=13] |
| . Confirme se o ``MANIFEST.MF`` contém o elemento ``Export-Package`` (o elemento mostrado em *negrito* no exemplo abaixo). |
| |
| [source,java] |
| ---- |
| |
| Manifest-Version: 1.0 |
| Bnd-LastModified: 1395049732676 |
| Build-Jdk: 1.7.0_45 |
| Built-By: nb |
| Bundle-Activator: com.mycompany.mavenhelloserviceapi.Activator |
| Bundle-ManifestVersion: 2 |
| Bundle-Name: MavenHelloServiceApi OSGi Bundle |
| Bundle-SymbolicName: com.mycompany.MavenHelloServiceApi |
| Bundle-Version: 1.0.0.SNAPSHOT |
| Created-By: Apache Maven Bundle Plugin |
| *Export-Package: com.mycompany.mavenhelloserviceapi;uses:="org.osgi.frame |
| work";version="1.0.0.SNAPSHOT"* |
| Import-Package: org.osgi.framework;version="[1.6,2)" |
| Tool: Bnd-1.50.0 |
| ---- |
| |
| O contêiner OSGi lerá o cabeçalho do manifesto ``Exportar-Pacote`` para determinar as classes no pacote que podem ser acessadas de fora do pacote. Nesse exemplo, as classes no pacote ``com.mycompany.mavenhelloserviceapi`` estão expostas. |
| |
| NOTE: Se o `` MANIFEST.MF`` não contiver o elemento `` Export-Package`` , você precisará ativar o procedimento do plug-in default para o plug-in na janela Propriedades do Projeto e reconstruir o projeto. Na janela Propriedades do Projeto, selecione a categoria Exportar Pacotes e selecione a opção *Default maven-bundle-plugin behavior*. Você pode usar o painel Exportar Pacotes da janela Propriedades do Projeto para especificar explicitamente os pacotes que deverão ser expostos ou especificar os pacotes diretamente em ``pom.xml.`` . |
| |
| |
| |
| |
| === Criando o Pacote de Implementação MavenHelloServiceImpl |
| |
| Neste exercício, você criará o MavenHelloServiceImpl no projeto POM. |
| |
| 1. Selecione Arquivo > Novo Projeto para abrir o assistente de Novo Projeto. |
| 2. Selecione o Pacote OSGi na categoria Maven. Clique em Próximo. |
| 3. Digite *MavenHelloServiceImpl* como Nome do Projeto. |
| 4. Clique em Procurar e selecione o projeto POM *MavenOSGiCDIProject* como o Local (caso não esteja selecionado). Clique em Finalizar. |
| 5. Clique com o botão direito do mouse no nó do projeto na janela Projetos e escolha Propriedades. |
| 6. Selecione a categoria Códigos-fonte na caixa de diálogo Propriedades do Projeto. |
| 7. Defina *Source/Binary Format* como 1.6 e confirme se a *Codificação* é UTF-8. Clique em OK. |
| 8. Clique com o botão direito do mouse no nó Pacotes de Código-fonte na janela Projetos e selecione Novo > Classe Java. |
| 9. Digite *HelloImpl* para o Nome da Classe. |
| 10. Selecione *com.mycompany.mavenhelloserviceimpl* como o Pacote. Clique em Finalizar. |
| 11. Digite o seguinte (em negrito) e salve as alterações. |
| |
| [source,java] |
| ---- |
| |
| public class HelloImpl *implements Hello { |
| |
| public String sayHello(String name) { |
| return "Hello " + name;* |
| } |
| } |
| ---- |
| |
| Quando você implementar ``Hello`` , o IDE exibirá um erro que deverá ser resolvido adicionando o projeto MavenHelloServiceApi como uma dependência. |
| |
| |
| [start=12] |
| . Clique com o botão direito do mouse no nó Dependências do *MavenHelloServiceImpl* na janela Projetos e selecione Adicionar Dependência. |
| |
| [start=13] |
| . Clique na guia Abrir Projetos na caixa de diálogo Adicionar Biblioteca. |
| |
| [start=14] |
| . Selecione o Pacote OSGi MavenHelloServiceApi. Clique em Add. |
| |
| image::images/cdi-add-dependency.png[title="Clique na guia Abrir Projetos na caixa de diálogo Adicionar Biblioteca."] |
| |
| |
| [start=15] |
| . Clique com o botão direito do mouse na classe ``HelloImpl.java`` que está aberta no editor e selecione Corrigir Importações (Alt-Shift-I; ⌘-Shift-I no Mac) para adicionar uma instrução de importação para ``com.mycompany.mavenhelloserviceapi.Hello`` . Salve as alterações. |
| |
| [start=16] |
| . Expanda o pacote ``com.mycompany.mavenhelloserviceimpl`` e clique duas vezes em ``Activator.java`` para abrir o arquivo no editor. |
| |
| image::images/cdi-activator.png[title="Classe do ativador na janela Projetos"] |
| |
| O IDE criou automaticamente a classe ativadora do pacote ``Activator.java`` em seu projeto. Um ativador de pacote é utilizado para gerenciar o ciclo de vida de um pacote. A classe do ativador de pacote é declarada no ``MANIFEST.MF`` do pacote e é instanciada quando o pacote é iniciado pelo contêiner. |
| |
| Um pacote OSGi não requer uma classe de ativador de pacote, mas é possível utilizar o método ``start()`` na classe do ativador, por exemplo, para inicializar serviços ou outros recursos necessários para o pacote. Neste exercício, você adicionará algumas linhas de código à classe que imprimirá mensagens na janela de Saída. Isso facilitará a identificação de quando um pacote é iniciado e parado. |
| |
| |
| [start=17] |
| . Modifique os métodos ``start()`` e ``stop()`` na classe do ativador do pacote para adicionar as linhas a seguir (em negrito). |
| |
| [source,java] |
| ---- |
| |
| public class Activator implements BundleActivator { |
| |
| public void start(BundleContext context) throws Exception { |
| *System.out.println("HelloActivator::start"); |
| context.registerService(Hello.class.getName(), new HelloImpl(), null); |
| System.out.println("HelloActivator::registration of Hello service successful");* |
| } |
| |
| public void stop(BundleContext context) throws Exception { |
| *context.ungetService(context.getServiceReference(Hello.class.getName())); |
| System.out.println("HelloActivator stopped");* |
| } |
| } |
| ---- |
| |
| Você pode ver que a classe do ativador de pacotes importa ``org.osgi.framework.BundleActivator`` e ``org.osgi.framework.BundleContext`` . Por default, a classe gerada contém dois métodos: ``start()`` e ``stop()`` . O framework do OSGi invoca os métodos ``start()`` e ``stop()`` para iniciar e parar a funcionalidade fornecida pelo pacote. Quando o pacote é iniciado, o componente de serviço fornecido pelo pacote é registrado no registro de serviço do OSGi. Depois que um pacote é registrado, outros pacotes poderão utilizar o registro para pesquisa e, em seguida, utilizar os serviços ativos por meio do contexto do pacote. |
| |
| Ao olhar o POM do projeto, você verá o elemento ``<Bundle-Activator>`` que especifica o ativador do pacote sob o elemento de configuração do ``plug-in-do-pacote-maven`` . |
| |
| |
| [source,xml] |
| ---- |
| |
| <plugin> |
| <groupId>org.apache.felix</groupId> |
| <artifactId>maven-bundle-plugin</artifactId> |
| <version>2.3.7</version> |
| <extensions>true</extensions> |
| <configuration> |
| <instructions> |
| *<Bundle-Activator>com.mycompany.mavenhelloserviceimpl.Activator</Bundle-Activator>* |
| </instructions> |
| </configuration> |
| </plugin> |
| ---- |
| |
| Quando você construir o pacote, o plug-in gerará um Cabeçalho de Manifesto no arquivo de manifesto do pacote no JAR e especificará a classe do Ativador do Pacote. O runtime do OSGi procura pelo cabeçalho ``Bundle-Activator`` no arquivo do manifesto quando um pacote é implantado. |
| |
| |
| [start=18] |
| . Corrija as instruções de importação em ``Activator.java`` para importar ``com.mycompany.mavenhelloserviceapi.Hello`` . Salve as alterações. |
| |
| [start=19] |
| . Expanda o nó Dependências e confirme se o artefato ``org.osgi.core`` é listado como uma dependência. |
| |
| NOTE: Remova todas as versões mais antigas do artefato que são listadas no nó Dependências, clicando com o botão direito do mouse no artefato e escolhendo Remover Dependência. As únicas dependências devem ser o projeto MavenHelloServiceApi e o artefato ``org.osgi.core`` . |
| |
| image::images/cdi-implproject.png[title="Classe do ativador na janela Projetos"] |
| |
| |
| |
| === Construindo e Implantando os Pacotes OSGi |
| |
| Neste exercício, você construirá os pacotes OSGi e implantará os pacotes no GlassFish. |
| |
| 1. Clique com o botão direito do mouse no nó MavenOSGiCDIProject na janela Projetos e selecione Limpar e Construir. |
| |
| Quando você construir o projeto, o IDE criará os arquivos JAR na pasta de ``destino`` de cada um dos projetos e também instalará o JAR de snapshot no repositório local. Na janela Arquivos, você pode expandir a pasta de ``destino`` para cada um dos dois projetos de pacotes e ver os dois arquivos compactados JAR ( ``MavenHelloServiceApi-1.0-SNAPSHOT.jar`` e ``MavenHelloServiceImpl-1.0-SNAPSHOT.jar`` ). |
| |
| |
| [start=2] |
| . Inicie o GlassFish Server, se ainda não o tiver feito. |
| |
| [start=3] |
| . Copie o ``MavenHelloServiceApi-1.0-SNAPSHOT.jar`` para o diretório ``glassfish/domains/domain1/autodeploy/bundles/`` da instalação do GlassFish. |
| |
| No log do GlassFish Server, na janela de Saída, você deverá ver uma saída semelhante à mostrada a seguir. |
| |
| |
| [source,java] |
| ---- |
| |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceApi-1.0-SNAPSHOT.jar |
| |
| ---- |
| |
| Clique com o botão direito do mouse no nó do GlassFish Server na janela Serviços e selecione Exibir Log do Servidor de Domínio, se o log do servidor não estiver visível na janela de Saída. |
| |
| |
| [start=4] |
| . Repita as etapas para copiar o ``MavenHelloServiceImpl-1.0-SNAPSHOT.jar`` no diretório ``autodeploy/bundles`` . |
| |
| No log do GlassFish Server, você agora deverá ver uma saída semelhante à mostrada a seguir. |
| |
| |
| [source,java] |
| ---- |
| |
| INFO: HelloActivator::start |
| INFO: HelloActivator::registration of Hello service successful |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceImpl-1.0-SNAPSHOT.jar |
| INFO: Started bundle: file:/glassfish-4.0/glassfish/domains/domain1/autodeploy/bundles/MavenHelloServiceImpl-1.0-SNAPSHOT.jar |
| |
| ---- |
| |
| Ou então, é possível instalar os pacotes a partir da Console de Admin OSGi do GlassFish. Para obter mais informações, consulte a seção <<Exercise_4,Instalando e Usando a Console de Admin OSGi>>. |
| |
| |
| == Criando uma Aplicação Cliente Web |
| |
| Esta seção demonstra como criar um cliente Web Java EE que acessa o serviço fornecido pelo pacote OSGi. Você criará um servlet simples em uma aplicação Web e, em seguida, injetará os serviços declarados. Antes de criar o projeto, você adicionará alguns elementos de gerenciamento de dependências ao projeto POM pai. |
| |
| |
| === Configurando dependências no Projeto POM Pai |
| |
| Neste exercício, você especificará elementos de dependência no projeto POM pai. Você também adicionará um repositório para artefatos que serão utilizados no projeto. |
| |
| 1. Expanda o nó Arquivos do Projeto do projeto *MavenOSGiCDIProject* na janela Projetos e clique duas vezes em ``pom.xml`` para abrir o arquivo no editor. |
| 2. Modifique o ``pom.xml`` pai para adicionar os seguintes elementos de Gerenciamento de Dependências (em negrito). Salve as alterações. |
| |
| [source,xml] |
| ---- |
| |
| <?xml version="1.0" encoding="UTF-8"?> |
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| <groupId>com.mycompany</groupId> |
| <artifactId>MavenOSGiCDIProject</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <packaging>pom</packaging> |
| <properties> |
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| </properties> |
| |
| ... |
| |
| <dependencyManagement> |
| <dependencies> |
| <dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.core</artifactId> |
| <version>4.3.0</version> |
| <scope>provided</scope> |
| </dependency> |
| *<dependency> |
| <groupId>org.osgi</groupId> |
| <artifactId>org.osgi.compendium</artifactId> |
| <version>4.2.0</version> |
| <scope>provided</scope> |
| </dependency> |
| <dependency> |
| <groupId>org.glassfish</groupId> |
| <artifactId>osgi-cdi-api</artifactId> |
| <version>3.1-b41</version> |
| <type>jar</type> |
| <scope>provided</scope> |
| </dependency>* |
| |
| </dependencies> |
| </dependencyManagement> |
| |
| ... |
| </project> |
| |
| ---- |
| |
| [start=3] |
| . Adicione os elementos a seguir para adicionar o repositório do GlassFish ao POM. Salve as alterações. |
| |
| [source,xml] |
| ---- |
| |
| <project> |
| |
| ... |
| |
| </dependencyManagement> |
| |
| *<repositories> |
| <!-- glassfish nexus repo for glassfish dependencies --> |
| <repository> |
| <id>glassfish-repo-archive</id> |
| <name>Nexus repository collection for Glassfish</name> |
| <url>http://maven.glassfish.org/content/groups/glassfish</url> |
| <snapshots> |
| <updatePolicy>never</updatePolicy> |
| </snapshots> |
| </repository> |
| </repositories>* |
| <modules> |
| <module>MavenHelloServiceApi</module> |
| <module>MavenHelloServiceImpl</module> |
| </modules> |
| </project> |
| |
| ---- |
| |
| Depois de adicionar o repositório do GlassFish ao POM, se você exibir a lista de repositórios no nó Repositórios Maven na janela Serviços, verá que o IDE adicionou automaticamente um nó para o repositório do GlassFish. Por default, o IDE exibe um nó para o repositório Maven Local. Quando um projeto aberto especifica um repositório, o IDE automaticamente adiciona um nó ao repositório no nó Repositórios Maven. |
| |
| image::images/cdi-maven-repositories.png[title="Repositório do GlassFish na janela Repositórios Maven"] |
| |
| Neste exercício, você adicionou artefatos extras e versões de artefatos que serão utilizados no projeto. Você também adicionou o repositório do GlassFish que contém os artefatos ``osgi-cdi-api`` . |
| |
| |
| === Criando a Aplicação Web MavenHelloWebClient |
| |
| Primeiro, você criará uma aplicação Web regular e, em seguida, modificará o projeto para torná-lo um pacote OSGi (Pacote de Aplicação Web (WAB)). |
| |
| 1. Escolha Arquivo > Novo Projeto no menu principal. |
| 2. Selecione Aplicação Web na categoria Maven. Clique em Próximo. |
| 3. Digite *MavenHelloWebClient* como nome do Projeto. |
| 4. Clique em Procurar e selecione o projeto POM *MavenOSGiCDIProject* como o Local (caso não esteja selecionado). Clique em Próximo. |
| 5. Selecione o GlassFish Server como servidor e o Java EE 6 ou Java EE 7 como a versão do Java EE. Clique em Finalizar. |
| 6. Clique com o botão direito do mouse no nó do projeto e selecione Novo > Servlet. |
| 7. Digite *HelloServlet* no Nome da Classe. |
| 8. Selecione ``com.mycompany.mavenhellowebclient`` como o Pacote. Clique em Finalizar. |
| 9. Delete os métodos default no servlet que foram gerados pelo IDE ( ``processRequest`` , ``doGet`` , ``doPost`` , ``getServletInfo`` ). |
| |
| NOTE: Você precisará expandir a pasta do editor para deletar os métodos do HttpServlet. |
| |
| |
| [start=10] |
| . Digite o código a seguir (em negrito) para injetar o serviço. |
| |
| [source,java] |
| ---- |
| |
| @WebServlet(name = "HelloServlet", urlPatterns = {"/HelloServlet"}) |
| public class HelloServlet extends HttpServlet { |
| |
| *@Inject |
| @OSGiService(dynamic=true) |
| Hello hello;* |
| } |
| ---- |
| |
| [start=11] |
| . Adicione o método ``doGet`` a seguir. |
| |
| [source,java] |
| ---- |
| |
| @Override |
| protected void doGet(HttpServletRequest request, HttpServletResponse response) |
| throws ServletException, IOException { |
| PrintWriter out = response.getWriter(); |
| out.println(hello.sayHello("Duke")); |
| } |
| ---- |
| |
| [start=12] |
| . Clique com o botão direito do mouse no nó do projeto e selecione Novo > Outro. |
| |
| [start=13] |
| . Selecione *beans.xml* na categoria Contextos e Injeção de Dependências. Clique em Próximo. |
| |
| [start=14] |
| . Use o nome de arquivo default ( ``beans`` ). Clique em Finalizar. |
| |
| Quando você clicar em Finalizar, o assistente criará o arquivo ``beans.xml`` na aplicação Web. O CDI será automaticamente ativado se o ``beans.xml`` for parte da aplicação. |
| |
| |
| [start=15] |
| . Modifique o arquivo ``beans.xml`` para alterar o valor padrão de ``bean-discovery-mode`` para ``all`` . |
| |
| [source,java] |
| ---- |
| |
| bean-discovery-mode="*all*" |
| ---- |
| |
| Salve suas alterações e feche o arquivo. |
| |
| Para obter mais informações sobre as diferenças entre os valores ``bean-discovery-mode`` , consulte as seguintes páginas: |
| |
| * link:http://docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm[+25.1 Encapsulando Aplicações CDI+] no Tutorial do Java EE 7 |
| * link:http://stackoverflow.com/questions/18107858/cdi-inject-fails-on-maven-embedded-glassfish-plugin-org-jboss-weld-exceptions[+http://stackoverflow.com/questions/18107858/cdi-inject-fails-on-maven-embedded-glassfish-plugin-org-jboss-weld-exceptions+] |
| |
| [start=16] |
| . Clique com o botão direito do mouse no nó Dependências do MavenHelloWebClient na janela Projetos e selecione Adicionar Dependência. |
| |
| [start=17] |
| . Selecione *Provided* como o Escopo. |
| |
| [start=18] |
| . Clique na guia Abrir Projetos na caixa de diálogo Adicionar Biblioteca e selecione *Pacote OSGi MavenHelloServiceApi*. Clique em Add. |
| |
| [start=19] |
| . Clique novamente com o botão direito do mouse no nó Dependências e selecione Adicionar Dependência. |
| |
| [start=20] |
| . Clique na guia Gerenciamento de Dependências na caixa de diálogo Adicionar Biblioteca e selecione o artefato ``osgi-cdi-api`` que você especificou no projeto POM pai. Clique em Add. |
| |
| image::images/cdi-add-dependency3.png[title="Guia de Gerenciamento de Dependências na caixa de diálogo Adicionar Biblioteca"] |
| |
| |
| [start=21] |
| . Clique com o botão direito do mouse em ``HelloServlet.java`` no editor e selecione Corrigir Importações (Alt-Shift-I; ⌘-Shift-I no Mac) para adicionar ``com.mycompany.mavenhelloserviceapi.Hello`` , ``javax.inject.Inject`` e ``org.glassfish.osgicdi.OSGiService`` . Salve as alterações. |
| |
| NOTE: Pode ser preciso adicionar manualmente uma instrução de importação para o ``com.mycompany.mavenhelloserviceapi.hello`` se o IDE não adicionar automaticamente para você. |
| |
| |
| [start=22] |
| . Clique com o botão direito do mouse em MavenOSGiCDIProject e selecione Limpar e Construir. |
| |
| Ao construir o projeto, na janela de Saída, você deverá ver uma saída semelhante à seguinte. |
| |
| |
| [source,java] |
| ---- |
| |
| Reactor Summary: |
| |
| MavenOSGiCDIProject ............................... SUCCESS [0.798s] |
| MavenHelloServiceApi OSGi Bundle .................. SUCCESS [7.580s] |
| MavenHelloServiceImpl OSGi Bundle ................. SUCCESS [1.142s] |
| MavenHelloWebClient ............................... SUCCESS [8.072s] |
| ------------------------------------------------------------------------ |
| BUILD SUCCESS |
| ---- |
| |
| NOTE: Crie a aplicação web manualmente se ela não for criada automaticamente quando você criar o projeto MavenOSGiCDIProject. |
| |
| Na janela Arquivos, expanda o nó do projeto para a aplicação Web e confirme se o arquivo compactado ``MavenHelloWebClient-1.0-SNAPSHOT.war`` foi criado no diretório de destino. Se você expandir o arquivo compactado WAR do cliente Web e examinar o ``MANIFEST.MF`` , verá que o manifesto contém linhas similares às seguintes. |
| |
| |
| [source,java] |
| ---- |
| |
| Manifest-Version: 1.0 |
| Archiver-Version: Plexus Archiver |
| Created-By: Apache Maven |
| Built-By: nb |
| Build-Jdk: 1.7.0_45 |
| ---- |
| |
| |
| === Construindo a aplicação Web como um Pacote OSGi |
| |
| Para usar o ``@OSGiService`` e recuperar pacotes OSGi registrados, é preciso tornar a aplicação Web um pacote que possa acessar o ``BundleContext`` . Para tornar o WAR um pacote OSGi (Pacote de Aplicação Web), adicione os metadados ``Web-ContextPath`` ao ``MANIFEST.MF`` no WAR. Para tanto, especifique o elemento ``<Web-ContextPath>`` nas instruções do ``maven-bundle-plugin`` e o manifesto gerado pelo plug-in conterá o elemento. Em seguida, você modificará a configuração do ``maven-war-plugin`` para instruir o plug-in a adicionar o manifesto que foi gerado pelo ``plug-in-do-pacote-maven`` ao arquivo compactado WAR. |
| |
| 1. Na janela Projetos, expanda o nó dos Arquivos de Projeto sob o MavenHelloWebCliente clique duas vezes em ``pom.xml`` para abrir o arquivo no editor. |
| 2. Adicione a seguinte entrada para adicionar o ``plug-in-do-pacote-maven`` ao POM. |
| |
| [source,xml] |
| ---- |
| |
| <build> |
| <plugins> |
| *<plugin> |
| <groupId>org.apache.felix</groupId> |
| <artifactId>maven-bundle-plugin</artifactId> |
| <version>2.2.0</version> |
| <extensions>true</extensions> |
| <configuration> |
| <supportedProjectTypes> |
| <supportedProjectType>ejb</supportedProjectType> |
| <supportedProjectType>war</supportedProjectType> |
| <supportedProjectType>bundle</supportedProjectType> |
| <supportedProjectType>jar</supportedProjectType> |
| </supportedProjectTypes> |
| <instructions> |
| <!-- Specify elements to add to MANIFEST.MF --> |
| <Web-ContextPath>/mavenhellowebclient</Web-ContextPath> |
| <!-- By default, nothing is exported --> |
| <Export-Package>!*.impl.*, *</Export-Package> |
| </instructions> |
| </configuration> |
| <executions> |
| <execution> |
| <id>bundle-manifest</id> |
| <phase>process-classes</phase> |
| <goals> |
| <goal>manifest</goal> |
| </goals> |
| </execution> |
| <execution> |
| <id>bundle-install</id> |
| <phase>install</phase> |
| <goals> |
| <goal>install</goal> |
| </goals> |
| </execution> |
| </executions> |
| </plugin>* |
| |
| ---- |
| |
| [start=3] |
| . Modifique os elementos de configuração do ``maven-war-plugin`` para adicionar informações do pacote ao ``MANIFEST.MF`` . Salve as alterações. |
| |
| [source,xml] |
| ---- |
| |
| <plugin> |
| <groupId>org.apache.maven.plugins</groupId> |
| <artifactId>maven-war-plugin</artifactId> |
| <version>2.3</version> |
| <configuration> |
| *<archive> |
| <!-- add bundle plugin generated manifest to the war --> |
| <manifestFile> |
| ${project.build.outputDirectory}/META-INF/MANIFEST.MF |
| </manifestFile> |
| <!-- For some reason, adding Bundle-ClassPath in maven-bundle-plugin |
| confuses that plugin and it generates wrong Import-Package, etc. |
| So, we generate it here.--> |
| <manifestEntries> |
| <Bundle-ClassPath>WEB-INF/classes/</Bundle-ClassPath> |
| </manifestEntries> |
| </archive>* |
| <failOnMissingWebXml>false</failOnMissingWebXml> |
| </configuration> |
| </plugin> |
| ---- |
| |
| [start=4] |
| . Clique com o botão direito do mouse no nó do projeto MavenHelloWebClient na janela Projetos e selecione Limpar e Construir. |
| |
| Ao expandir o arquivo compactado WAR e abrir o ``MANIFEST.MF`` no editor, você verá que o ``MANIFEST.MF`` contém informações adicionais, incluindo a entrada ``Web-ContextPath: /mavenhellowebclient`` especificada na configuração ``maven-bundle-plugin`` e entradas de nome de pacote. |
| |
| |
| [source,java] |
| ---- |
| |
| Manifest-Version: 1.0 |
| Export-Package: com.mycompany.mavenhellowebclient;uses:="com.mycompany |
| .mavenhelloserviceapi,javax.servlet,org.glassfish.osgicdi,javax.injec |
| t,javax.servlet.annotation,javax.servlet.http";version="1.0.0.SNAPSHO |
| T" |
| Bundle-ClassPath: WEB-INF/classes/ |
| Built-By: nb |
| Tool: Bnd-1.50.0 |
| Bundle-Name: MavenHelloWebClient |
| Created-By: Apache Maven Bundle Plugin |
| *Web-ContextPath: /mavenhellowebclient* |
| Build-Jdk: 1.7.0_45 |
| Bundle-Version: 1.0.0.SNAPSHOT |
| Bnd-LastModified: 1395053424008 |
| Bundle-ManifestVersion: 2 |
| Import-Package: com.mycompany.mavenhelloserviceapi;version="[1.0,2)",j |
| avax.inject,javax.servlet,javax.servlet.annotation,javax.servlet.http |
| ,org.glassfish.osgicdi;version="[1.0,2)" |
| Bundle-SymbolicName: com.mycompany.MavenHelloWebClient |
| Archiver-Version: Plexus Archiver |
| ---- |
| |
| Para obter mais informações sobre como construir aplicações Web como pacotes OSGi, consulte as páginas seguintes. |
| |
| * link:http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish[+ http://weblogs.java.net/blog/2009/06/04/osgi-enabled-web-applications-inglassfish+] |
| * link:http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html[+ http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html+] |
| |
| |
| === Implantando o Pacote de Aplicação Web |
| |
| Neste exercício, você copiará o pacote da aplicação Web para a pasta ``implantação automática/pacotes`` na instalação do GlassFish. |
| |
| 1. Navegue até o diretório de ``destino`` que contém o ``MavenHelloWebClient-1.0-SNAPSHOT.war`` . |
| 2. Copie o ``MavenHelloWebClient-1.0-SNAPSHOT.war`` na pasta ``implantação automática/pacotes`` da instalação do GlassFish. |
| |
| Quando você copiar o arquivo compactado WAR para o diretório, um resultado semelhante ao mostrado a seguir será exibido no log do GlassFish Server. |
| |
| |
| [source,java] |
| ---- |
| |
| INFO: Started bundle: file:/glassfish-3.1.1/glassfish/domains/domain1/autodeploy/bundles/MavenHelloWebClient-1.0-SNAPSHOT.war |
| ... |
| INFO: ---- Injection requested for framework service type interface com.mycompany.mavenhelloserviceapi.Hello and annotated with dynamic=true, serviceCriteria= |
| INFO: WEB0671: Loading application [com.mycompany.MavenHelloWebClient_1.0.0.SNAPSHOT] at [/mavenhellowebclient] |
| INFO: Registered ServletContext as a service with properties: {osgi.web.symbolicname=com.mycompany.MavenHelloWebClient, osgi.web.version=1.0.0.SNAPSHOT, osgi.web.contextpath=/mavenhellowebclient} |
| |
| ---- |
| |
| É possível exibir o servlet no browser clicando no link a seguir link:http://localhost:8080/mavenhellowebclient/HelloServlet[+http://localhost:8080/mavenhellowebclient/HelloServlet+]. |
| |
| |
| == Instalando e Usando a Console de Admnin do OSGI |
| |
| Você pode usar a Console de Admin do OSGi GlassFish para instalar, iniciar e parar os pacotes do OSGi implantados no servidor. Neste exercício, você ativará a Console de Admin do OSGi GlassFish e, em seguida, exibirá a lista de pacotes OSGi registrados. |
| |
| Realize as etapas a seguir para instalar os add-ons do GlassFish necessários para a ativação da Console do OSGi e para exibir os pacotes na Console de Admin do Domínio do GlassFish. |
| |
| 1. Abra a Console de Admin do Domínio do GlassFish no browser. |
| |
| Clique com o botão direito do mouse no nó do GlassFish server na janela Serviços e selecione Exibir Console de Admin de Domínio. |
| |
| |
| [start=2] |
| . Clique na Ferramenta de Atualização na coluna de navegação esquerda. |
| |
| [start=3] |
| . Selecione ``glassfish-osgi-gui`` na lista de add-ons disponíveis. |
| |
| Clique em Instalar e aceite a licença. |
| |
| image::images/cdi-glassfish-addons.png[title="Ferramenta de Atualização da Console de Admin do GlassFish"] |
| |
| |
| [start=4] |
| . Reinicie o GlassFish Server. |
| |
| *Importante:* se você estiver executando GlassFish Server 3.1.2.2 você precisará modificar o arquivo ``osgi.properties`` localizado no diretório ``_GLASSFISH-INSTALL_/glassfish/config/`` e definir o valor da propriedade ``org.osgi.framework.startlevel.beginning`` como "2" ( ``org.osgi.framework.startlevel.beginning=2`` ). |
| Consulte o seguinte fórum para obter mais detalhes: |
| link:http://www.java.net/forum/topic/glassfish/glassfish/cannot-start-web-console-glassfish-version-3122[+Não é possível iniciar a console Web no Glassfish versão 3.1.2.2+]. |
| |
| |
| [start=5] |
| . Abra a Console de Admin novamente e clique em *servidor (Servidor de Admin)* na coluna de navegação esquerda. |
| |
| [start=6] |
| . Clique na guia da Console do OSGi para exibir uma lista de pacotes OSGi implantados. |
| |
| image::images/cdi-glassfish-console.png[title="Guia de Gerenciamento de Dependências na caixa de diálogo Adicionar Biblioteca"] |
| |
| NOTE: Você poderá ser solicitado a informar o nome de usuário e a senha para exibir a lista de pacotes OSGi. Confirme se a caixa de diálogo de autorização não está oculta se você não vir uma lista de pacotes na guia Console do OSGi. O nome de usuário padrão do servidor GlassFish 4 é ``admin`` se você instalou o servidor quando instalou o IDE. A senha fica vazia por padrão. |
| |
| É possível rolar a lista para baixo para exibir os status dos pacotes OSGi registrados, além de iniciar e parar os pacotes individuais. Se a lista for ordenada por Id (maior para menor), você verá que os três pacotes que foram implantados serão exibidos perto do topo da lista. |
| |
| |
| link:/about/contact_form.html?to=3&subject=Feedback:%20Using%20CDI%20to%20Inject%20OSGi%20Bundles%20as%20Services[+Enviar Feedback neste Tutorial+] |
| |
| |
| |
| == Consulte Também |
| |
| Para obter mais informações sobre o uso do NetBeans IDE e Maven para desenvolver pacotes OSGi, consulte os seguintes recursos: |
| |
| * link:http://wiki.netbeans.org/OSGiAndNetBeans[+OSGi And NetBeans at wiki.netbeans.org+] |
| * link:http://wiki.netbeans.org/MavenBestPractices[+Melhores Práticas para o Apache Maven no NetBeans IDE+] |
| * link:https://blogs.oracle.com/arungupta/entry/totd_125_creating_an_osgi[+TOTD #125: Criando um pacote OSGi utilizando o NetBeans e implantando no GlassFish+] |
| * link:../../trails/java-ee.html[+Trilha de Aprendizado do Java EE e Java Web+] |
| |
| Para enviar comentários e sugestões, obter suporte e se manter informado sobre os mais recentes desenvolvimentos das funcionalidades de desenvolvimento do Java EE do NetBeans IDE, link:../../../community/lists/top.html[+inscreva-se na lista de correspondência de nbj2ee+]. |
| |