当前位置: 首页 > 知识库问答 >
问题:

当我的插件部署到Liferay时,我如何运行一些操作?

薛文斌
2023-03-14

当我的插件(portlet、钩子或主题)在Liferay中可用时,我想尽快运行一些代码

liferay插件包中,我找不到类似启动侦听器的东西。xmlliferay portlet。xmlliferay hook。xmlliferay外观。xml

共有2个答案

谭成业
2023-03-14

如果你的插件中有一个portlet,你可以在Portlet.init(PortletConfig)中运行代码。

但这并不总是可能的,因为

  • 你没有portlet
  • 您没有自己的portlet实现(例如,因为您使用JSF)
  • 代码不属于任何portlet,您不希望将其随机添加到其中一个portlet中

在这种情况下,您还有两个选择:

创建一个为每个门户实例调用的启动操作(参见gevatterjan的答案)。如果需要为每个门户实例运行代码,这是最好的解决方案。

或者使用ServletContextListenerPortalLifecycle的组合,该组合在插件可用时启动一次。如果您只想运行一次,例如创建计划程序或替换Liferay钩子未包含的Liferay函数,这是最佳解决方案。xmlresp<代码>门户。属性。

@WebListener
public class MyStartupListener implements ServletContextListener, PortalLifecycle {

    @Override
    public void contextInitialized(final ServletContextEvent sce) {
        // Wait until the portal is ready
        PortalLifecycleUtil.register(this, PortalLifecycle.METHOD_INIT);
    }

    @Override
    public void portalInit() {
        // Here comes our initialization code
        ...
    }

    @Override
    public void contextDestroyed(final ServletContextEvent event) {
        // Here comes our uninitialization code, if any
        ...
    }

    @Override
    public void portalDestroy() {
        // Ignore
    }

}

可以调用任何Liferay函数,但要小心:

您的线程未连接到任何请求-没有当前的门户实例(Company)、站点(Group)、页面(Layout)或用户。您可以使用适当的*ServiceLocalUtil函数找到所有这些。对于某些操作,您需要在CompanyThreadLocalPricipalThreadLocalPermissionThreadLocal中为线程设置这些值。

戴鸿羲
2023-03-14

还有另一种方法。你可以利用StartupAction。它只是一个事件,每次启动插件都会触发它。此方法仅在服务器启动或部署时触发一次。要知道,doRun方法get是一个companyID的字符串数组作为参数。companyId表示门户实例(Liferay内部实例,而不是另一个应用程序服务器)

例如,我有一个portlet,我依赖于一些自定义字段来存在。所以我有这个整洁的小类:

package de.osc.kaleositeaddon.startup;

import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;

public class StartupAction extends SimpleAction {

    @Override
    public void run(String[] companyIds) throws ActionException {
        setupExpandoAction.run(companyIds);
        importMessagesAction.run(companyIds);
    }

    private SetupExpandoAction setupExpandoAction = new SetupExpandoAction();
    private ImportMessagesAction importMessagesAction = new ImportMessagesAction();
}

而SetupExpandoAction是:

package de.osc.kaleositeaddon.startup;

import com.liferay.portal.kernel.events.ActionException;
import com.liferay.portal.kernel.events.SimpleAction;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.ResourceConstants;
import com.liferay.portal.model.Role;
import com.liferay.portal.model.RoleConstants;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
import com.liferay.portal.service.RoleLocalServiceUtil;
import com.liferay.portlet.expando.DuplicateColumnNameException;
import com.liferay.portlet.expando.DuplicateTableNameException;
import com.liferay.portlet.expando.model.ExpandoColumn;
import com.liferay.portlet.expando.model.ExpandoColumnConstants;
import com.liferay.portlet.expando.model.ExpandoTable;
import com.liferay.portlet.expando.model.ExpandoTableConstants;
import com.liferay.portlet.expando.service.ExpandoColumnLocalServiceUtil;
import com.liferay.portlet.expando.service.ExpandoTableLocalServiceUtil;
import com.liferay.portlet.journal.model.JournalArticle;

import de.osc.kaleositeaddon.service.constants.ExpandoConstants;

public class SetupExpandoAction extends SimpleAction {

    @Override
    public void run(String[] companyIds) throws ActionException {
        for (int i = 0; i < companyIds.length; i++) {
            long companyId = Long.parseLong(companyIds[i]);
            try {
                setupExpandoGroup(companyId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    protected void setupExpandoGroup(long companyId) throws Exception {
        ExpandoTable table = null;
        try {
            table = ExpandoTableLocalServiceUtil.addTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
        } catch (DuplicateTableNameException dtne) {
            table = ExpandoTableLocalServiceUtil.getTable(companyId, Group.class.getName(), ExpandoTableConstants.DEFAULT_TABLE_NAME);
        }
        /*
         * Setup StartDate
         */
        try {
            ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
                    ExpandoConstants.EXPANDO_COLUMN_NAME_START_DATE, ExpandoColumnConstants.DATE);
            column.setDefaultData("");
            Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
            ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
                    String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
        }
        catch (DuplicateColumnNameException dcne) {
        }
        /*
         * Setup EndDate
         */
        try {
            ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
                    ExpandoConstants.EXPANDO_COLUMN_NAME_END_DATE, ExpandoColumnConstants.DATE);
            column.setDefaultData("");
            Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
            ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
                    String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
        }
        catch (DuplicateColumnNameException dcne) {
        }


        try {
            ExpandoColumn column = ExpandoColumnLocalServiceUtil.addColumn(table.getTableId(),
                    ExpandoConstants.EXPANDO_COLUMN_NAME_CREATE_DATE, ExpandoColumnConstants.DATE);
            column.setDefaultData("");
            Role user = RoleLocalServiceUtil.getRole(companyId, RoleConstants.GUEST);
            ResourcePermissionLocalServiceUtil.setResourcePermissions(companyId, ExpandoColumn.class.getName(), ResourceConstants.SCOPE_INDIVIDUAL,
                    String.valueOf(column.getColumnId()), user.getRoleId(), new String[] { ActionKeys.VIEW});
        }
        catch (DuplicateColumnNameException dcne) {
        }

    }

}

在您的liferay-hook.xml文件中,您执行以下操作:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.0.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_0_0.dtd">

<hook>
    <portal-properties>portal.properties</portal-properties>        
</hook>

在门户网站上。添加此行的属性:

application.startup.events=de.osc.kaleositeaddon.startup.StartupAction

记住替换类名;)

 类似资料:
  • 我有一个jenkins构建管道,其中第一个作业调用mvn clean包来编译和构建我的java项目。工件随后被复制到一组测试作业中,以确保构建的质量。链中的最后一个作业应该将工件部署到我的nexus存储库中。 我现在的问题是,当我只有Maven的最后一个jar myProject-1.2.0-snapshot.jar时,我如何将文件部署到nexus? 我试过了 但是这个插件需要获得关于groupI

  • 问题内容: 在尝试将新的portlet安装到在Glassfish域上运行的Liferay时遇到了问题。我最近很清楚流程,也想与他人分享。所以,请阅读答案,希望这对某人有帮助:) (此问题的先决条件是,我知道添加在 Glassfish 上运行的项目是通过autodeploy文件夹完成的,但是使它们在 Liferay上 可见则是另一回事了。) 问题答案: 因此,您首先创建一个.war文件,让我们说一个

  • 在运行时是否可以获得my war的maven deploy插件在运行时生成的完整工件版本/内部版本号? 如果maven进程生成并打包了一个包含值的属性文件,就可以了。 请记住,我的项目为每个部署生成唯一的(有时间戳的)工件版本。

  • 我按照下一页上的说明将primefaces jar库转换为OSGi插件,并将其添加为OSGi捆绑包中必需的插件之一。http://www.vogella.com/tutorials/EclipseJarToPlugin/article.html#jar-files-without-osgi-meta-data 然而,当我部署OSGi捆绑包,我<有限公司 这是我得到的堆栈跟踪,以防错误是由于其他原因

  • 我目前的目标是让gradle在我的机器上的Jetty实例中启动我的web应用程序,这样我就可以针对它编写Selenium测试。Gretty插件似乎正在加载,但我还没有找到任何关于如何创建和配置任务的实际说明。 部分问题是Gretty插件的不同版本和版本存在混淆。首先加载它是一个反复试验的过程。 我正在尝试使用Gradle 5.4.1和Gretty 2.3.1,我相信这是当前的版本(目前)。 我有三

  • 当我运行旧的android项目时,我得到一条错误消息: 应用插件:'com.google.gms.google-services' “警告:配置”编译“已过时,已被”实现“和”API“所取代。将于2018年底删除。有关详细信息,请参阅:http://d.android.com/r/tools/update-dependency-configurations.html受影响的模块:app”