null

Liferay 6 и портлеты на PHP

Как известно, Liferay Portal поддерживает возможность развёртывания портлетов, написанных на языках программирования, отличных от Java. В частности, есть возможность создания портлетов на PHP.

В теории, всё просто: берём наш PHP-код, упаковываем его в zip-архив и развёртываем на портале аналогично обычныму war-файлу портлета - либо через веб-интерфейс, либо копированием в директорию автоматического развёртывания портала. Как это ни странно, в предыдущих версиях портала такой механизм действительно работал, в силу чего появлялась замечательная возможность использовать некоторые старые PHP-приложения без необходимости их переписывания на Java.

В связи с назревшей необходимостью миграции на актуальную версию портала - Liferay 6, я попытался развернуть наш PHP-портлет на нём - но, как выяснилось, не тут-то было:

[#|2011-01-13T23:54:26.373+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=20;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|23:54:26,
372 INFO  [AutoDeployDir:167] Processing money2text.zip
|#]

[#|2011-01-13T23:54:26.623+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=20;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|23:54:26,
620 ERROR [AutoDeployDir:197] com.liferay.portal.kernel.deploy.auto.AutoDeployException: java.net.UnknownHostException: cdn.files.liferay.com
com.liferay.portal.kernel.deploy.auto.AutoDeployException: java.net.UnknownHostException: cdn.files.liferay.com
        at com.liferay.portal.deploy.auto.PHPPortletAutoDeployer.<init>(PHPPortletAutoDeployer.java:45)
        at com.liferay.portal.deploy.auto.PortletAutoDeployListener.getPhpDeployer(PortletAutoDeployListener.java:97)
        at com.liferay.portal.deploy.auto.PortletAutoDeployListener.deploy(PortletAutoDeployListener.java:52)
        at com.liferay.portal.kernel.deploy.auto.AutoDeployDir.processFile(AutoDeployDir.java:180)
        at com.liferay.portal.kernel.deploy.auto.AutoDeployDir.scanDirectory(AutoDeployDir.java:221)
        at com.liferay.portal.kernel.deploy.auto.AutoDeployScanner.run(AutoDeployScanner.java:49)
Caused by: java.net.UnknownHostException: cdn.files.liferay.com
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:240)
        at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80)
        at org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory$1.doit(ControllerThreadSocketFactory.java:91)
        at org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory$SocketTask.run(ControllerThreadSocketFactory.java:158)
        at java.lang.Thread.run(Thread.java:619)
|#]

[#|2011-01-13T23:54:36.632+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=20;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|23:54:36,
632 INFO  [AutoDeployDir:172] Processing money2text.zip. This is attempt 2.
|#]
...

И так далее, до благополучного добавления портлета в "чёрный" список. Как видим, при развёртывании нашего портлета портал упорно, но безуспешно пытается проломиться на хост http://cdn.liferay.com. OK, вбиваем эту строчку из стектрейса в гугл и, на наше счастье, уже первым результатом выдачи получаем ссылку на интересный монолог в форуме Liferay. Как выяснилось, мы не первые, кто столкнулся с этой проблемой, причём, не дождавшись ответа, наши "собратья по несчастью" смогли разрешить её самостоятельно.

В итоге, проблема состоит в следующем. Для обеспечения работы PHP-кода Liferay использует известную библиотеку Quercus, представляющую собой реализацию PHP на Java. Несмотря на необходимость этой библиотеки для работоспособности PHP-портлетов, в составе Liferay она изначально отсутствует, и портал пытается загрузить её в момент установки портлета. Проблема в том, что хост http://cdn.liferay.com, на котором раньше лежала эта библиотека, больше не существует, а все дополнительные файлы "переехали" на http://files.liferay.com. При этом, разработчики портала об этом благополучно "забыли", и он продолжает ломиться на старый хост.

Решение проблемы на этот раз оказалось очень простым - достаточно открыть конфигурационный файл портала (portal-ext.properties), и добавить в него следующие 3 строчки:

library.download.url.quercus.jar=http://files.liferay.com/public/quercus/3.1.9/quercus.jar
library.download.url.resin-util.jar=http://files.liferay.com/public/quercus/3.1.9/resin-util.jar
library.download.url.script-10.jar=http://files.liferay.com/public/quercus/3.1.9/script-10.jar

После этого необходимые зависимости загрузились с правильного URL и портлет был успешно развёрнут:

[#|2011-01-14T00:10:50.930+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|00:10:50,927 INFO  [AutoDeployDir:167] Processing money2text.zip
|#]

[#|2011-01-14T00:11:01.417+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|00:11:01,417 INFO  [PortletAutoDeployListener:71] Copying portlets for /opt/deploy/money2text.zip
|#]

[#|2011-01-14T00:11:03.015+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|  Expanding: /opt/deploy/money2text.zip into /var/tmp/20110114241101423|#]

[#|2011-01-14T00:11:03.326+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF/classes|#]

[#|2011-01-14T00:11:03.328+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF/classes|#]

[#|2011-01-14T00:11:03.335+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF|#]

[#|2011-01-14T00:11:03.360+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF|#]

[#|2011-01-14T00:11:03.363+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF|#]

[#|2011-01-14T00:11:03.366+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Copying 1 file to /var/tmp/20110114241101423/WEB-INF|#]

[#|2011-01-14T00:11:03.522+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Building war: /var/tmp/20110114241103438|#]

[#|2011-01-14T00:11:04.157+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
  Deleting directory /var/tmp/20110114241101423|#]

[#|2011-01-14T00:11:04.161+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=18;_ThreadName=com.liferay.portal.kernel.deploy.auto.AutoDeployScanner;|
00:11:04,160 INFO  [PortletAutoDeployListener:81] Portlets for /opt/deploy/money2text.zip copied successfully. Deployment will start in a few seconds.
|#]

[#|2011-01-14T00:11:04.954+0300|INFO|sun-appserver2.1|javax.enterprise.system.tools.deployment|_ThreadID=19;_ThreadName=Timer-37;|[AutoDeploy] Selecting file /var/opt/glassfish/domains/domain2/autodeploy/money2text.zip for autodeployment.|#]

[#|2011-01-14T00:11:06.034+0300|INFO|sun-appserver2.1|javax.enterprise.system.tools.deployment|_ThreadID=19;_ThreadName=Timer-37;|deployed with moduleid = money2text|#]

[#|2011-01-14T00:11:06.524+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Timer-37;|00:11:06,507 INFO  [PortletHotDeployListener:220] Registering portlets for money2text.zip
|#]

[#|2011-01-14T00:11:06.700+0300|INFO|sun-appserver2.1|javax.enterprise.system.stream.out|_ThreadID=19;_ThreadName=Timer-37;|00:11:06,699 INFO  [PortletHotDeployListener:369] 1 portlet for money2text.zip is available for use
|#]

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.