Maven快照版本要这样用才真的香!

栏目: IT技术 · 发布时间: 4年前

内容简介:今天又分享一个问题解决的故事。请看下图框起来的错误,明显就是找不到这个class嘛!下面我们按照正常人的思路去排查这个问题,既然找不到class那就先看这个依赖的jar包有没有,如果没有那就是铁证如山。

Bug的身世之谜

今天又分享一个问题解决的故事。请看下图框起来的错误,明显就是找不到这个class嘛!

Maven快照版本要这样用才真的香!

下面我们按照正常人的思路去排查这个问题,既然找不到class那就先看这个依赖的jar包有没有,如果没有那就是铁证如山。

但是事与愿违啊,编译后的lib目录下真的有这个包 o rder-api-2.0-SNAPSHOT.jar

还是不相信,于是将order-api-2.0-SNAPSHOT.jar解压了,看看里面到底有没有我们需要的class,真的有,此处心情沉重。

一般人到这里就会懵圈了,但我还年轻啊,脑袋还够用。接下来看看classpath的配置有没有问题,如果order-api-2.0-SNAPSHOT.jar不在classpath中,那么自然就是找不到class啊,机智的我。

于是查看了META-INF/MANIFEST.MF文件,发现里面依赖的是 order-api-2.0-20200225.024541-15.jar, 什么情况,还加上时间戳了。

终于真相大白了,classpath中指向的是 order-api-2.0-20200225.024541-15.jar, 但lib中只有 order-api-2.0-SNAPSHOT.jar。 所以找不到class是没有错的。

打包配置信息

Maven deploy的时候会自动给快照版本加时间戳,从下图可以看的出来:

Maven快照版本要这样用才真的香!

下面来看下目前项目的打包配置,如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.3.1</version>
  <configuration>
    <archive>
      <manifest>
        <mainClass>com.xxx.web.WebApp</mainClass>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
      </manifest>
    </archive>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
</plugin>

用了assembly插件,对应的配置如下:

assembly.xml

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <unpack>false</unpack>
        <includes>
            <include>${artifact}</include>
        </includes>
        <outputFileNameMapping>xxx-web.jar</outputFileNameMapping>
    </dependencySet>
    <dependencySet>
        <outputDirectory>/lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
        <unpack>false</unpack>
    </dependencySet>
</dependencySets>
</assembly>

打包后目录中会有一个jar包和一个lib目录,如下:

-xxx-web.jar
-lib
  -xxx.jar
  -yyy.jar

解决方案

现在需要解决的问题是classpath中的快照依赖和lib目录中实际的jar包不一致的问题。

主要是两个插件,所以才会有不一致的情况。

maven-jar-plugin插件中可以加上<useUniqueVersions>false</useUniqueVersions>来强制打包时 MANIFEST.MF文件不记录的Jar时间戳版本。

maven-assembly-plugin插件需要在assembly.xml中进行修改,在dependencySet中增加outputFileNameMapping=${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}

来固定名称,这样就可以去掉时间戳了。

下面贴一下修改之后完整的配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.3.1</version>
  <configuration>
    <archive>
      <manifest>
        <mainClass>com.xxx.web.WebApp</mainClass>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <useUniqueVersions>false</useUniqueVersions>
      </manifest>
    </archive>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
</plugin>

assembly.xml

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
    <format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <unpack>false</unpack>
        <includes>
            <include>${artifact}</include>
        </includes>
        <outputFileNameMapping>xxx-web.jar</outputFileNameMapping>
    </dependencySet>
    <dependencySet>
        <outputFileNameMapping>
  ${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}  
        </outputFileNameMapping>
        <outputDirectory>/lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
        <unpack>false</unpack>
    </dependencySet>
</dependencySets>
</assembly>

虽然解决了,但感觉还是挺麻烦的。还是spring-boot-maven-plugin插件好用啊,至少没有出现过这个时间戳的问题,新项目建议大家用spring-boot-maven-plugin插件打包。

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


以上所述就是小编给大家介绍的《Maven快照版本要这样用才真的香!》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Dive Into Python 3

Dive Into Python 3

Mark Pilgrim / Apress / 2009-11-6 / USD 44.99

Mark Pilgrim's Dive Into Python 3 is a hands-on guide to Python 3 (the latest version of the Python language) and its differences from Python 2. As in the original book, Dive Into Python, each chapter......一起来看看 《Dive Into Python 3》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具