天天看点

Liferay 6.1 用maven 构建 service-builder的巨大BUG的修复

今天,同事们需要吧Liferay中的service builder切换到Maven,因为maven的archetype中已经加了maven 6.1版本,所以我以为这个问题很简单,哪知道,这个问题足足难了我3个小时。

前面步骤都一样,创建一个service-builder的archetype,如下图:

<a href="http://blog.51cto.com/attachment/201206/225327279.png" target="_blank"></a>

然后在运行命令 liferay:build-service时,总出现以下问题:

信息: Global lib directory /C:/Users/asus/.m2/repository/com/liferay/portal/portal-service/6.1.0/ 

2012-6-13 22:11:45 com.liferay.portal.kernel.log.Jdk14LogImpl info 

信息: Portal lib directory /C:/Users/asus/.m2/repository/com/liferay/portal/util-java/6.1.0/util-java-6.1.0.jar!/ 

SLF4J: The requested version 1.6.4 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11] 

SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details. 

SLF4J: Class path contains multiple SLF4J bindings. 

SLF4J: Found binding in [jar:file:/C:/Users/asus/.m2/repository/com/liferay/portal/util-java/6.1.0/util-java-6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

SLF4J: Found binding in [jar:file:/C:/Users/asus/.m2/repository/org/slf4j/slf4j-log4j12/1.5.11/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 

[INFO] ------------------------------------------------------------------------ 

[INFO] BUILD FAILURE 

[INFO] Total time: 4:05.758s 

[INFO] Finished at: Wed Jun 13 22:11:45 CST 2012 

[INFO] Final Memory: 3M/15M 

[ERROR] Failed to execute goal com.liferay.maven.plugins:liferay-maven-plugin:6.1.0:build-service (default-cli) on project mavensb-portlet: Execution default-cli of goal com.liferay.maven.plugins:liferay-maven-plugin:6.1.0:build-service failed: An API incompatibility was encountered while executing com.liferay.maven.plugins:liferay-maven-plugin:6.1.0:build-service: java.lang.AbstractMethodError: com.liferay.util.sl4fj.LiferayLoggerAdapter.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V 

原因就是slf4j,框架需要1.6.4版本的slf4j,但是只提供了1.5.X版本的slf4j,我一开始以为这个问题很简单,就在我们项目的&lt;dependency&gt;中加一些&lt;exclusion&gt;把低版本的slf4j排除就可以,结果无论怎样都于事无补。我们也在Liferay官网上找了,但是有人遇到相同的问题,但是没解决方案。

后来,我仔细回味整个过程,其实这个问题并不如我们所想象那样简单,虽然从日志中貌似是util-java中的某个类依赖了slf4j的1.5.X版本,其实还有一个地方依赖,就是jackrabbit,所以我们必须吧这些依赖全部正确的给他配置好才可以。

所以,我想到了去定制liferay-maven-plugin,我在C:\Users\asus\.m2\repository\com\liferay\maven\plugins\liferay-maven-plugin\6.1.0 目录中找到了liferay-maven-plugin-6.1.0.pom ,然后把所有的依赖全部改了下,去掉旧版本的slf4j,最终,这个被我定制的pom如下所示:

我改动的部分包括204-212行,把jackrabbit中对jcl-over-slf4j的依赖移除掉:

第242-249行,移除旧版本的slf4j

第251-258行,添加新版本的slf4j

第261-268行,移除旧版本的slf4j-log4j

&lt;?xml version="1.0"?&gt; 

&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&gt; 

    &lt;parent&gt; 

        &lt;artifactId&gt;plugins&lt;/artifactId&gt; 

        &lt;groupId&gt;com.liferay.maven&lt;/groupId&gt; 

        &lt;version&gt;6.1.0&lt;/version&gt; 

        &lt;relativePath&gt;../pom.xml&lt;/relativePath&gt; 

    &lt;/parent&gt; 

    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; 

    &lt;groupId&gt;com.liferay.maven.plugins&lt;/groupId&gt; 

    &lt;artifactId&gt;liferay-maven-plugin&lt;/artifactId&gt; 

    &lt;packaging&gt;maven-plugin&lt;/packaging&gt; 

    &lt;name&gt;Liferay Maven 2 Plugin&lt;/name&gt; 

    &lt;version&gt;6.1.0&lt;/version&gt; 

    &lt;description&gt;Contains goals to manage Liferay plugins.&lt;/description&gt; 

    &lt;build&gt; 

        &lt;plugins&gt; 

            &lt;plugin&gt; 

                &lt;artifactId&gt;maven-plugin-plugin&lt;/artifactId&gt; 

                &lt;version&gt;2.9&lt;/version&gt; 

                &lt;configuration&gt; 

                    &lt;goalPrefix&gt;liferay&lt;/goalPrefix&gt; 

                &lt;/configuration&gt; 

            &lt;/plugin&gt; 

        &lt;/plugins&gt; 

    &lt;/build&gt; 

    &lt;dependencies&gt; 

        &lt;!-- Liferay --&gt; 

        &lt;dependency&gt; 

            &lt;groupId&gt;com.liferay.portal&lt;/groupId&gt; 

            &lt;artifactId&gt;portal-impl&lt;/artifactId&gt; 

            &lt;version&gt;${liferay.version}&lt;/version&gt; 

        &lt;/dependency&gt; 

            &lt;artifactId&gt;portal-service&lt;/artifactId&gt; 

            &lt;artifactId&gt;util-bridges&lt;/artifactId&gt; 

            &lt;artifactId&gt;util-java&lt;/artifactId&gt; 

        &lt;!-- Maven --&gt; 

            &lt;groupId&gt;org.apache.maven&lt;/groupId&gt; 

            &lt;artifactId&gt;maven-artifact&lt;/artifactId&gt; 

            &lt;version&gt;${maven.version}&lt;/version&gt; 

            &lt;artifactId&gt;maven-model&lt;/artifactId&gt; 

            &lt;artifactId&gt;maven-plugin-api&lt;/artifactId&gt; 

            &lt;artifactId&gt;maven-project&lt;/artifactId&gt; 

            &lt;groupId&gt;org.apache.maven.shared&lt;/groupId&gt; 

            &lt;artifactId&gt;maven-invoker&lt;/artifactId&gt; 

        &lt;!-- External --&gt; 

            &lt;groupId&gt;com.sun.media&lt;/groupId&gt; 

            &lt;artifactId&gt;jai-codec&lt;/artifactId&gt; 

            &lt;version&gt;1.1.3&lt;/version&gt; 

            &lt;groupId&gt;com.thoughtworks.qdox&lt;/groupId&gt; 

            &lt;artifactId&gt;qdox&lt;/artifactId&gt; 

            &lt;version&gt;1.12&lt;/version&gt; 

            &lt;groupId&gt;commons-discovery&lt;/groupId&gt; 

            &lt;artifactId&gt;commons-discovery&lt;/artifactId&gt; 

            &lt;version&gt;0.4&lt;/version&gt; 

            &lt;groupId&gt;commons-httpclient&lt;/groupId&gt; 

            &lt;artifactId&gt;commons-httpclient&lt;/artifactId&gt; 

            &lt;version&gt;3.1&lt;/version&gt; 

            &lt;groupId&gt;commons-io&lt;/groupId&gt; 

            &lt;artifactId&gt;commons-io&lt;/artifactId&gt; 

            &lt;version&gt;1.4&lt;/version&gt; 

            &lt;groupId&gt;dom4j&lt;/groupId&gt; 

            &lt;artifactId&gt;dom4j&lt;/artifactId&gt; 

            &lt;version&gt;1.6.1&lt;/version&gt; 

            &lt;groupId&gt;easyconf&lt;/groupId&gt; 

            &lt;artifactId&gt;easyconf&lt;/artifactId&gt; 

            &lt;version&gt;0.9.5&lt;/version&gt; 

            &lt;exclusions&gt; 

                &lt;exclusion&gt; 

                    &lt;groupId&gt;javax.sql&lt;/groupId&gt; 

                    &lt;artifactId&gt;jdbc-stdext&lt;/artifactId&gt; 

                &lt;/exclusion&gt; 

                    &lt;groupId&gt;struts&lt;/groupId&gt; 

                    &lt;artifactId&gt;struts&lt;/artifactId&gt; 

                    &lt;groupId&gt;xdoclet&lt;/groupId&gt; 

                    &lt;artifactId&gt;xdoclet&lt;/artifactId&gt; 

                    &lt;artifactId&gt;xdoclet-web-module&lt;/artifactId&gt; 

                    &lt;groupId&gt;xpp3&lt;/groupId&gt; 

                    &lt;artifactId&gt;xpp3_min&lt;/artifactId&gt; 

            &lt;/exclusions&gt; 

            &lt;groupId&gt;jalopy&lt;/groupId&gt; 

            &lt;artifactId&gt;jalopy&lt;/artifactId&gt; 

            &lt;version&gt;1.5rc3&lt;/version&gt; 

            &lt;groupId&gt;javax.portlet&lt;/groupId&gt; 

            &lt;artifactId&gt;portlet-api&lt;/artifactId&gt; 

            &lt;version&gt;2.0&lt;/version&gt; 

            &lt;groupId&gt;javax.servlet&lt;/groupId&gt; 

            &lt;artifactId&gt;servlet-api&lt;/artifactId&gt; 

            &lt;version&gt;2.5&lt;/version&gt; 

            &lt;groupId&gt;javax.servlet.jsp&lt;/groupId&gt; 

            &lt;artifactId&gt;jsp-api&lt;/artifactId&gt; 

            &lt;version&gt;2.1&lt;/version&gt; 

            &lt;groupId&gt;log4j&lt;/groupId&gt; 

            &lt;artifactId&gt;log4j&lt;/artifactId&gt; 

            &lt;version&gt;1.2.15&lt;/version&gt; 

                    &lt;groupId&gt;com.sun.jdmk&lt;/groupId&gt; 

                    &lt;artifactId&gt;jmxtools&lt;/artifactId&gt; 

                    &lt;groupId&gt;com.sun.jmx&lt;/groupId&gt; 

                    &lt;artifactId&gt;jmxri&lt;/artifactId&gt; 

            &lt;groupId&gt;net.java.dev.rome&lt;/groupId&gt; 

            &lt;artifactId&gt;rome&lt;/artifactId&gt; 

            &lt;version&gt;1.0.0&lt;/version&gt; 

            &lt;groupId&gt;org.apache.ant&lt;/groupId&gt; 

            &lt;artifactId&gt;ant&lt;/artifactId&gt; 

            &lt;version&gt;1.8.2&lt;/version&gt; 

            &lt;groupId&gt;org.apache.axis&lt;/groupId&gt; 

            &lt;artifactId&gt;axis&lt;/artifactId&gt; 

            &lt;artifactId&gt;axis-ant&lt;/artifactId&gt; 

            &lt;artifactId&gt;axis-jaxrpc&lt;/artifactId&gt; 

            &lt;groupId&gt;org.apache.jackrabbit&lt;/groupId&gt; 

            &lt;artifactId&gt;jackrabbit-core&lt;/artifactId&gt; 

            &lt;!--edited by charles to exclude the sjf4j ,otherwise it will use the old version if slf4j--&gt; 

            &lt;!--start exclusion--&gt; 

            &lt;exclusions&gt;     

                    &lt;groupId&gt;org.slf4j&lt;/groupId&gt; 

                    &lt;artifactId&gt;jcl-over-slf4j&lt;/artifactId&gt; 

            &lt;!-- end exclusion --&gt; 

            &lt;version&gt;2.1.2&lt;/version&gt; 

            &lt;groupId&gt;org.apache.tika&lt;/groupId&gt; 

            &lt;artifactId&gt;tika-core&lt;/artifactId&gt; 

            &lt;version&gt;0.8&lt;/version&gt; 

            &lt;groupId&gt;org.apache.tomcat&lt;/groupId&gt; 

            &lt;artifactId&gt;tomcat-jdbc&lt;/artifactId&gt; 

            &lt;version&gt;7.0.22&lt;/version&gt; 

            &lt;groupId&gt;org.codehaus.plexus&lt;/groupId&gt; 

            &lt;artifactId&gt;plexus-archiver&lt;/artifactId&gt; 

            &lt;version&gt;1.0-alpha-9&lt;/version&gt; 

            &lt;artifactId&gt;plexus-io&lt;/artifactId&gt; 

            &lt;version&gt;1.0-alpha-1&lt;/version&gt; 

            &lt;groupId&gt;org.freemarker&lt;/groupId&gt; 

            &lt;artifactId&gt;freemarker&lt;/artifactId&gt; 

            &lt;version&gt;2.3.16&lt;/version&gt; 

        &lt;!--edited by charles to remove the old version of slf4j--&gt; 

        &lt;!--  

            &lt;groupId&gt;org.slf4j&lt;/groupId&gt; 

            &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt; 

            &lt;version&gt;1.5.11&lt;/version&gt; 

        --&gt; 

        &lt;!--edited by charles to add the new version of slf4j 1.6.4--&gt; 

        &lt;!--begin adding new dependency of slf4j--&gt; 

            &lt;version&gt;1.6.4&lt;/version&gt; 

        &lt;!--end new dependency of slf4j--&gt; 

        &lt;!-- edited by charles to remove the old version of slf4j-log4j --&gt; 

        &lt;!-- 

            &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt; 

            &lt;groupId&gt;org.springframework&lt;/groupId&gt; 

            &lt;artifactId&gt;spring-context&lt;/artifactId&gt; 

            &lt;version&gt;3.0.5.RELEASE&lt;/version&gt; 

            &lt;groupId&gt;oro&lt;/groupId&gt; 

            &lt;artifactId&gt;oro&lt;/artifactId&gt; 

            &lt;version&gt;2.0.8&lt;/version&gt; 

            &lt;groupId&gt;wsdl4j&lt;/groupId&gt; 

            &lt;artifactId&gt;wsdl4j&lt;/artifactId&gt; 

            &lt;version&gt;1.6.2&lt;/version&gt; 

    &lt;/dependencies&gt; 

&lt;/project&gt; 

我们吧这个文件复制并且取代~/.m2/repository中liferay-maven-plugin的pom文件,然后再运行liferay:plugin,终于就可以顺利的执行了:

... 

- Refreshed the configuration of all components 

- Properties for jar:file:/C:/Users/asus/.m2/repository/com/liferay/portal/portal-impl/6.1.0/portal-impl-6.1.0.jar!/portal loaded from [jar:file:/C:/Users/asus/.m2/repository/com/liferay/portal/portal-impl/6.1.0/portal-impl-6.1.0.jar!/portal.properties] 

Loading jar:file:/C:/Users/asus/.m2/repository/com/liferay/portal/portal-impl/6.1.0/portal-impl-6.1.0.jar!/portal.properties 

Building Foo 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\persistence\FooPersistenceImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\persistence\FooPersistence.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\persistence\FooUtil.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\model\impl\FooModelImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\model\impl\FooBaseImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\model\impl\FooImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\model\FooModel.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\model\Foo.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\model\impl\FooCacheModel.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\model\FooClp.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\model\FooWrapper.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\model\FooSoap.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\impl\FooLocalServiceImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\base\FooLocalServiceBaseImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooLocalService.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooLocalServiceUtil.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooLocalServiceClp.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooLocalServiceWrapper.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\impl\FooServiceImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\base\FooServiceBaseImpl.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooService.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooServiceUtil.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooServiceClp.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\FooServiceWrapper.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\src\main\java\com\charles\service\http\FooServiceSoap.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\messaging\ClpMessageListener.java 

Writing D:\IT\Eclipse\Workspace\mavensb\mavensb-portlet\..\mavensb-portlet-service\src\main\java\com\charles\service\ClpSerializer.java 

[INFO] BUILD SUCCESS 

[INFO] Total time: 27.216s 

[INFO] Finished at: Wed Jun 13 22:46:18 CST 2012 

[INFO] Final Memory: 13M/31M 

最终执行会在我们项目中生成预期的servicebuilder(一组文件)

<a href="http://blog.51cto.com/attachment/201206/231007196.png" target="_blank"></a>

为了方便,我也上传了我改动的文件,请复制到你机器上的~\.m2\repository\com\liferay\maven\plugins\liferay-maven-plugin\6.1.0 目录中。

我相信,我是Liferay社区对于Liferay 6.1版本的最新解决这个问题的人了,至少在Liferay论坛上,2012年6月1日之前还没有人能解决这个问题。

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

继续阅读