Fermer

mai 14, 2018

Comment injecter des dépendances OSGi dans des portlets personnalisés dans Liferay 7 –


Cet article a été créé en partenariat avec Ktree . Merci de soutenir les partenaires qui rendent SitePoint possible.

Liferay 7 / DXP utilise le framework OSGi pour fournir un environnement de développement pour les applications modulaires. Récemment, nous avons utilisé cette fonctionnalité pour injecter la fonctionnalité du module standard de Liferay dans notre portlet personnalisé.

Nous y sommes parvenus en injectant des ressources wiki en tant que dépendances dans notre portlet personnalisé. Pour les besoins de cet article, nous allons utiliser un exemple de module personnalisé qui affiche une zone de texte, et nous allons injecter des éléments wiki sur l'écran.

Passons en revue quelques concepts avant de lancer le programme.

OSGi (Open Services Gateway Initiative) vous permet de diviser votre application en plusieurs modules, et donc de gérer plus facilement les dépendances croisées entre eux. Liferay utilise l'implémentation du conteneur OSGi de Equinox .

Les principaux avantages d'OSGi:

  • Vous pouvez installer, désinstaller, démarrer et arrêter dynamiquement différents modules de votre application sans redémarrer le conteneur. Votre application peut avoir plusieurs versions d'un même module exécutées en même temps.
  • OSGi fournit une très bonne infrastructure pour le développement d'applications orientées services, ainsi que d'applications Internet intégrées, mobiles et riches.

plus d'infos sur OSGi, consultez ces articles:

Liferay 7 / DXP supporte actuellement ces types de dépendance. C'est quelque chose que vous devez spécifier dans votre fichier build.gradle que vous allez faire à l'étape 1. Ce tutoriel se concentre uniquement sur 'Compile' et 'CompileOnly'

Compiler ]

Les dépendances requises pour compiler la source de production du projet. Comme vous pouvez le voir dans la dernière partie de cet article, pour cette dépendance, vous devez le configurer dans build.gradle et bnd.bnd .

CompileOnly

Dépendances requises au moment de la compilation, mais jamais requises lors de l'exécution. Comme les ressources wiki sont déjà dans le conteneur OSGi, nous utiliserons cette option. Ajouter ceci à build.gradle est suffisant

RunTime

Les dépendances requises par les classes de production lors de l'exécution. Par défaut, inclut également les dépendances de temps de compilation

Fourni

Dépendance dans la portée fournie nécessaire pour la compilation d'un projet, mais ne doit pas être distribuée avec celle-ci.

Avec le type de dépendance, nous devons spécifier quelques autres paramètres qui sont décrits ci-dessous:

  • groupe – typiquement, c'est le nom de votre organisation ou le nom du projet.
  • nom ] – le nom du projet
  • version – le numéro de version.
  • fileTree – pour fournir des dépendances du système de fichiers local.

Avec ces concepts sous la ceinture , nous sommes prêts à écrire du code, alors allumons votre Eclipse Liferay IDE

Étape 1: Créez le projet Liferay Workspace

Créez votre projet Liferay Workspace en suivant ce lien . ] Étape 2: Créer un module Liferay

Ceci construit le build.gradle . Editez build.gradle en ajoutant les dépendances à nos fins de développement. Voir l'exemple de code

Pour créer un module Liferay dans l'EDI, sélectionnez Fichier> Nouveau> Projet Module Liferay .

Exemple: Le build.gradle fichier

 dépendances {compileOnly groupe: "com.liferay", nom: "com.liferay.wiki.api", version: "2.1.0" groupe de compilation: 'org.jsoup', nom : 'jsoup', version: '1.8.3' groupe de compilation: 'commons-io', nom: 'commons-io', version: '2.0.1' groupe de compilation: "velocity-tools", nom: "vélocité- tools ", version:" 1.4 "groupe de compilation:" org.apache.velocity ", nom:" velocity ", version:" 1.6.4 "compile fileTree (dir:" lib ", inclut:" *. jar ")}

Note: Puisque ce paquetage ( com.liferay.wiki.api ) est déjà chargé dans le conteneur, nous devons utiliser l'option CompileOnly . 3: Modifier bnd.bnd

Modifier le fichier bnd.bnd en ajoutant les dépendances pour les dépendances Compiler . Eclipse aurait généré ce fichier automatiquement.

Exemple: bnd.bnd fichier

Nous pouvons inclure le pot de deux manières différentes, les deux options sont données ci-dessous. [19659003] Option 1:

* -includeresource:

Cet en-tête est utilisé pour ajouter des dépendances externes dans notre module. La syntaxe suivante extrait le fichier jar et ajoute des packages à notre module:

 -includeresource:  @jsoup-1.8.3.jar,  @ opencsv-2.2.jar,  @ commons-io-2.0.1.jar,  @ velocity- [0-9] *. pot,  @ velocity-tools- [0-9] *. pot

Option 2:

La syntaxe suivante ajoute les jars à notre module:

 -includeresource:  lib / jsoup.jar = jsoup-1.8.3.jar,  lib / opencsv.jar = opencsv-2.2.jar,  lib / velocity.jar = vitesse- [0-9] *. jar,  lib / velocity-tools.jar = outils-de-vitesse- [0-9] *.

Puisque nous avons fait com.liferay.wiki.api dans le fichier .gradle CompileOnly nous devons importer ces paquets en ajoutant ces deux lignes dans le fichier bnd.bnd . Si vous ne les ajoutez pas, bndtool va scanner le projet et l'ajouter au fichier manifeste.

 com.liferay.wiki.model; version = "[1.0.2)",
com.liferay.wiki.service; version = "[1.1,2)"

Étape 4: Exécutez Eclipse Build

Maintenant, exécutez Eclipse Build en utilisant le chemin eclipse-> Gradle Module -> . Eclipse a utilisé Bndtools pour générer le manifeste. Exemple de manifeste comme ci-dessous.

Accédez à la vue Gradle Task. Il répertorie tous les modules disponibles dans le projet d'espace de travail. Passez à Développez le projet> Construire> Construire .

Voici les directives ou les paramètres de l'en-tête bnd ajoutés automatiquement à manifest.mf .

Exemple généré Fichier manifest.mf [19659047] Manifest-Version: 1.0
Bnd-LastModifié: 1496664974738
Bundle-ManifestVersion: 2
Nom de l'ensemble: ktree_liferay_osgi_example
Bundle-SymbolicName: ktree_liferay_osgi_example
Bundle-Version: 1.0.0
Créé par: 1.8.0_131 (Oracle Corporation)
Import-Package: com.liferay.portal.kernel.exception; version = "[7.0,8)",
 com.liferay.portal.kernel.portlet.bridges.mvc; version = "[1.0.2)", com.l
 iferay.portal.kernel.service; version = "[1.0.2)", com.liferay.portal.ker
 nel.theme; version = "[1.0.2)", com.liferay.portal.kernel.util; version = "[
 7.0,8) ", com.liferay.wiki.model; version =" [1.0.2) ", com.liferay.wiki.ser
 vice; version = "[1.1.2)", javax.portlet; version = "[2.0.3)", javax.servlet,
 javax.servlet.http
Javac-Debug: sur
Javac-Deprecation: éteint
Javac-Encoding: UTF-8
Private-Package: com.ktree.portlet, contenu
Provide-Capability: osgi.service; objectClass: Liste = "javax.portl
 et.Portlet ", liferay.resource.bundle; bundle.symbolic.name = ktree_lifera
 y_osgi_example; resource.bundle.base.name = "content.Language"
Require-Capability: osgi.extender; filter: = "(& (osgi.extender = jsp.taglib
 ) (uri = http: //java.sun.com/portlet_2_0)), osgi.extender; filter: = "(& (os
 gi.extender = jsp.taglib) (uri = http: //liferay.com/tld/aui)), osgi.extend
 er; filter: = "(& (osgi.extender = jsp.taglib) (uri = http: //liferay.com/tld/p
 ortlet)) ", osgi.extender; filter: =" (& (osgi.extender = jsp.taglib) (uri = htt
 p: //liferay.com/tld/theme)), osgi.extender; filter: = "(& (osgi.extender =
 jsp.taglib) (uri = http: //liferay.com/tld/ui)), osgi.ee; filter: = "(& (osgi
 .ee = JavaSE) (version = 1.8)) "
Service-composant: OSGI-INF / com.ktree.portlet.KtreeLiferayOsgiPortlet.
 xml
Outil: Bnd-3.2.0.201605172007

Import-Package:
com.liferay.portal.kernel.exception; version = "[7.0,8)",
com.liferay.portal.kernel.portlet.bridges.mvc; version = "[1.0.2)",
com.liferay.portal.kernel.service; version = "[1.0.2)",
com.liferay.portal.kernel.theme; version = "[1.0,2)",
com.liferay.portal.kernel.util; version = "[7.0,8)",
javax.portlet; version = "[2.0.3)",
javax.servlet,
javax.servlet.http,
com.liferay.wiki.model; version = "[1.0.2)",
com.liferay.wiki.service; version = "[1.1,2)"

Export-Package: Cette directive dans l'en-tête bnd exporte les packages vers le conteneur OSGi, auquel les autres modules peuvent accéder. Par exemple:

 Export-Package: com.audit.esprocessor

Si le paquet est déjà exporté, nous n'avons pas besoin de le refaire – nous pouvons immédiatement utiliser l'option CompileOnly au lieu de Compiler dans build.gradle

Import-Package:

  • Cet en-tête bnd importe le module spécifié à l'exécution dans notre module
  • Chaque fois que nous importons un paquet, il doit être exporté par un autre module.
 Import-Package: 
com.audit.esprocessor; version = " 1.0.0 "

Dans le paquet d'importation, nous avons deux résolutions, à savoir:

  1. Obligatoire
  2. Facultatif

Obligatoire

  • Il s'agit de la résolution par défaut (lorsque la résolution n'est pas spécifiée pour l'importation). ] Le module sera dans un état actif si le paquet importé est disponible dans le conteneur, sinon le module sera dans un état installé.

Facultatif

  • Le module passera à l'état actif sans en fonction de la disponibilité du package d'importation.
  • Il déclenche une exception lors de l'exécution si le package importé n'est pas disponible dans le conteneur.
 Import-Package: 
com.audit.esprocessor; version = "1.0.0", 

Etape 5: Création du portlet Liferay MVC

La dernière étape consiste à créer un portlet Liferay MVC normal et à commencer à utiliser les dépendances.

Comme nous avons défini les dépendances dans Eclipse, nous devrions pouvoir choisir notre classe , que nous avons lié

 WikiPageLocalServiceUtil.addPage (themeDisplay.getUserId (), 123, "Premier Wiki", 1.0, htmlContent, "", false, "html", true, "FrontPage", "", nouveau ServiceContext ());

Veuillez vous reporter à la source de KtreeLiferayOsgiPortlet-> addContentToWiki .

 public class KtreeLiferayOsgiPortlet étend MVCPortlet {
    @ProcessAction (name = "addContentToWiki")
    public void addContentToWiki (ActionRequest demandeRequête, ActionResponse actionResponse) throws PortalException {
        String htmlContent = ParamUtil.getString (actionRequest, "wikiEditor");
        ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute (WebKeys.THEME_DISPLAY);
        WikiPageLocalServiceUtil.addPage (themeDisplay.getUserId (), 123, "Premier Wiki", 1.0, htmlContent, "", false, "html", true, "FrontPage", "", nouveau ServiceContext ());
        System.out.println (WikiPageLocalServiceUtil.getWikiPagesCount ());

    }
}

Exemple de module Liferay OSGi:

  • Ajout du wiki api comme dépendance de compilation avec compileOnly

  • L'interface utilisateur est construite avec aui composants.

  • L'interface utilisateur a des options pour créer une page wiki et affiche également la liste des pages wiki.

Exemple init.jsp

 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>
<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@ taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>






Exemple Voir.jsp

 <%@include file="init.jsp" %>

Entrez le contenu ici


Liste Wiki

    

Exemple de contrôleur – KtreeLiferayOsgiPortlet.java

 @Component (
    immédiat = vrai,
    propriété = {
        "com.liferay.portlet.display-category = KTree",
        "com.liferay.portlet.instanceable = true",
        "javax.portlet.display-name = Portlet de Ktree Liferay OSGI",
        "javax.portlet.init-param.template-path = /",
        "javax.portlet.init-param.view-template = / view.jsp",
        "javax.portlet.resource-bundle = content.Language",
        "javax.portlet.security-role-ref = utilisateur-utilisateur, utilisateur"
    },
    service = Portlet.class
)
Classe publique KtreeLiferayOsgiPortlet étend MVCPortlet {
    @ProcessAction (name = "addContentToWikiUrl")



    public void addHtmlToWikiPage (ActionRequest demandeRequête, ActionResponse actionResponse) throws PortalException {


        // ajoute la logique ici pour ajouter wikipage
    }
}




Source link