在Liferay 7中使用第三方Jar包fastjson

2019年09月21日 Liferay, Liferay7 暂无评论 阅读 16,321 views 次

最近看到过几次有人在群里面询问Liferay7中怎么引入FastJson,这个问题其实是怎么引入第三方jar包的问题。

第一步:在maven或gradle的文件中引入fastjson,此处的引用和正常的项目一样

  • maven

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>

  • gradle
 compile 'com.alibaba:fastjson:1.2.61' 

第二步:配置bnd.bnd文件

在其中添加如下配置:

-includeresource: \
@fastjson-1.2.61.jar
Import-Package:\
!com.google.common.*,\
!javax.money.*,\
!okhttp3.*,\
!org.glassfish.jersey.*,\
!org.javamoney.*,\
!org.joda.time.*,\
!org.springframework.data.redis.serializer.*,\
!org.springframework.messaging.*,\
!org.springframework.web.socket.*,\
!retrofit2.*,\
!springfox.*,\
*

其中的

-includeresource: \
@fastjson-1.2.61.jar

可以替换为以下几种写法

  • 方法二:(注意:此种方法在部分版本中可能不正常,在7.2 CE GA1中测试正常,其他版本不确定)
-includeresource: META-INF/lib/fastjson-1.2.61.jar=fastjson-1.2.61.jar;lib:=true
  • 方法三: (注意:此种方法在部分版本中可能不正常,在7.2 CE GA1中测试正常,其他版本不确定)

-includeresource: lib/jsoup-1.12.1.jar=jsoup-1.12.1.jar

说明:

为啥需要这样写呢?Liferay 7开始转向OSGI架构,我们部署的每一个module都是以模块的形式存在于liferay环境中,这个是OSGI的依赖问题,如果熟悉OSGI上面的看起来就不是问题了,想深入了解可以看看OSGI的相关书籍,这里做一个简单说明。

-includeresource:作用就是将我们的这个jar包打包的时候包含到我们的module的部署包中。

Import-Package:作用是告诉OSGI容器,此module需要导入哪些包,类似我们在Java中写代码时的import,前面加!就是不导入指定的包。注意最后的*不要缺失。,\是用来表示多个之间换行显示处理。

fastjson本身有一些是需要在运行时依赖的,比如我们前面排除的spring的,javamoney的等等,在部署到OSGI容器的时候,检查发现没有找到这些包,就会报错,所以需要我们使用Import-Package进行排除,告诉OSGI容器,这些是我不用的,不要再检查了。

说明2:

如果只是为了使用json的序列化和反序列化,不需要引入fastjson就可以,可以使用Liferay本身提供的JSON工具类就行,fastjson对于序列化liferay本身的一些类,比如company、user等反而可能会出错。可以使用Liferay本身提供的JSONFactoryUtil进行序列化和反序列化操作。

说明3:

对于第三方jar包的引入,并不是只能使用这个方法,一般而言有几种方法处理:

  1. 将jar包放到全局容器中:比如tomcat的lib目录中,这种适合一些基础性的,是我们需要全局使用的,比如JDBC的驱动就是放在这里的, 不过这个一般不推荐,这个就不能使用OSGI的特性,比如可以多版本jar同时共存
  2. 将jar包以OSGI模块的形式部署:也就是我们可以直接将jar包放到deploy目录下面直接以module的形式部署,但是这个也是要限制的就是在jar包必须要是按OSGI的module的标准形式打包 ,一般一些大的知名的jar包都是默认按OSGI标准打包的,怎么判断是不是以OSGI形式打包呢?可以看jar包中是否有MANIFEST.MF,并且这个文件中有Bundle-Name等一系统内容,一般有的就可以直接部署。
    这种也是适合于全局依赖的jar包,我们不必将这些jar包打到我们特定的module中。比如我们有多个module要直接操作Mysql 8数据库,我们可以直接将mysql-connector-java-8.0.17.jar这样的jar包丢到deploy下面,以OSGI模块的形式部署,在我们的module的bnd中加入下面的,就可以使用了。(注意:这里只是作说明jar包的引入,如果真要基于JDBC操作mysql8,7.2已经是8的JDBC驱动,不需要重复引入,如果是之前版本的可以这样做)
    注意:如果部署的这个jar包有其他的依赖,他对应的依赖也要部署才可以。
Import-Package:\
    com.mysql.cj.jdbc;version=8.0.17,\
    *
  • 在module中以资源的形式打包:这个方法就是本文前面fastjson介绍的方法。我们引入的jar包,同时也可以发出去,让其他module进行依赖处理。
    可以使用Export-Package来告诉OSGI容器,此模块的哪些包是可以供其他模块使用的。
用户头像
Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号

用户登录

分享到: