问题
昨天同事问了一个问题:对base-sdk打成jar包,sample引用的时候一直提示开发的SDK第三方依赖库的时候无法识别的问题,一直报NClassFoundError
错误。
导致转测试的时候把base-sdk 作为一个module扔给测试去测,这哪能行。
于是帮忙查找定位了原因,也记录一下。
以前用过Ant进行打包, 首先想到的就是用ant工具把多个jar打成一个jar(包括基础的以及所有第三方依赖的),ant工具的配置就不说了。
先对除第三方库之外的内容进行打包:
1 | task packagingJar(type: Jar) { |
打成一个 xxxx-base.jar
下面我们通过ant进行把这个xxx-base.jar 和这个base-sdk依赖的 第三方jar打成最终的jar包。
ant打包
在build里面的配置如下:
1 | "1.0" encoding="utf-8" xml version= |
执行ant -buildfile build.xml
后, 生成xxx-base-v1.0.1.jar
,
其他
拿到xxx-base-v1.0.jar
之后,sample里面试了一下,不再出现Class找不到的问题。
另外,如果sdk的 build.gradle中的dependencies 有gradle配置的依赖,我们构建完成之后,可以到本地目录去找对应的jar包,
windows下一般在Users\xxx\.gradle\caches\modules-2\files-2.1\
目录下。
还有3个小问题待解决:
- base-sdk中引用的so库也找不到;
- base-sdk中引用的第三方的库中申请的APP_ID以及APP_SECRET,配置在manifest.xml的
节点下,sample中调用xxx-base-v1.0.jar测试的时候,会提示两个值没配置好; - base-sdk中依赖的jar跟我们的测试项目中的库冲突(duplicate entry)的问题;
针对1:可以把base-sdk中使用的so库放置到使用者使用时进行配置阶段;
针对2:可以在代码中初始化的时候动态设置APP_ID以及APP_SECRET,不配置在manifest里了。
针对3:我们可以按照下面类似的方法来搞;当然,通过在configurations{} 里面进行配置也可以。
1 | compile(project(':base-http')) { |
搞定。