我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用。我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入第三方jar包后,在Idea中进行相应设置后,可以调试运行了,但是用Docker打包上传到服务器后,运行时会提示找不到某些类的定义。

经查看这些找不到的类就是来自第三方库,那么问题有可能是第三方jar包的路径问题,或者是根本就没有打包进jar文件里面。我们可以去Docker容器内部查看jar文件,执行命令:jar tf xxx.jar|grep lib,其中xxx.jar是打包后生成的文件名称。这个命令打印出jar文件中lib目录下的所有文件,从这里我们可以看到,确实没有包含第三方的jar文件。

在网上找了一阵子,各种说法五花八门,然而都不能解决问题,比如这里有一篇:3-ways-to-add-local-jar-to-maven-project,看着貌似能解决问题,但使用后还是无法解决。比如将第三方jar包安装到本地Maven,这种方式是可以解决本地编译的问题,但我们还得去编译服务器上再安装一遍,而且要指定groupId,artifactId等东西,感觉蛮麻烦。我们只想在编译打包时,把我们的lib文件夹的文件都拷贝到jar文件的lib目录下。有什么办法呀?

Maven中有各种plugin,也就是插件,有人推荐用assembly插件,比如这样写:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
         <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

我们以为这样就能把所有依赖包放进最终的jar文件中了,可惜试了之后还是不行,其它类似方法也试了都不行。后面想想,是不是要把lib文件夹放到resource目录下。试了之后,发现这回倒是拷贝进jar文件了,但是放置的位置是BOOT-INF/classes/lib里面,而其他的库文件则放到BOOT-INF/lib里面,这样运行时会不会找不到那些第三方jar文件呢?我们没有验证,然后在这里找到一篇文章,解决了拷贝lib目录文件到BOOT-INF/lib的问题,配置如下:

<resources>

<resource>

<directory>src/lib</directory>

<targetPath>BOOT-INF/lib/</targetPath>

<includes>

<include>**/*.jar</include>

</includes>

</resource>

<resource>

<directory>src/main/resources</directory>

<targetPath>BOOT-INF/classes/</targetPath>

</resource>

</resources>

这样之后,所有的依赖包都放到BOOT-INF/lib目录下了,程序也可以正常运行了。

以为到这里能加鸡腿了,结果来个更大的坑。第三方库里面有读取文件的接口,我们在使用接口时,传入了一个配置相关的文件的路径,我们是在resources目录下新建了个目录来存放这个配置文件的。运行时异常:

java.io.FileNotFoundException:

class path resource [aaa/xxx.conf] cannot be resolved to absolute file path because it does not reside in the file system.

这个问题是因为程序去读取文件时,是去文件系统里面找文件,而不是从jar里面找,人家是建议使用getInputStream而不是getFile。可是读取文件的功能是第三方库实现的,我们没法改动读取文件的方式。那怎么办?老老实实在Dockerfile文件加个拷贝操作呗,把配置文件放到文件系统相应目录下即可。

总结一下,这个问题的原因还在于,我们对官方Maven文档不熟,没有研究过各种配置,对Jar文件的组织结构和运行原理不太清楚,因为我们几个Java方面的经验都不够多,踩过的坑还太少,同时也不得不感叹,Java开发里面的各种配置,也真是眼花缭乱啊,即便我们也使用了Spring Boot这种简化了配置的开发框架。

文章来源:技术人成长

欢迎关注公众号:

Maven打包成Jar文件时依赖包的问题的更多相关文章

  1. maven 打包成 .jar 文件执行:没有主清单属性错误

    报错原因是pom.xml配置文件中没有指定main入口信息,在pom.xml文件中添加如下代码: <build> <plugins> <plugin> <gr ...

  2. 使用exe4j把JAVA GUI程序打包成exe文件时遇到的问题

    1.把项目打包成jar文件时,只要勾选src目录就行了,其他的比如资源文件和jar包是不能添加进去的. 2.在D盘建一个文件夹,最好与项目同名,然后把打包好的jar包放进去,其他资源文件(图片之类的) ...

  3. Eclipse中将含有图片资源的项目打包成jar文件

    前言: 最近学了GUI编程和UDP协议,心血来潮想做一个局域网内的聊天软件,前期都还算顺利,直到后来将整个项目打包成jar文件时遇到了困难.如图: 自己设置的图标不见了,但是也没有默认的图标,说明图片 ...

  4. java打包成jar文件

    JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成.JAR包是 ...

  5. 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

    1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...

  6. 如何将idea工程打包成jar文件

    如何将idea工程打包成jar文件 近日在工作中遇到了一个问题,需要把本地的java文件打成jar包,传到云服务器上运行.于是学习了一下如何在intellij idea中将java工程打成jar包. ...

  7. 将Java代码打包成jar文件转换为.exe可执行程序方法

    ​ 做完学生管理系统后我想将代码打包成一个可执行程序,那样就可以直接点击在Windows下运行了,下面就跟大家分享下打包方法. 将Java的代码转换成 .exe 文件需要先把代码打包成 jar 文件然 ...

  8. Eclipse项目中引用第三方jar包时将项目打包成jar文件的两种方式

    转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFES ...

  9. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

随机推荐

  1. DataTable转换为Entity(反射&&泛型)

    public static IEnumerable<T> Parse<T>(IEnumerable<DataRow> rows) where T : class, ...

  2. ASP.NET MVC4使用JCrop裁剪图片并上传

    需要用到的jquery插件Jcrop .Jquery.form 百度webuploader插件( http://fex.baidu.com/webuploader/ ) 引用下载好的css和js文件 ...

  3. NSLocalizedDescription=Request failed: unacceptable content-type: text/html 解决方法

    使用AFNetworking请求一个网站出现了以下错误 Error Domain=com.alamofire.error.serialization.response Code=- "Req ...

  4. Image Paragraph论文合辑

    A Hierarchical Approach for Generating Descriptive Image Paragraphs (CPVR 2017) Li Fei-Fei. 数据集地址: h ...

  5. Win8MetroC#数字图像处理--2.2图像二值化函数

    原文:Win8MetroC#数字图像处理--2.2图像二值化函数 [函数代码] /// <summary> /// Binary process. /// </summary> ...

  6. 腾讯QQ 8.9.3体验版发布 在线文档多端同步实时保存

    感谢N软网的投递 腾讯体验中心迎来QQ8.9.3首个维护体验版发布,详细版本号为v8.9.3.21006,上一个体验版v8.9.2.20717发布于4月20日,时隔34天又迎来了更新.本次升级主要是在 ...

  7. 论文阅读计划1(Benchmarking Streaming Computation Engines: Storm, Flink and Spark Streaming & An Enforcement of Real Time Scheduling in Spark Streaming & StyleBank: An Explicit Representation for Neural Ima)

    Benchmarking Streaming Computation Engines: Storm, Flink and Spark Streaming[1] 简介:雅虎发布的一份各种流处理引擎的基准 ...

  8. 腾讯移动Web整体解决方案Spirit

    Spirit(勇气号),美国航天局NASA派往Mars(火星)的第一艘探测器.移动Web开发是一块新的领域,甚至有很多坑,这一点与人类从未踏上的Mars(火星)相似.为了避免开发者重复遇到相同的问题, ...

  9. 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))

    注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...

  10. SpringMVC核心架构的具体流程

    核心架构的具体流程步骤如下: 1.首先用户发送请求-->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控 ...