[Java][Liferay] 解决Liferay ext项目deploy的问题
Liferay ext project在install war包之后需要重启服务器,重启服务器中会执行ExtHotDeployListener中的逻辑,这里有一个坑,如果是第二次以后install ext war包,会发现新修改的文件不起作用,原因如下
ExtHotDeployListener.java
protected void doInvokeDeploy(HotDeployEvent hotDeployEvent)
throws Exception {
ServletContext servletContext = hotDeployEvent.getServletContext();
String servletContextName = servletContext.getServletContextName();
if (_log.isDebugEnabled()) {
_log.debug("Invoking deploy for " + servletContextName);
}
String xml = HttpUtil.URLtoString(
servletContext.getResource(
"/WEB-INF/ext-" + servletContextName + ".xml"));
if (xml == null) {
return;
}
if (_log.isInfoEnabled()) {
_log.info(
"Registering extension environment for " + servletContextName);
}
/*
* Ext 项目在重启tomcat的时候会checkd liferay-portal/tomcat-xxx/webapps/ROOT/WEB-INF/ext-project-***-ext.xml是否存在
* 如果存在,就不执行后面的逻辑,也就不会执行installExt(***),那么也不会重新拷贝替换的文件
*
*/
if (ExtRegistry.isRegistered(servletContextName)) {
if (_log.isInfoEnabled()) {
_log.info(
"Extension environment for " + servletContextName +
" has been applied.");
}
return;
}
Map<String, Set<String>> conflicts = ExtRegistry.getConflicts(
servletContext);
if (!conflicts.isEmpty()) {
StringBundler sb = new StringBundler();
sb.append(
"Extension environment for " + servletContextName +
" cannot be applied because of detected conflicts:");
for (Map.Entry<String, Set<String>> entry : conflicts.entrySet()) {
String conflictServletContextName = entry.getKey();
Set<String> conflictFiles = entry.getValue();
sb.append("\n\t");
sb.append(conflictServletContextName);
sb.append(":");
for (String conflictFile : conflictFiles) {
sb.append("\n\t\t");
sb.append(conflictFile);
}
}
_log.error(sb.toString());
return;
}
installExt(servletContext, hotDeployEvent.getContextClassLoader());
FileAvailabilityUtil.reset();
if (_log.isInfoEnabled()) {
_log.info(
"Extension environment for " + servletContextName +
" has been applied. You must reboot the server and " +
"redeploy all other plugins.");
}
}
xxx-ext.xml格式如下
<ext-info>
<servlet-context-name>hsf-plugins-shared-ext</servlet-context-name>
<files>
<file>xxxx-ext.xml</file>
<file>ext-impl/classes/com/liferay/portal/action/xxx.class</file>
....
<file>ext-web/docroot/html/js/xxx.js</file>
<file>web.xml</file>
</files>
</ext-info>
解决方案
1>. 去除掉doInvokeDeploy中这段逻辑,不管是否包含ext-project-***-ext.xml都执行install
if (ExtRegistry.isRegistered(servletContextName)) {
if (_log.isInfoEnabled()) {
_log.info(
"Extension environment for " + servletContextName +
" has been applied.");
}
return;
}
2>. 在第二次install ext project war包之后需要删除liferay-portal/tomcat-xxx/webapps/ROOT/WEB-INF/ext-project-***-ext.xml,然后重启tomcat
[Java][Liferay] 解决Liferay ext项目deploy的问题的更多相关文章
- 十六、myeclipse导入别人项目报错java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServle异常
问题原因:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServle异常 我是把别人的源码项目直接导 ...
- 错误处理:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
部署项目时,启动Tomcat一直出错:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter SEVE ...
- 2016-2017-2 《Java 程序设计》课堂实践项目
目录 基本工具 基础内容 Hello World 和 模块分解 数组的使用 命令行参数 递归 分支语句 String类的使用 类的定义与测试 多态 IO与异常 数据库 网络与安全 数据结构应用 And ...
- 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...
- 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
码云链接 https://gitee.com/A5320/pair_programming_code 需求分析 实现一个命令行程序,要求: 1.自动生成小学四则运算题目(加.减.乘.除) 2.支持整数 ...
- 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结
20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...
- 《Java 程序设计》课堂实践项目 课后学习总结
<Java 程序设计>课堂实践项目 课后学习总结 String类的使用(sort) 目录 Linux命令(sort) 课堂实践 课后思考 学习老师的代码之后的思考:int与Integer ...
- JAVA面向对象编程课程设计——项目部署
目录 一.Java环境的安装 1.下载 2.安装 3.配置环境变量 二.Tomcat的安装 1.下载 2.安装 3.启动Tomcat(默认已经安装好java环境,如果未安装java会报错.) 三.My ...
- 20155308 2016-2017-2《Java程序设计》课堂实践项目
20155308 2016-2017-2<Java程序设计>课堂实践项目 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅 ...
随机推荐
- javascript之模拟块级作用域
在java.C++等语言中,变量i在会在for循环的语句块中定义,循环一旦结束,变量i就会被销毁.可是在javaScript中,从定义开始,就可以在函数内部随处访问.比如 function outpu ...
- new/delete 和malloc/free 的区别
new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumB ...
- 关于C/C++中的“auto”关键字
C/C++ 98标准 C++03标准 早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期.此用法是多余的,因为即使定义变量时不加" ...
- storm定时器timer源码分析-timer.clj
storm定时器与java.util.Timer定时器比较相似.java.util.Timer定时器实际上是个线程,定时调度所拥有的TimerTasks:storm定时器也有一个线程负责调度所拥有的& ...
- TMF接口标准MTOSI演进路线图
下图为TMF接口标准MTOSI的演进路线图.MTOSI 2.1基于mTOP框架制定,MTOSI 3.0->MTOSI 4.0->MTOSI 5.0将逐步基于全新的TIP框架实现.例如,MT ...
- Ubuntu tar 解压缩命令详解
tar 解压缩命令详解: -c: 建立压缩档案 -x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只 ...
- 使用Django创建一个后端是SQLSERVER的简单系统(一)Django连接SQLServer数据库
window环境下Django连接SQLSERVER, 1.创建项目: 2.创建application: 3.使用pycharm打开项目,如下图: 4.配置虚拟环境: 安装Django\pyodbc\ ...
- Java学习笔记(一)语法
基本语法 大小写敏感 类名:对于所有的类来说,类名的首字母应该大写 方法名:所有的方法名都应该以小写字母开头.如果方法名含有若干单词,则后面的每个单词首字母大写. 源文件名:源文件名必须和类名相同.当 ...
- 【并发编程】Future模式添加Callback及Promise 模式
Future Future是Java5增加的类,它用来描述一个异步计算的结果.你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果.你也可以使用 ...
- svg动画 animate
最近使用到svg的动画animate,简单总结下animate的主要属性: 1.定义:SVG 的animate 动画元素放在形状元素的内部,用来定义一个元素的某个属性如何踩着时点改变.在指定持续时间里 ...