SlideShare uma empresa Scribd logo
Liferay e 
Modularização com 
Arquitetura 
OSGi 
André Ricardo Barreto de Oliveira "Arbo" 
Core Engineer 
Liferay do Brasil 
@arbocombr 
@Liferay_BR 
#SymposiumBrazil 
Liferay Symposium Brazil 2014
Modularização 
Paradigma 
OSGi 
Tecnologia 
Liferay Portal 
Plataforma
Modularização 
Paradigma
A busca por modularização 
Tamanho do software crescendo extraordinariamente 
(Pressões de desenvolvimento) 
Deploy e redeploy parcial com granularidade mais fina 
(Pressões de produção) 
Oportunidades de comercialização com flexibilidade 
(Pressões de negócio)
Pressões de desenvolvimento 
Não modular 
Código fonte demora para checautar 
Make demora para construir 
Testes demoram para fornecer 
feedback 
Distribuições demoram para fazer 
download 
Histórico de commits misturando 
funcionalidades 
Dependências circulares 
comprometendo refactoring 
Modular 
Projetos menores constroem e 
testam mais rápido, com histórico 
limpo 
Dependências bem definidas, sem 
circularidades 
Downloads reduzidos, incrementais 
e transparentes 
Separação de interface e 
implementação 
Melhor testabilidade de 
componentes individuais
Pressões de produção 
Não modular 
Upgrade? "Tem que parar o servidor" 
Deploy de bugfix crítico? 
"Tem que parar o servidor" 
Melhoria isolada? 
"Tem que parar o servidor" 
Dependency hell: conflitos de versão 
em bibliotecas compartilhadas 
Class loader hell: 
ClassNotFoundException, 
ClassCastException 
Modular 
Hot deploy e redeploy de fixes e 
melhorias, sem paradas 
Desligar pontos quentes conhecidos 
mantendo no ar o resto da aplicação 
Subir recursos somente se 
dependências estiverem presentes 
Múltiplas versões da mesma 
biblioteca coexistindo no servidor 
Isolamento de class loaders com 
injeção de dependências
Pressões de negócio 
Não modular 
Relatórios esperando para entrar 
junto com funcionalidades 
Falta framework de plugins para 
injetar consultas e relatórios 
dinamicamente, on the fly 
Vender o produto base + extensões, 
plugins, módulos, combos 
Enxugar o produto para derrubar 
barreiras de entrada 
Novos segmentos de mercado 
Modular 
Relatórios, consultas, exports com 
time-to-market acelerado 
Standard bem suportado para 
componentes e serviços dinâmicos 
Produto base enxuto, simples de 
implantar e usar 
Adaptar e reagir à entrada e saída 
de features no ambiente 
Definir facilmente pontos de 
extensão para plugins de terceiros
Um mundo modular 
Arquitetura modular é uma mudança de paradigma. 
É projetar a sua aplicação assumindo ser possível: 
Fabricar e testar peças menores em isolamento; 
Substituir peças em produção com a aplicação rodando; 
Fornecer peças novas para estender e aumentar a aplicação. 
E claro, tendo a tecnologia para fazer tudo isso.
Liferay Portal 
Liferay Portal: portlet container 
Paradigmas modulares implementados e encorajados há anos: 
Arquitetura extensível de portlets, plugins e serviços... 
Hot deploy... 
Separação entre interface e implementação... 
Evolução natural: oferecer tecnologia modular de ponta a ponta. 
Próximo passo e futuro da arquitetura modular do Liferay Portal?
OSGi 
Tecnologia
OSGi: modularização em Java 
OSGi: padrão de tecnologia da plataforma Java para modularização 
Tecnologia madura: 15 anos de melhorias e evolução 
Bancada por grandes players: Oracle, Red Hat, Eclipse, IBM, Liferay 
Todos os principais app servers Java EE já são baseados em OSGi 
Focada em standards e especificações, variadas implementações 
Posta à prova com sucesso em numerosos projetos e produtos
OSGi: conceitos essenciais 
Bundle: o módulo OSGi 
Bundle container 
Ciclo de vida do bundle no deploy 
Objeto BundleActivator 
OSGi Services 
Export-Package & Import-Package 
Espaços de classes isolados 
Injeção de Dependências
Bundle: o módulo OSGi 
(nada mais que um JAR) 
Em OSGi, o módulo não passa de um JAR comum. 
META-INF/MANIFEST.MF 
Bundle-Name: Liferay Search API 
Bundle-SymbolicName: com.liferay.search.api 
Bundle-Version: 1.0.0 
Export-Package: com.liferay.search.api;version="1.0.0" 
(Não se preocupe, 
cabeçalhos são inseridos automaticamente 
por ferramentas como bndtools.)
OSGi bundle container 
JAR? Nada de Java SE classpath, 
nem Java EE lib em WAR ou EAR. 
Bundle JAR: deploy é copiar o arquivo 
no diretório do container OSGi. 
"Como assim container? Mais um servidor?" 
Não, seu app server Java EE favorito 
na certa já é um container OSGi! 
Implementações de bundle containers são bibliotecas. 
(Apache Felix) 
Mesmo aplicações Java desktop embarcam bundle containers 
para oferecer mecanismo de plugins. 
(Eclipse Equinox)
Ciclo de vida do bundle: 
deploy no OSGi container 
Assim que é copiado no container: INSTALLED 
Todas as dependências satisfeitas: RESOLVED 
Executando objeto BundleActivator: STARTING 
Bundle levantado e funcionando: ACTIVE
BundleActivator 
Um bundle jar com BundleActivator reage ao entrar ou sair do container. 
(Sem necessidade de static class initializer) 
Bundle-Activator: com.liferay.search.elasticsearch.Activator 
package com.liferay.search.elasticsearch; 
import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 
public class Activator implements BundleActivator { 
public void start(BundleContext context) { 
// Inicializações em geral, registrar serviços... 
// INSTALLED -> RESOLVED -> STARTING -> ACTIVE 
} 
public void stop(BundleContext context) { 
// De-registrar serviços, liberar recursos alocados 
// ACTIVE -> STOPPING -> RESOLVED -> UNINSTALLED 
} 
}
OSGi Services 
(nada mais que uma interface) 
Um OSGi Service pode ser qualquer interface Java. Não precisa mais que isso. 
package com.liferay.search.api; 
public interface SearchEngine { 
public SearchResult search(String query); 
} 
Bundle jar embarca a classe implementadora: 
import com.liferay.search.api.SearchEngine; 
import org.osgi.service.component.annotations.Component; 
@Component(service = SearchEngine.class) 
public class ElasticsearchSearchEngine implements SearchEngine { 
public SearchResult search(String query) { /* ... */ } 
} 
Declarative Services (DS): anotações com várias opções para definir Serviços.
Export-Package 
Import-Package 
Bundle jar declara quais Java packages oferece para outros bundles, 
e também quais Java packages necessita de outros bundles. 
Bundle-Name: Liferay Search Portlet 
Bundle-SymbolicName: com.liferay.search.portlet 
Import-Package: com.liferay.search.api;version="1.0.0" 
Bundle-Name: Liferay Search API 
Bundle-SymbolicName: com.liferay.search.api 
Export-Package: com.liferay.search.api;version="1.0.0" 
Bundle-Name: Liferay Search Elasticsearch Implementation 
Bundle-SymbolicName: com.liferay.search.elasticsearch 
Import-Package: com.liferay.search.api;version="1.0.0" 
Java packages de interfaces 
de serviços são exportados, 
mas não os packages das 
implementações. 
Ao iniciar um bundle, 
o container procura 
os Import-Package. 
Deve existir outro 
bundle oferecendo 
como Export-Package. 
Se não encontrar, o bundle não é resolvido e não inicia. 
Se encontrar, roda o BundleActivator e registra os serviços.
Espaços de classes isolados 
Em Java SE, qualquer classe pública 
fica visível para todo o classpath. 
Em OSGi, mesmo classes públicas 
só são visíveis internamente no bundle. 
Cada bundle em seu próprio classloader: 
isolamento de espaço de classes. 
E ainda assim os objetos transitados 
são Java puro, sem proxies. 
E mais: Import-Package e Export-Package 
declaram o número da versão. 
Como cada bundle tem classloader isolado, 
o mesmo container pode ter múltiplas versões 
da mesma biblioteca, componente ou serviço. 
Fim do dependency hell.
Injeção de dependências 
OSGi container com anotações Declarative Services (DS): 
injeta automaticamente a instância recebida de outro bundle, 
remove a instância quando o outro bundle sai de operação. 
@Component(service=Searcher.class) 
public class Searcher { 
@Reference 
protected void setSearchEngine(SearchEngine searchEngine) { 
this.searchEngine = searchEngine; 
} 
protected void unsetSearchEngine(SearchEngine searchEngine) { 
this.searchEngine = null; 
} 
} 
Frameworks clássicos: injeção estática, somente no wiring inicial. 
OSGi: injeção e remoção dinâmicas, a qualquer momento, sem parar a aplicação.
Tudo funcionando 
OSGi runtimes: ferramental variado de operação e monitoria
Liferay Portal 
Plataforma
Liferay 7: 
Portal meets OSGi 
Liferay Portal, portlet container: agora também OSGi container!
Novidades no Liferay 7: 
Portlets clássicos JSR-168, JSR-286 
Portlets e Liferay Services clássicos (WAR) continuam a funcionar 
"as is", sem qualquer tipo de conversão 
São expostos automaticamente no container como serviços OSGi 
Services clássicos podem ser injetados em novos componentes via 
API OSGi (em vez de static *Util) 
Fazer deploy, redeploy, desinstalar, iniciar e parar: 
independente de ferramentas específicas de cada app server
Portlet clássico... 
package com.liferay.symposium; 
import java.io.IOException; 
import javax.portlet.GenericPortlet; 
import javax.portlet.PortletException; 
import javax.portlet.RenderRequest; 
import javax.portlet.RenderResponse; 
public class MyPortlet extends GenericPortlet { 
protected void doView(RenderRequest request, RenderResponse response) 
throws PortletException, IOException { 
response.getWriter().print("Hello World!"); 
} 
}
... e o novo Portlet OSGi 
package com.liferay.symposium; 
import java.io.IOException; 
import javax.portlet.GenericPortlet; 
import javax.portlet.PortletException; 
import javax.portlet.RenderRequest; 
import javax.portlet.RenderResponse; 
import org.osgi.service.component.annotations.Component; 
@Component( 
service = Portlet.class, 
property = { 
"com.liferay.portlet.display-category=category.sample", "com.liferay.portlet.instanceable=true", 
"javax.portlet.display-name=My DS Portlet", "javax.portlet.security-role-ref=power-user,user" 
}) 
public class MyPortlet extends GenericPortlet { 
protected void doView(RenderRequest request, RenderResponse response) 
throws PortletException, IOException { 
response.getWriter().print("Hello World!"); 
} 
} 
(sem mudanças) 
(sem mudanças)
Portlets e Declarative Services (DS) 
import org.osgi.service.component.annotations.Component; 
@Component( 
service = Portlet.class, 
property = { 
"com.liferay.portlet.display-category=category.sample", 
"com.liferay.portlet.instanceable=true", 
"javax.portlet.display-name=My DS Portlet", 
"javax.portlet.security-role-ref=power-user,user" 
}) 
public class MyPortlet extends GenericPortlet 
{ 
/* ... */ 
}
Novidades no Liferay 7: 
Portlets e Services OSGi 
Portlets e Services: serviços OSGi nativos, embarcados em bundles (JAR) 
Properties em anotações no portlet (em vez de arquivos XML) 
Dependências declaradas: independente da ordem de deploy, Portlets e 
Services aguardam suas dependências serem resolvidas e iniciadas 
Detecção de quebras de API, com baselines e versões: 
joyful upgrades, previsíveis, melhor documentados 
Seus Portlets e Services definindo os próprios pontos de extensão, com 
anotações, se beneficiando de todo o ciclo de vida OSGi... Marketplace! 
Ênfase em expor a API e esconder as implementações: 
melhores testes + abre as portas para remoting
Deployable WAR clássico 
em app server 
WAR, para os app servers - mesmo 
só serviços e temas sem web context 
Deploy Liferay dependente da 
implementação de deploy de cada 
app server 
Especificação de portlets nem sequer 
define empacotamento e deploy 
"Damos o war, confiamos no app 
server para expor serviços na outra 
ponta" 
Novidades no Liferay 7: 
Hot deploy com OSGi 
Deployable JAR bundle 
em Liferay Portal OSGi Container 
Plugin simples JAR OSGi bundle - 
mesmo com portlets, web resources, 
JSP 
Deploy de plugins não atravessa 
mais o app server, apenas o 
container OSGi 
Em OSGi, o modelo de 
empacotamento e deploy é definido 
na especificação. 
Simples, direto e previsível.
Novidades no Liferay 7: 
Escolha suas ferramentas 
Antes: plugin WAR obrigatoriamente 
construído via Liferay SDK 
(ou Maven, sob limites) 
Agora: plugin OSGi bundle é um simples JAR, 
dispensando o Liferay SDK. 
Ant, Maven, Gradle, Eclipse, IntelliJ... 
ou a tecnologia de sua preferência! 
Repositório público de artefatos Liferay 
para resolução de dependências 
(Releases, oportunamente dev snapshots)
Novidades no Liferay 7: 
A Modular Liferay 
Desde sempre, destaque do Liferay Portal: 
grande variedade de features "out of the box" 
Mas com isso... distribuição padrão "all or nothing" 
Para Liferay 7+: Lightweight core 
Em andamento: extração massiva de módulos "presos" no core 
Polls, Bookmarks, Currency, Web Proxy, Iframe, Blogs... 
Download do Liferay Portal básico será bem menor... 
Implantações enxutas... com os componentes que você escolher.
Para saber mais: 
http://www.osgi.org/Technology/HowOSGi 
Liferay dev.life broadcast: 
http://youtu.be/KPjmB5yj8Og 
http://youtu.be/NB3jAh_FhuI 
Liferay Developer Blogs: 
https://www.liferay.com/web/raymond.auge/blog 
Welcome to a modular future :-) 
andre.oliveira@liferay.com 
@arbocombr 
@Liferay_BR 
#SymposiumBrazil

Mais conteúdo relacionado

Mais procurados

Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveisSeminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Rogério Moraes de Carvalho
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
Eder Magalhães
 
Intro à Graphql
Intro à GraphqlIntro à Graphql
Intro à Graphql
André Justi
 
Automação e virtualização de serviços
Automação e virtualização de serviçosAutomação e virtualização de serviços
Automação e virtualização de serviços
Elias Nogueira
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Vinícius Thiengo
 
Introdução a AOP + SpringAOP
Introdução a AOP + SpringAOPIntrodução a AOP + SpringAOP
Introdução a AOP + SpringAOP
elliando dias
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
Elias Nogueira
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
tdc-globalcode
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
Diego Santos
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
Vinícius Thiengo
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Elias Nogueira
 
Grails
GrailsGrails
Grails
Alex Guido
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
Vinícius Thiengo
 
GIT Básico
GIT BásicoGIT Básico
GIT Básico
André Justi
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
Éverton Ribeiro
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
Elias Nogueira
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
Elias Nogueira
 
Docker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no AzureDocker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no Azure
Rogério Moraes de Carvalho
 
JBoss Fuse Workshop Desenvolvimento - Parte 1
JBoss Fuse Workshop Desenvolvimento - Parte 1JBoss Fuse Workshop Desenvolvimento - Parte 1
JBoss Fuse Workshop Desenvolvimento - Parte 1
Paulo Roberto de Castro Filho
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
Vinícius Thiengo
 

Mais procurados (20)

Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveisSeminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
Seminfo 2012 (Urutaí-GO): Desenvolvimento para dispositivos móveis
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Intro à Graphql
Intro à GraphqlIntro à Graphql
Intro à Graphql
 
Automação e virtualização de serviços
Automação e virtualização de serviçosAutomação e virtualização de serviços
Automação e virtualização de serviços
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
Introdução a AOP + SpringAOP
Introdução a AOP + SpringAOPIntrodução a AOP + SpringAOP
Introdução a AOP + SpringAOP
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Grails
GrailsGrails
Grails
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
GIT Básico
GIT BásicoGIT Básico
GIT Básico
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
Docker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no AzureDocker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no Azure
 
JBoss Fuse Workshop Desenvolvimento - Parte 1
JBoss Fuse Workshop Desenvolvimento - Parte 1JBoss Fuse Workshop Desenvolvimento - Parte 1
JBoss Fuse Workshop Desenvolvimento - Parte 1
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 

Destaque

Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
Antonio Musarra
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° Episodio
Antonio Musarra
 
Introduzione al Web 2.0
Introduzione al Web 2.0Introduzione al Web 2.0
Introduzione al Web 2.0
Antonio Musarra
 
Introduzione ai sistemi di Content Management System (CMS)
Introduzione ai sistemi di Content Management System (CMS)Introduzione ai sistemi di Content Management System (CMS)
Introduzione ai sistemi di Content Management System (CMS)
Antonio Musarra
 
OSGi e Liferay 7
OSGi e Liferay 7OSGi e Liferay 7
OSGi e Liferay 7
Antonio Musarra
 
JAX-WS e JAX-RS
JAX-WS e JAX-RSJAX-WS e JAX-RS
JAX-WS e JAX-RS
Antonio Musarra
 
Microservices: The OSGi way A different vision on microservices
Microservices: The OSGi way A different vision on microservicesMicroservices: The OSGi way A different vision on microservices
Microservices: The OSGi way A different vision on microservices
Miguel Pastor
 
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterpriseMoved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
Milen Dyankov
 

Destaque (8)

Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
Integrazione Sistemi CRM (Joomla) & CRM (SugarCRM)
 
Liferay - Quick Start 1° Episodio
Liferay - Quick Start 1° EpisodioLiferay - Quick Start 1° Episodio
Liferay - Quick Start 1° Episodio
 
Introduzione al Web 2.0
Introduzione al Web 2.0Introduzione al Web 2.0
Introduzione al Web 2.0
 
Introduzione ai sistemi di Content Management System (CMS)
Introduzione ai sistemi di Content Management System (CMS)Introduzione ai sistemi di Content Management System (CMS)
Introduzione ai sistemi di Content Management System (CMS)
 
OSGi e Liferay 7
OSGi e Liferay 7OSGi e Liferay 7
OSGi e Liferay 7
 
JAX-WS e JAX-RS
JAX-WS e JAX-RSJAX-WS e JAX-RS
JAX-WS e JAX-RS
 
Microservices: The OSGi way A different vision on microservices
Microservices: The OSGi way A different vision on microservicesMicroservices: The OSGi way A different vision on microservices
Microservices: The OSGi way A different vision on microservices
 
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterpriseMoved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
Moved to https://slidr.io/azzazzel/liferay-7-microservices-for-the-enterprise
 

Semelhante a Liferay e Modularização com Arquitetura OSGi

Java Seminar
Java SeminarJava Seminar
Java Seminar
armeniocardoso
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
Dr. Spock
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
Carlos Gonzaga
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
Rafael Benevides
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
Rafael Benevides
 
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse VirgoModularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
Regis Machado
 
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvemASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
Rogério Moraes de Carvalho
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
Giovanni Bassi
 
Treinamento Android Embarcado
Treinamento Android EmbarcadoTreinamento Android Embarcado
Treinamento Android Embarcado
Odair Sousa
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
Alessandro Binhara
 
Construindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOpsConstruindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOps
Camila Carrera
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
Igor Moura
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
Rodrigo Cândido da Silva
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
Alex Guido
 
Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
Alexandre Tarifa
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
Wende Mendes
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
Dr. Spock
 
DevOps na AWS: Construindo Sistemas para Entregas Rápidas
DevOps na AWS: Construindo Sistemas para Entregas RápidasDevOps na AWS: Construindo Sistemas para Entregas Rápidas
DevOps na AWS: Construindo Sistemas para Entregas Rápidas
Amazon Web Services LATAM
 
Svn - grupo de estudos sol7
Svn - grupo de estudos sol7Svn - grupo de estudos sol7
Svn - grupo de estudos sol7
SOL7 - Tecnologia de Decisão
 
Tecnologia Java
Tecnologia JavaTecnologia Java
Tecnologia Java
Glaucio Scheibel
 

Semelhante a Liferay e Modularização com Arquitetura OSGi (20)

Java Seminar
Java SeminarJava Seminar
Java Seminar
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse VirgoModularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo
 
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvemASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
ASP.NET Core, .NET Core e EF Core: multiplataforma e otimizados para a nuvem
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Treinamento Android Embarcado
Treinamento Android EmbarcadoTreinamento Android Embarcado
Treinamento Android Embarcado
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
Construindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOpsConstruindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOps
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
GUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EEGUJavaSC - Mini-curso Java EE
GUJavaSC - Mini-curso Java EE
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
 
CDI -Contextos e Dependências
CDI -Contextos e DependênciasCDI -Contextos e Dependências
CDI -Contextos e Dependências
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
DevOps na AWS: Construindo Sistemas para Entregas Rápidas
DevOps na AWS: Construindo Sistemas para Entregas RápidasDevOps na AWS: Construindo Sistemas para Entregas Rápidas
DevOps na AWS: Construindo Sistemas para Entregas Rápidas
 
Svn - grupo de estudos sol7
Svn - grupo de estudos sol7Svn - grupo de estudos sol7
Svn - grupo de estudos sol7
 
Tecnologia Java
Tecnologia JavaTecnologia Java
Tecnologia Java
 

Mais de André Ricardo Barreto de Oliveira

Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
André Ricardo Barreto de Oliveira
 
Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USASearch Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
André Ricardo Barreto de Oliveira
 
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
André Ricardo Barreto de Oliveira
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
André Ricardo Barreto de Oliveira
 
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
André Ricardo Barreto de Oliveira
 
Escrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamentoEscrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamento
André Ricardo Barreto de Oliveira
 

Mais de André Ricardo Barreto de Oliveira (6)

Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
Liferay Search: Best Practices to Dramatically Improve Relevance - Liferay Sy...
 
Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USASearch Intelligently - Liferay Symposium North America 2016, Chicago, USA
Search Intelligently - Liferay Symposium North America 2016, Chicago, USA
 
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
Search: Explorando Todo O Poder das Buscas - Liferay Symposium Brasil 2015, S...
 
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, GermanyHarnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
Harnessing The Power of Search - Liferay DEVCON 2015, Darmstadt, Germany
 
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
 
Escrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamentoEscrevendo testes unitários para código legado: técnicas de isolamento
Escrevendo testes unitários para código legado: técnicas de isolamento
 

Liferay e Modularização com Arquitetura OSGi

  • 1. Liferay e Modularização com Arquitetura OSGi André Ricardo Barreto de Oliveira "Arbo" Core Engineer Liferay do Brasil @arbocombr @Liferay_BR #SymposiumBrazil Liferay Symposium Brazil 2014
  • 2. Modularização Paradigma OSGi Tecnologia Liferay Portal Plataforma
  • 4. A busca por modularização Tamanho do software crescendo extraordinariamente (Pressões de desenvolvimento) Deploy e redeploy parcial com granularidade mais fina (Pressões de produção) Oportunidades de comercialização com flexibilidade (Pressões de negócio)
  • 5. Pressões de desenvolvimento Não modular Código fonte demora para checautar Make demora para construir Testes demoram para fornecer feedback Distribuições demoram para fazer download Histórico de commits misturando funcionalidades Dependências circulares comprometendo refactoring Modular Projetos menores constroem e testam mais rápido, com histórico limpo Dependências bem definidas, sem circularidades Downloads reduzidos, incrementais e transparentes Separação de interface e implementação Melhor testabilidade de componentes individuais
  • 6. Pressões de produção Não modular Upgrade? "Tem que parar o servidor" Deploy de bugfix crítico? "Tem que parar o servidor" Melhoria isolada? "Tem que parar o servidor" Dependency hell: conflitos de versão em bibliotecas compartilhadas Class loader hell: ClassNotFoundException, ClassCastException Modular Hot deploy e redeploy de fixes e melhorias, sem paradas Desligar pontos quentes conhecidos mantendo no ar o resto da aplicação Subir recursos somente se dependências estiverem presentes Múltiplas versões da mesma biblioteca coexistindo no servidor Isolamento de class loaders com injeção de dependências
  • 7. Pressões de negócio Não modular Relatórios esperando para entrar junto com funcionalidades Falta framework de plugins para injetar consultas e relatórios dinamicamente, on the fly Vender o produto base + extensões, plugins, módulos, combos Enxugar o produto para derrubar barreiras de entrada Novos segmentos de mercado Modular Relatórios, consultas, exports com time-to-market acelerado Standard bem suportado para componentes e serviços dinâmicos Produto base enxuto, simples de implantar e usar Adaptar e reagir à entrada e saída de features no ambiente Definir facilmente pontos de extensão para plugins de terceiros
  • 8. Um mundo modular Arquitetura modular é uma mudança de paradigma. É projetar a sua aplicação assumindo ser possível: Fabricar e testar peças menores em isolamento; Substituir peças em produção com a aplicação rodando; Fornecer peças novas para estender e aumentar a aplicação. E claro, tendo a tecnologia para fazer tudo isso.
  • 9. Liferay Portal Liferay Portal: portlet container Paradigmas modulares implementados e encorajados há anos: Arquitetura extensível de portlets, plugins e serviços... Hot deploy... Separação entre interface e implementação... Evolução natural: oferecer tecnologia modular de ponta a ponta. Próximo passo e futuro da arquitetura modular do Liferay Portal?
  • 11. OSGi: modularização em Java OSGi: padrão de tecnologia da plataforma Java para modularização Tecnologia madura: 15 anos de melhorias e evolução Bancada por grandes players: Oracle, Red Hat, Eclipse, IBM, Liferay Todos os principais app servers Java EE já são baseados em OSGi Focada em standards e especificações, variadas implementações Posta à prova com sucesso em numerosos projetos e produtos
  • 12. OSGi: conceitos essenciais Bundle: o módulo OSGi Bundle container Ciclo de vida do bundle no deploy Objeto BundleActivator OSGi Services Export-Package & Import-Package Espaços de classes isolados Injeção de Dependências
  • 13. Bundle: o módulo OSGi (nada mais que um JAR) Em OSGi, o módulo não passa de um JAR comum. META-INF/MANIFEST.MF Bundle-Name: Liferay Search API Bundle-SymbolicName: com.liferay.search.api Bundle-Version: 1.0.0 Export-Package: com.liferay.search.api;version="1.0.0" (Não se preocupe, cabeçalhos são inseridos automaticamente por ferramentas como bndtools.)
  • 14. OSGi bundle container JAR? Nada de Java SE classpath, nem Java EE lib em WAR ou EAR. Bundle JAR: deploy é copiar o arquivo no diretório do container OSGi. "Como assim container? Mais um servidor?" Não, seu app server Java EE favorito na certa já é um container OSGi! Implementações de bundle containers são bibliotecas. (Apache Felix) Mesmo aplicações Java desktop embarcam bundle containers para oferecer mecanismo de plugins. (Eclipse Equinox)
  • 15. Ciclo de vida do bundle: deploy no OSGi container Assim que é copiado no container: INSTALLED Todas as dependências satisfeitas: RESOLVED Executando objeto BundleActivator: STARTING Bundle levantado e funcionando: ACTIVE
  • 16. BundleActivator Um bundle jar com BundleActivator reage ao entrar ou sair do container. (Sem necessidade de static class initializer) Bundle-Activator: com.liferay.search.elasticsearch.Activator package com.liferay.search.elasticsearch; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { public void start(BundleContext context) { // Inicializações em geral, registrar serviços... // INSTALLED -> RESOLVED -> STARTING -> ACTIVE } public void stop(BundleContext context) { // De-registrar serviços, liberar recursos alocados // ACTIVE -> STOPPING -> RESOLVED -> UNINSTALLED } }
  • 17. OSGi Services (nada mais que uma interface) Um OSGi Service pode ser qualquer interface Java. Não precisa mais que isso. package com.liferay.search.api; public interface SearchEngine { public SearchResult search(String query); } Bundle jar embarca a classe implementadora: import com.liferay.search.api.SearchEngine; import org.osgi.service.component.annotations.Component; @Component(service = SearchEngine.class) public class ElasticsearchSearchEngine implements SearchEngine { public SearchResult search(String query) { /* ... */ } } Declarative Services (DS): anotações com várias opções para definir Serviços.
  • 18. Export-Package Import-Package Bundle jar declara quais Java packages oferece para outros bundles, e também quais Java packages necessita de outros bundles. Bundle-Name: Liferay Search Portlet Bundle-SymbolicName: com.liferay.search.portlet Import-Package: com.liferay.search.api;version="1.0.0" Bundle-Name: Liferay Search API Bundle-SymbolicName: com.liferay.search.api Export-Package: com.liferay.search.api;version="1.0.0" Bundle-Name: Liferay Search Elasticsearch Implementation Bundle-SymbolicName: com.liferay.search.elasticsearch Import-Package: com.liferay.search.api;version="1.0.0" Java packages de interfaces de serviços são exportados, mas não os packages das implementações. Ao iniciar um bundle, o container procura os Import-Package. Deve existir outro bundle oferecendo como Export-Package. Se não encontrar, o bundle não é resolvido e não inicia. Se encontrar, roda o BundleActivator e registra os serviços.
  • 19. Espaços de classes isolados Em Java SE, qualquer classe pública fica visível para todo o classpath. Em OSGi, mesmo classes públicas só são visíveis internamente no bundle. Cada bundle em seu próprio classloader: isolamento de espaço de classes. E ainda assim os objetos transitados são Java puro, sem proxies. E mais: Import-Package e Export-Package declaram o número da versão. Como cada bundle tem classloader isolado, o mesmo container pode ter múltiplas versões da mesma biblioteca, componente ou serviço. Fim do dependency hell.
  • 20. Injeção de dependências OSGi container com anotações Declarative Services (DS): injeta automaticamente a instância recebida de outro bundle, remove a instância quando o outro bundle sai de operação. @Component(service=Searcher.class) public class Searcher { @Reference protected void setSearchEngine(SearchEngine searchEngine) { this.searchEngine = searchEngine; } protected void unsetSearchEngine(SearchEngine searchEngine) { this.searchEngine = null; } } Frameworks clássicos: injeção estática, somente no wiring inicial. OSGi: injeção e remoção dinâmicas, a qualquer momento, sem parar a aplicação.
  • 21. Tudo funcionando OSGi runtimes: ferramental variado de operação e monitoria
  • 23. Liferay 7: Portal meets OSGi Liferay Portal, portlet container: agora também OSGi container!
  • 24. Novidades no Liferay 7: Portlets clássicos JSR-168, JSR-286 Portlets e Liferay Services clássicos (WAR) continuam a funcionar "as is", sem qualquer tipo de conversão São expostos automaticamente no container como serviços OSGi Services clássicos podem ser injetados em novos componentes via API OSGi (em vez de static *Util) Fazer deploy, redeploy, desinstalar, iniciar e parar: independente de ferramentas específicas de cada app server
  • 25. Portlet clássico... package com.liferay.symposium; import java.io.IOException; import javax.portlet.GenericPortlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; public class MyPortlet extends GenericPortlet { protected void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { response.getWriter().print("Hello World!"); } }
  • 26. ... e o novo Portlet OSGi package com.liferay.symposium; import java.io.IOException; import javax.portlet.GenericPortlet; import javax.portlet.PortletException; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.osgi.service.component.annotations.Component; @Component( service = Portlet.class, property = { "com.liferay.portlet.display-category=category.sample", "com.liferay.portlet.instanceable=true", "javax.portlet.display-name=My DS Portlet", "javax.portlet.security-role-ref=power-user,user" }) public class MyPortlet extends GenericPortlet { protected void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { response.getWriter().print("Hello World!"); } } (sem mudanças) (sem mudanças)
  • 27. Portlets e Declarative Services (DS) import org.osgi.service.component.annotations.Component; @Component( service = Portlet.class, property = { "com.liferay.portlet.display-category=category.sample", "com.liferay.portlet.instanceable=true", "javax.portlet.display-name=My DS Portlet", "javax.portlet.security-role-ref=power-user,user" }) public class MyPortlet extends GenericPortlet { /* ... */ }
  • 28. Novidades no Liferay 7: Portlets e Services OSGi Portlets e Services: serviços OSGi nativos, embarcados em bundles (JAR) Properties em anotações no portlet (em vez de arquivos XML) Dependências declaradas: independente da ordem de deploy, Portlets e Services aguardam suas dependências serem resolvidas e iniciadas Detecção de quebras de API, com baselines e versões: joyful upgrades, previsíveis, melhor documentados Seus Portlets e Services definindo os próprios pontos de extensão, com anotações, se beneficiando de todo o ciclo de vida OSGi... Marketplace! Ênfase em expor a API e esconder as implementações: melhores testes + abre as portas para remoting
  • 29. Deployable WAR clássico em app server WAR, para os app servers - mesmo só serviços e temas sem web context Deploy Liferay dependente da implementação de deploy de cada app server Especificação de portlets nem sequer define empacotamento e deploy "Damos o war, confiamos no app server para expor serviços na outra ponta" Novidades no Liferay 7: Hot deploy com OSGi Deployable JAR bundle em Liferay Portal OSGi Container Plugin simples JAR OSGi bundle - mesmo com portlets, web resources, JSP Deploy de plugins não atravessa mais o app server, apenas o container OSGi Em OSGi, o modelo de empacotamento e deploy é definido na especificação. Simples, direto e previsível.
  • 30. Novidades no Liferay 7: Escolha suas ferramentas Antes: plugin WAR obrigatoriamente construído via Liferay SDK (ou Maven, sob limites) Agora: plugin OSGi bundle é um simples JAR, dispensando o Liferay SDK. Ant, Maven, Gradle, Eclipse, IntelliJ... ou a tecnologia de sua preferência! Repositório público de artefatos Liferay para resolução de dependências (Releases, oportunamente dev snapshots)
  • 31. Novidades no Liferay 7: A Modular Liferay Desde sempre, destaque do Liferay Portal: grande variedade de features "out of the box" Mas com isso... distribuição padrão "all or nothing" Para Liferay 7+: Lightweight core Em andamento: extração massiva de módulos "presos" no core Polls, Bookmarks, Currency, Web Proxy, Iframe, Blogs... Download do Liferay Portal básico será bem menor... Implantações enxutas... com os componentes que você escolher.
  • 32. Para saber mais: http://www.osgi.org/Technology/HowOSGi Liferay dev.life broadcast: http://youtu.be/KPjmB5yj8Og http://youtu.be/NB3jAh_FhuI Liferay Developer Blogs: https://www.liferay.com/web/raymond.auge/blog Welcome to a modular future :-) andre.oliveira@liferay.com @arbocombr @Liferay_BR #SymposiumBrazil