关于java:草率了又一个Maven打包的问题

32次阅读

共计 1987 个字符,预计需要花费 5 分钟才能阅读完成。

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

  • 这个 Maven 依赖的问题,你敢说你没遇到过:https://mp.weixin.qq.com/s/SzBbDtyRUrk_7LH8SUbGXQ
  • Maven 快照版本要这样用才真的香!:https://mp.weixin.qq.com/s/S0X1qY4uRsAeaqiC80fyNA

明天再来一个,首先看下错误信息,一看就很相熟,都是老朋友了,还是已经那个滋味。

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,如下:

<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 进行了名称的润饰。

<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

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

然而 classifier 这个不是每个 jar 都有的,如果间接应用 artifact.classifier 是不行的,没有 classifier 的就会出问题,这里须要有个判断。而后找了一个有就拼接,没有就不应用的 &dollar;{dashClassifier?},完满解决。

<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,爬虫等相干材料。

正文完
 0