前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >草率了,又一个Maven打包的问题

草率了,又一个Maven打包的问题

作者头像
猿天地
发布2020-10-26 11:49:20
6990
发布2020-10-26 11:49:20
举报
文章被收录于专栏:猿天地猿天地

经常遇到 Maven 相关的问题,这是之前的文章:

今天再来一个,首先看下错误信息,一看就很熟悉,都是老朋友了,还是曾经那个味道。

代码语言:javascript
复制
Caused by: java.lang.ClassNotFoundException: net.sf.json.JSONException
  at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  ... 57 more

依赖的是 aliyun-log,aliyun-log 内部依赖了 json-lib,如下:

代码语言:javascript
复制
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

从依赖上看没啥问题,然后看服务器上打包后的 lib 目录中有没有 json-lib 这个 jar 包。看了下确实有 json-lib-2.4.jar。错误明确的告诉我们 JSONException 找不到,也就是没有加载到 json-lib 的包,这个时候需要看下 MANIFEST.MF 文件中 Class-Path 有没有设置 json-lib 的路径。

看了下,有对应的路径,值为 json-lib-2.4-jdk15.jar,可以看到,这个名称跟打包出来后的不一致,多了 jdk15。

这个时候再回过头来看上面的 classifier,里面指定了 jdk15。classifier 通常用于区分不同 jdk 版本所生成的 jar 包,如果指定了 classifier,那么 jar 就是要加上 classifier 的值才行,也就是 json-lib-2.4-jdk15.jar 是正确的。

现在问题很明显,就是打包时的问题,打包后的 jar 名称应该是 json-lib-2.4-jdk15.jar 才对,而现在是 json-lib-2.4.jar,才导致了 ClassNotFoundException。

然后看了下项目的打包方式,还是比较古老的 assembly,里面对打包的 jar 进行了名称的修饰。

代码语言:javascript
复制
<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

格式已经固定死了,classifier 不在格式当中,所以打包后的 jar 名称就会被改掉。解决方式需要将 classifier 也定义在 outputFileNameMapping 中。

但是 classifier 这个不是每个 jar 都有的,如果直接使用 artifact.classifier 是不行的,没有 classifier 的就会出问题,这里需要有个判断。然后找了一个有就拼接,没有就不使用的${dashClassifier?},完美解决。

代码语言:javascript
复制
<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>

文档参考:

http://maven.apache.org/plugins/maven-ear-plugin/examples/customize-file-name-mapping.html

关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号猿天地发起人。

我整理了一份很全的学习资料,感兴趣的可以微信搜索「猿天地」,回复关键字 「学习资料」获取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分库分表,任务调度框架 XXL-JOB,MongoDB,爬虫等相关资料。

后台回复 学习资料 领取学习视频

如有收获,点个在看,诚挚感谢

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档