Liferay構件部署到web服務器上的命名

 現象:web

今天,同事有個問題問我,就是他建了一個Maven項目的portlet,名字叫inter-portlet-communication-test ,而後maven打包後,在$liferay_home下多了一個文件叫inter-portlet-communication-test-0.0.1-SNAPSHOT.war,tomcat

可是當運行時,這個構件到tomcat的webapp下的目錄名稱老是inter-portlet,並不顯示後面的communication-test,而且不管是改成inter-portlet1-communication-test仍是叫inter-portlet2-communication-test2都同樣。服務器

 

分析:app

爲了解決這個問題,咱們能夠斷點跟蹤分析:webapp

首先,由於咱們經過Mavenliferay:deploy命令將咱們的portlet構件部署到了$liferay_home/deploy目錄,因此這將觸發PortletAutoDeployListenerdeploy方法的執行:maven

  
  
           
  
  
  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行,咱們繼續跟進:ide

 

它會去調用PortletAutoDeployer類的autoDeploy(File file,String context)方法:this

  
  
           
  
  
  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方法:url

  
  
           
  
  
  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對象傳遞:spa

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目錄下建子目錄。

 

結束。

相關文章
相關標籤/搜索