当我的插件(portlet、钩子或主题)在Liferay中可用时,我想尽快运行一些代码。
在liferay插件包中,我找不到类似启动侦听器的东西。xml
,liferay portlet。xml
,liferay hook。xml
或liferay外观。xml
。
如果你的插件中有一个portlet,你可以在Portlet.init(PortletConfig)
中运行代码。
但这并不总是可能的,因为
在这种情况下,您还有两个选择:
创建一个为每个门户实例调用的启动操作(参见gevatterjan的答案)。如果需要为每个门户实例运行代码,这是最好的解决方案。
或者使用ServletContextListener
和PortalLifecycle
的组合,该组合在插件可用时启动一次。如果您只想运行一次,例如创建计划程序或替换Liferay钩子未包含的Liferay函数,这是最佳解决方案。xml
resp<代码>门户。属性。
@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
函数找到所有这些。对于某些操作,您需要在CompanyThreadLocal
、PricipalThreadLocal
和PermissionThreadLocal
中为线程设置这些值。
还有另一种方法。你可以利用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”