今天,同事们需要吧Liferay中的service builder切换到Maven,因为maven的archetype中已经加了maven 6.1版本,所以我以为这个问题很简单,哪知道,这个问题足足难了我3个小时。
前面步骤都一样,创建一个service-builder的archetype,如下图:
然后在运行命令 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] ------------------------------------------------------------------------
- [INFO] Total time: 4:05.758s
- [INFO] Finished at: Wed Jun 13 22:11:45 CST 2012
- [INFO] Final Memory: 3M/15M
- [INFO] ------------------------------------------------------------------------
- [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,我一开始以为这个问题很简单,就在我们项目的<dependency>中加一些<exclusion>把低版本的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
- <?xml version="1.0"?>
- <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">
- <parent>
- <artifactId>plugins</artifactId>
- <groupId>com.liferay.maven</groupId>
- <version>6.1.0</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.liferay.maven.plugins</groupId>
- <artifactId>liferay-maven-plugin</artifactId>
- <packaging>maven-plugin</packaging>
- <name>Liferay Maven 2 Plugin</name>
- <version>6.1.0</version>
- <description>Contains goals to manage Liferay plugins.</description>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-plugin-plugin</artifactId>
- <version>2.9</version>
- <configuration>
- <goalPrefix>liferay</goalPrefix>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <!-- Liferay -->
- <dependency>
- <groupId>com.liferay.portal</groupId>
- <artifactId>portal-impl</artifactId>
- <version>${liferay.version}</version>
- </dependency>
- <dependency>
- <groupId>com.liferay.portal</groupId>
- <artifactId>portal-service</artifactId>
- <version>${liferay.version}</version>
- </dependency>
- <dependency>
- <groupId>com.liferay.portal</groupId>
- <artifactId>util-bridges</artifactId>
- <version>${liferay.version}</version>
- </dependency>
- <dependency>
- <groupId>com.liferay.portal</groupId>
- <artifactId>util-java</artifactId>
- <version>${liferay.version}</version>
- </dependency>
- <!-- Maven -->
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-artifact</artifactId>
- <version>${maven.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-model</artifactId>
- <version>${maven.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-plugin-api</artifactId>
- <version>${maven.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-project</artifactId>
- <version>${maven.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven.shared</groupId>
- <artifactId>maven-invoker</artifactId>
- <version>${maven.version}</version>
- </dependency>
- <!-- External -->
- <dependency>
- <groupId>com.sun.media</groupId>
- <artifactId>jai-codec</artifactId>
- <version>1.1.3</version>
- </dependency>
- <dependency>
- <groupId>com.thoughtworks.qdox</groupId>
- <artifactId>qdox</artifactId>
- <version>1.12</version>
- </dependency>
- <dependency>
- <groupId>commons-discovery</groupId>
- <artifactId>commons-discovery</artifactId>
- <version>0.4</version>
- </dependency>
- <dependency>
- <groupId>commons-httpclient</groupId>
- <artifactId>commons-httpclient</artifactId>
- <version>3.1</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>dom4j</groupId>
- <artifactId>dom4j</artifactId>
- <version>1.6.1</version>
- </dependency>
- <dependency>
- <groupId>easyconf</groupId>
- <artifactId>easyconf</artifactId>
- <version>0.9.5</version>
- <exclusions>
- <exclusion>
- <groupId>javax.sql</groupId>
- <artifactId>jdbc-stdext</artifactId>
- </exclusion>
- <exclusion>
- <groupId>struts</groupId>
- <artifactId>struts</artifactId>
- </exclusion>
- <exclusion>
- <groupId>xdoclet</groupId>
- <artifactId>xdoclet</artifactId>
- </exclusion>
- <exclusion>
- <groupId>xdoclet</groupId>
- <artifactId>xdoclet-web-module</artifactId>
- </exclusion>
- <exclusion>
- <groupId>xpp3</groupId>
- <artifactId>xpp3_min</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>jalopy</groupId>
- <artifactId>jalopy</artifactId>
- <version>1.5rc3</version>
- </dependency>
- <dependency>
- <groupId>javax.portlet</groupId>
- <artifactId>portlet-api</artifactId>
- <version>2.0</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.1</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.15</version>
- <exclusions>
- <exclusion>
- <groupId>com.sun.jdmk</groupId>
- <artifactId>jmxtools</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.sun.jmx</groupId>
- <artifactId>jmxri</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>net.java.dev.rome</groupId>
- <artifactId>rome</artifactId>
- <version>1.0.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.ant</groupId>
- <artifactId>ant</artifactId>
- <version>1.8.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.axis</groupId>
- <artifactId>axis</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.axis</groupId>
- <artifactId>axis-ant</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.axis</groupId>
- <artifactId>axis-jaxrpc</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.jackrabbit</groupId>
- <artifactId>jackrabbit-core</artifactId>
- <!--edited by charles to exclude the sjf4j ,otherwise it will use the old version if slf4j-->
- <!--start exclusion-->
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- </exclusion>
- </exclusions>
- <!-- end exclusion -->
- <version>2.1.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tika</groupId>
- <artifactId>tika-core</artifactId>
- <version>0.8</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>tomcat-jdbc</artifactId>
- <version>7.0.22</version>
- </dependency>
- <dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-archiver</artifactId>
- <version>1.0-alpha-9</version>
- </dependency>
- <dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-io</artifactId>
- <version>1.0-alpha-1</version>
- </dependency>
- <dependency>
- <groupId>org.freemarker</groupId>
- <artifactId>freemarker</artifactId>
- <version>2.3.16</version>
- </dependency>
- <!--edited by charles to remove the old version of slf4j-->
- <!--
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.5.11</version>
- </dependency>
- -->
- <!--edited by charles to add the new version of slf4j 1.6.4-->
- <!--begin adding new dependency of slf4j-->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.6.4</version>
- </dependency>
- <!--end new dependency of slf4j-->
- <!-- edited by charles to remove the old version of slf4j-log4j -->
- <!--
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.5.11</version>
- </dependency>
- -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>3.0.5.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>oro</groupId>
- <artifactId>oro</artifactId>
- <version>2.0.8</version>
- </dependency>
- <dependency>
- <groupId>wsdl4j</groupId>
- <artifactId>wsdl4j</artifactId>
- <version>1.6.2</version>
- </dependency>
- </dependencies>
- </project>
我们吧这个文件复制并且取代~/.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] ------------------------------------------------------------------------
- [INFO] BUILD SUCCESS
- [INFO] ------------------------------------------------------------------------
- [INFO] Total time: 27.216s
- [INFO] Finished at: Wed Jun 13 22:46:18 CST 2012
- [INFO] Final Memory: 13M/31M
- [INFO] ------------------------------------------------------------------------
最终执行会在我们项目中生成预期的servicebuilder(一组文件)
为了方便,我也上传了我改动的文件,请复制到你机器上的~\.m2\repository\com\liferay\maven\plugins\liferay-maven-plugin\6.1.0 目录中。
我相信,我是Liferay社区对于Liferay 6.1版本的最新解决这个问题的人了,至少在Liferay论坛上,2012年6月1日之前还没有人能解决这个问题。