2019-06-14
关键字:Java 打包、jar 打包依赖
经常会有将 Java 工程打包成一个 jar 库的形式以供其它工程调用的需求。而我们需要被打包成 jar 库的工程中也难免会有需要依赖外部其它 jar 库的情况。比如,我们自己开发一个通过 HTTP 访问网络资源的工程,这个工程需要解析 XML 文件,我们通常不会自己从零开发 XML 解析的功能,网络上已经有很多现成的 XML 解析 jar 库,直接拿来用就好了。在这种情况下,我们自己的 HTTP 访问网络资源工程在开发好以后,如果直接以普通的方式打包成 jar 库,在其它工程中引用时,是会报错的,会报一个 XML 解析相关的类找不到的异常。发生这种情况的原因就是我们的普通 jar 打包方式不会将工程中的库依赖也打包进去。
那怎么解决呢? 其实很简单。下面以 eclipse 中构建的工程为例进行讲解。
step 1
在该工程右键,选择导出工程。
step 2
在弹出的对话框中选择 JAR file
step 3
再在弹出来的对话框中勾选一些信息,一定要注意哪些能勾哪些不能勾。按照下图所示来即可
step 4
直接下一步
step 5
这一步需要注意,这里我们必须手动指定一个 MANIFEST.MF 文件,这份文件内部记载了我们的其它第三方 jar 库的依赖路径关系。
至于这个 MANIFEST.MF 文件的内容,则如下所示
Manifest-Version: 1.0 Class-Path: libs/jackson-annotations-2.9.9.jar libs/jackson-core-2.9.9.jar libs/jackson-databind-2.9.9.jar
重点内容就是上面的 Class-Path 项,这项的值填的就是你的外部库的相对路径,多个库之间以空格隔开。
需要注意的是,这些第三方的 jar 库也需要一起放到新的工程对应目录下。就是说,这些外部的 jar 库仍然不会一起打包进你自己的 jar 库里去。在你后面要引用你自己打包的 jar 库时,这些外部库也需要一并放进对应目录。
step 6
导出完成。
然后在使用方面。假设我们经过前面的步骤已经成功导出了一个名为 japi.jar 的库文件。这个时候我们新建了一个工程 japi_client_test 工程,将这个 japi.jar 作为外部库引入。
那么,正确的库文件结构应该如下图这样
在前面的 MANIFEST.MF 中我们有填到 3 个外部库,它的依赖路径为
1、libs/jackson-annotations-2.9.9.jar
2、libs/jackson-core-2.9.9.jar
3、libs/jackson-databind-2.9.9.jar
所以在这里,也必须将这 3 个第三方的 jar 库放入到一个 libs 目录下,与我们的 japi.jar 具同等地位。
最后,还不能忘记要将它们都添加到新工程的外部依赖库路径中去,如下图所示
如此一来,便大功告成了。