赞
踩
写了一个maven项目,需要引入两个外部jar包,本地引入后正常运行,在打包时就遇到了问题,必需把工程依赖的jar包也一起打包。
如果是springboot项目打包是很好打的,附上一篇链接:https://blog.csdn.net/dongxiexiaoadou/article/details/106872047?spm=1001.2014.3001.5501
非springboot项目:
1、使用maven-shade-plugin
使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。
我这里使用的是另外的一个插件来进行打包,插件名称为:maven-shade-plugin,shade插件打包时在对spring.schemas文件处理上,它能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合,要使用shade插件,必须在pom进行如下配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <excludes combine.self="override" /> </artifactSet> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>reference.conf</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>main.MainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
本地运行时第三方jar包是放在resources
下面的,在pom文件中引入正确的路径即可,打包成功如下图:
然后就可以在target里看见你打好的jar包了,以为万事大吉,结束了。
然后放进Linux环境下,用java -jar
运行发现还是找不到引入的第三方jar包里的文件
用压缩软件打开target里的这个jar包,发现根目录和lib下都有引入的第三方jar包
2、 于是乎又找了别的解决方法:
打开File–Project Structure–Artifacts如下图:
点击加号添加jar,选择第二个
把自己要用的第三方jar放进来,设置好路径,点击apply,ok就可以了。
然后我们需要bulid一下。
然后我们就可以在自己设置的路径下面看到一个jar文件
但是这个jar是不能运行的,可以自己试试
3、目前有两个jar文件,一个是Artifacts下生成,一个是maven插件生成
用压缩软件打开两个jar文件,对比可以看到,第2步Artifacts
下生成的jar包当中,第三方jar包被打散了与原来的一些依赖包和在一起了
于是就想Artifacts
下生成的jar包里的这个com文件包齐全
然后使用maven-shade-plugin
打的包可以运行,但是缺少第三方jar包
如果他们两个能融合一下就好了,好了,好了
4、融合jar包
就尝试一下。
使用maven-shade-plugin打包时,生成了一个META-INF
文件。如下图:
---------------------------分割线--------------------------------
META-INF
的作用
官方一点的说法:META-INF
相当于一个信息包,目录中的文件和目录获得 Java 2 平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件,在打包时自动生成。
简单的说法:就是存储了项目的元信息,其中文件manifest.mf仅此一份,描述了程序的基本信息、Main-Class的入口、jar依赖路径Class-Path
---------------------------分割线--------------------------------
如果要融合jar包的话,这个META-INF
必须保留
从target下面的jar包里拿出来META-INF
,其余的文件全部从Artifacts
下生成的jar包里拿。
这样就重新生成了一个jar包。
拿去Linux下运行了一下,还行。
过程很麻烦,结果很不错。
欢迎提供更好的解决方法的链接地址!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。