Liferay构件部署到web服务器上的命名

简介:

 现象:

今天,同事有个问题问我,就是他建了一个Maven项目的portlet,名字叫inter-portlet-communication-test ,然后maven打包后,在$liferay_home下多了一个文件叫inter-portlet-communication-test-0.0.1-SNAPSHOT.war,

但是当运行时,这个构件到tomcat的webapp下的目录名称总是inter-portlet,并不显示后面的communication-test,并且无论是改为inter-portlet1-communication-test还是叫inter-portlet2-communication-test2都一样。

 

分析:

为了解决这个问题,我们可以断点跟踪分析:

首先,因为我们通过Mavenliferay:deploy命令将我们的portlet构件部署到了$liferay_home/deploy目录,所以这将触发PortletAutoDeployListenerdeploy方法的执行:


  
  
  1. public void deploy(File file, String context) throws AutoDeployException { 
  2.         if (_log.isDebugEnabled()) { 
  3.             _log.debug("Invoking deploy for " + file.getPath()); 
  4.         } 
  5.  
  6.         AutoDeployer deployer = null
  7.  
  8.         if (isMatchingFile( 
  9.                 file, "WEB-INF/" + Portal.PORTLET_XML_FILE_NAME_STANDARD)) { 
  10.  
  11.             deployer = _autoDeployer; 
  12.         } 
  13.        ...
  14.  
  15.         if (_log.isInfoEnabled()) { 
  16.             _log.info("Copying portlets for " + file.getPath()); 
  17.         } 
  18.  
  19.         if (_log.isDebugEnabled()) { 
  20.             _log.debug("Using deployer " + deployer.getClass().getName()); 
  21.         } 
  22.  
  23.         deployer.autoDeploy(file, context); 
  24.  
  25.         if (_log.isInfoEnabled()) { 
  26.             _log.info( 
  27.                 "Portlets for " + file.getPath() + " copied successfully. " + 
  28.                     "Deployment will start in a few seconds."); 
  29.         } 
  30.     } 

因为我们的构件中有portlet.xml,所以满足08-09行的条件,然后会打印日志,接着执行第23行,我们继续跟进:

 

它会去调用PortletAutoDeployer类的autoDeploy(File file,String context)方法:


  
  
  1. public void autoDeploy(File file, String context) 
  2.         throws AutoDeployException { 
  3.  
  4.         List<String> wars = new ArrayList<String>(); 
  5.  
  6.         wars.add(file.getName()); 
  7.  
  8.         this.wars = wars; 
  9.  
  10.         try { 
  11.             deployFile(file, context); 
  12.         } 
  13.         catch (Exception e) { 
  14.             throw new AutoDeployException(e); 
  15.         } 
  16.     } 

 

然后在第11行调用父类BaseDeployerdeployFile方法:


  
  
  1. public void deployFile(File srcFile, String specifiedContext) 
  2.         throws Exception { 
  3.  
  4.         PluginPackage pluginPackage = readPluginPackage(srcFile); 
  5.  
  6.        ..

 

这个会在方法的首行调用BaseDeployerreadPluginPackage方法,并且把我们的放在$liferay_home/deployer的war包封装一个File对象传递:

readPluginPackage方法如下:


  
  
  1. public PluginPackage readPluginPackage(File file) { 
  2.         if (!file.exists()) { 
  3.             return null
  4.         } 
  5.  
  6.         InputStream is = null
  7.         ZipFile zipFile = null
  8.  
  9.         try { 
  10.             boolean parseProps = false
  11.  
  12.             if (file.isDirectory()) { 
  13.               ...
  14.             } 
  15.             else { 
  16.                 zipFile = new ZipFile(file); 
  17.  
  18.                 File pluginPackageXmlFile = new File( 
  19.                     file.getParent() + "/merge/" + file.getName() + 
  20.                         "/WEB-INF/liferay-plugin-package.xml"); 
  21.  
  22.                 if (pluginPackageXmlFile.exists()) { 
  23.                     is = new FileInputStream(pluginPackageXmlFile); 
  24.                 } 
  25.                 else { 
  26.                     ZipEntry zipEntry = zipFile.getEntry( 
  27.                         "WEB-INF/liferay-plugin-package.xml"); 
  28.  
  29.                     if (zipEntry != null) { 
  30.                         is = zipFile.getInputStream(zipEntry); 
  31.                     } 
  32.                 } 
  33.  
  34.                 File pluginPackagePropertiesFile = new File( 
  35.                     file.getParent() + "/merge/" + file.getName() + 
  36.                         "/WEB-INF/liferay-plugin-package.properties"); 
  37.  
  38.                 if ((is == null) && pluginPackagePropertiesFile.exists()) { 
  39.                     is = new FileInputStream(pluginPackagePropertiesFile); 
  40.  
  41.                     parseProps = true
  42.                 } 
  43.                 else { 
  44.                     ZipEntry zipEntry = zipFile.getEntry( 
  45.                         "WEB-INF/liferay-plugin-package.properties"); 
  46.  
  47.                     if ((is == null) && (zipEntry != null)) { 
  48.                         is = zipFile.getInputStream(zipEntry); 
  49.  
  50.                         parseProps = true
  51.                     } 
  52.                 } 
  53.             } 
  54.  
  55.             if (is == null) { 
  56.                 if (_log.isInfoEnabled()) { 
  57.                     _log.info( 
  58.                         file.getPath() + " does not have a " + 
  59.                             "WEB-INF/liferay-plugin-package.xml or " + 
  60.                                 "WEB-INF/liferay-plugin-package.properties"); 
  61.                 } 
  62.  
  63.                 return null
  64.             } 
  65.  
  66.             if (parseProps) { 
  67.                 String displayName = getDisplayName(file); 
  68.  
  69.                 String propertiesString = StringUtil.read(is); 
  70.  
  71.                 Properties properties = PropertiesUtil.load(propertiesString); 
  72.  
  73.                 return PluginPackageUtil.readPluginPackageProperties( 
  74.                     displayName, properties); 
  75.             } 
  76.             else { 
  77.                 String xml = StringUtil.read(is); 
  78.  
  79.                 xml = XMLFormatter.fixProlog(xml); 
  80.  
  81.                 return PluginPackageUtil.readPluginPackageXml(xml); 
  82.             } 
  83.         } 
  84.         catch (Exception e) { 
  85.             _log.error(file.getPath() + ": " + e.toString()); 
  86.         } 
  87.         finally { 
  88.            ...
  89.         } 
  90.  
  91.         return null
  92.     } 

 

因为我们在$liferay_home/deploy目录下的是一个war包而不是一个目录,所以执行第15行开始的else分支,而且我们提供的liferay-plugin-package.properties文件而不是xml文件,所以执行第43行开始的else分支,它用来解析liferay-plugin-package.properties文件。

 

最终,它在第73行中调用PluginPackageUtilreadPluginPackageProperties方法,进而会调用私有的_readPluginPackageProperties方法,我们继续跟进:


  
  
  1. private PluginPackage _readPluginPackageProperties( 
  2.         String displayName, Properties properties) { 
  3.  
  4.         int pos = displayName.indexOf("-portlet"); 
  5.  
  6.         String pluginType = Plugin.TYPE_PORTLET; 
  7.  
  8.         if (pos == -1) { 
  9.             pos = displayName.indexOf("-ext"); 
  10.  
  11.             pluginType = Plugin.TYPE_EXT; 
  12.         } 
  13.  
  14.         if (pos == -1) { 
  15.             pos = displayName.indexOf("-hook"); 
  16.  
  17.             pluginType = Plugin.TYPE_HOOK; 
  18.         } 
  19.  
  20.         if (pos == -1) { 
  21.             pos = displayName.indexOf("-layouttpl"); 
  22.  
  23.             pluginType = Plugin.TYPE_LAYOUT_TEMPLATE; 
  24.         } 
  25.  
  26.         if (pos == -1) { 
  27.             pos = displayName.indexOf("-theme"); 
  28.  
  29.             pluginType = Plugin.TYPE_THEME; 
  30.         } 
  31.  
  32.         if (pos == -1) { 
  33.             pos = displayName.indexOf("-web"); 
  34.  
  35.             pluginType = Plugin.TYPE_WEB; 
  36.         } 
  37.  
  38.         if (pos == -1) { 
  39.             return null
  40.         } 
  41.  
  42.         String displayPrefix = displayName.substring(0, pos); 
  43.  
  44.         String moduleGroupId = GetterUtil.getString( 
  45.             properties.getProperty("module-group-id")); 
  46.         String moduleArtifactId = displayPrefix + "-" + pluginType; 
  47.  
  48.         String moduleVersion = null
  49.  
  50.         int moduleVersionPos = pos + pluginType.length() + 2
  51.  
  52.         if (displayName.length() > moduleVersionPos) { 
  53.             moduleVersion = displayName.substring(moduleVersionPos); 
  54.         } 
  55.         else { 
  56.             moduleVersion = ReleaseInfo.getVersion(); 
  57.         } 
  58.  
  59.         String moduleId = 
  60.             moduleGroupId + "/" + moduleArtifactId + "/" + moduleVersion + 
  61.                 "/war"
  62.  
  63.         String pluginName = GetterUtil.getString( 
  64.             properties.getProperty("name")); 
  65.  
  66.         String deploymentContext = GetterUtil.getString( 
  67.             properties.getProperty("recommended-deployment-context"), 
  68.             moduleArtifactId); 
  69.  
  70.         String author = GetterUtil.getString(properties.getProperty("author")); 
  71.  
  72.         List<String> types = new ArrayList<String>(); 
  73.  
  74.         types.add(pluginType); 
  75.  
  76.         List<License> licenses = new ArrayList<License>(); 
  77.  
  78.         String[] licensesArray = StringUtil.split( 
  79.             properties.getProperty("licenses")); 
  80.  
  81.         for (int i = 0; i < licensesArray.length; i++) { 
  82.             License license = new License(); 
  83.  
  84.             license.setName(licensesArray[i].trim()); 
  85.             license.setOsiApproved(true); 
  86.  
  87.             licenses.add(license); 
  88.         } 
  89.  
  90.         List<String> liferayVersions = new ArrayList<String>(); 
  91.  
  92.         String[] liferayVersionsArray = StringUtil.split( 
  93.             properties.getProperty("liferay-versions")); 
  94.  
  95.         for (String liferayVersion : liferayVersionsArray) { 
  96.             liferayVersions.add(liferayVersion.trim()); 
  97.         } 
  98.  
  99.         if (liferayVersions.size() == 0) { 
  100.             liferayVersions.add(ReleaseInfo.getVersion() + "+"); 
  101.         } 
  102.  
  103.         List<String> tags = new ArrayList<String>(); 
  104.  
  105.         String[] tagsArray = StringUtil.split(properties.getProperty("tags")); 
  106.  
  107.         for (String tag : tagsArray) { 
  108.             tags.add(tag.trim()); 
  109.         } 
  110.  
  111.         String shortDescription = GetterUtil.getString( 
  112.             properties.getProperty("short-description")); 
  113.         String longDescription = GetterUtil.getString( 
  114.             properties.getProperty("long-description")); 
  115.         String changeLog = GetterUtil.getString( 
  116.             properties.getProperty("change-log")); 
  117.         String pageURL = GetterUtil.getString( 
  118.             properties.getProperty("page-url")); 
  119.         String downloadURL = GetterUtil.getString( 
  120.             properties.getProperty("download-url")); 
  121.  
  122.         PluginPackage pluginPackage = new PluginPackageImpl(moduleId); 
  123.  
  124.         pluginPackage.setName(pluginName); 
  125.         pluginPackage.setRecommendedDeploymentContext(deploymentContext); 
  126.         //pluginPackage.setModifiedDate(null); 
  127.         pluginPackage.setAuthor(author); 
  128.         pluginPackage.setTypes(types); 
  129.         pluginPackage.setLicenses(licenses); 
  130.         pluginPackage.setLiferayVersions(liferayVersions); 
  131.         pluginPackage.setTags(tags); 
  132.         pluginPackage.setShortDescription(shortDescription); 
  133.         pluginPackage.setLongDescription(longDescription); 
  134.         pluginPackage.setChangeLog(changeLog); 
  135.         //pluginPackage.setScreenshots(null); 
  136.         pluginPackage.setPageURL(pageURL); 
  137.         pluginPackage.setDownloadURL(downloadURL); 
  138.         //pluginPackage.setDeploymentSettings(null); 
  139.  
  140.         return pluginPackage; 
  141.     } 

 

从这里我们就一目了然了,它会先获取displayName中"-portlet"的下标,然后获得第42行获取这个下标前面的部分作为displayPrefix,然后46行用这个displayPrefix加上短横"-"加上pluginType(在第06行被解析,为字符串"portlet"),这3个字符串连接作为最终的moduleArtifactId. 按照我们的例子,我们的displayNameinter-portlet-communication-test,所以displayPrefix就是"inter",所以最后和'-'还有'portlet'拼接来来的字符串就是'inter-portlet',这也可以解释为什么不显示后面的communication-test,和为什么吧portlet改为portlet1,其结果不变的原因。

 

最后,当我们在这里获得了moduleArtifactId之后,在第66行设给字符串deploymentContext, 然后在第125行设置给字符串变量recommendedDeploymentContext,然后这就是我们期望的, 所以最终web服务器会用这个字符串的值在webapps目录下建子目录。

 

结束。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/924806,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
弹性计算 监控 负载均衡
|
2月前
|
监控 安全 Linux
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第18天】在RHEL环境下部署Subversion服务器需依次完成安装Subversion、创建版本库、配置服务器、启动服务、客户端连接及备份维护等步骤。确保遵循安全最佳实践,保障数据安全。
119 1
|
1月前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
1月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
48 3
|
1月前
|
NoSQL 容灾 MongoDB
MongoDB主备副本集方案:两台服务器使用非对称部署的方式实现高可用与容灾备份
在资源受限的情况下,为了实现MongoDB的高可用性,本文探讨了两种在两台服务器上部署MongoDB的方案。方案一是通过主备身份轮换,即一台服务器作为主节点,另一台同时部署备节点和仲裁节点;方案二是利用`priority`设置实现自动主备切换。两者相比,方案二自动化程度更高,适合追求快速故障恢复的场景,而方案一则提供了更多的手动控制选项。文章最后对比了这两种方案与标准三节点副本集的优缺点,指出三节点方案在高可用性和数据一致性方面表现更佳。
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
1月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
2月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
470 3
|
2月前
|
NoSQL Linux PHP
|
2月前
|
弹性计算 数据库连接 Nacos
阿里云ECS服务器在docker中部署nacos
docker pull nacos 失败,docker部署nacos遇到的问题,nacos数据库连接,nacos端口映射
193 1