写了一个maven项目,需要引入两个外部jar包,本地引入后正常运行,在打包时就遇到了问题,必需把工程依赖的jar包也一起打包。

如果是springboot项目打包是很好打的,附上一篇链接:

非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文件中引入正确的路径即可,打包成功如下图:

非maven项目如何通过命令行编译 非maven项目idea怎么打包_intellij idea


然后就可以在target里看见你打好的jar包了,以为万事大吉,结束了。

然后放进Linux环境下,用java -jar运行发现还是找不到引入的第三方jar包里的文件

非maven项目如何通过命令行编译 非maven项目idea怎么打包_jar包_02


用压缩软件打开target里的这个jar包,发现根目录和lib下都有引入的第三方jar包

非maven项目如何通过命令行编译 非maven项目idea怎么打包_intellij idea_03


非maven项目如何通过命令行编译 非maven项目idea怎么打包_intellij idea_04

2、 于是乎又找了别的解决方法

打开File–Project Structure–Artifacts如下图:

点击加号添加jar,选择第二个

非maven项目如何通过命令行编译 非maven项目idea怎么打包_intellij idea_05

非maven项目如何通过命令行编译 非maven项目idea怎么打包_maven_06


把自己要用的第三方jar放进来,设置好路径,点击apply,ok就可以了。然后我们需要bulid一下。

非maven项目如何通过命令行编译 非maven项目idea怎么打包_jar_07


非maven项目如何通过命令行编译 非maven项目idea怎么打包_jar_08

然后我们就可以在自己设置的路径下面看到一个jar文件

非maven项目如何通过命令行编译 非maven项目idea怎么打包_jar_09


但是这个jar是不能运行的,可以自己试试

3、目前有两个jar文件,一个是Artifacts下生成,一个是maven插件生成

用压缩软件打开两个jar文件,对比可以看到,第2步Artifacts下生成的jar包当中,第三方jar包被打散了与原来的一些依赖包和在一起了

非maven项目如何通过命令行编译 非maven项目idea怎么打包_非maven项目如何通过命令行编译_10

非maven项目如何通过命令行编译 非maven项目idea怎么打包_jar包_11


于是就想Artifacts下生成的jar包里的这个com文件包齐全

然后使用maven-shade-plugin打的包可以运行,但是缺少第三方jar包

如果他们两个能融合一下就好了,好了,好了

4、融合jar包

就尝试一下。

使用maven-shade-plugin打包时,生成了一个META-INF文件。如下图:

非maven项目如何通过命令行编译 非maven项目idea怎么打包_intellij idea_12

---------------------------分割线--------------------------------
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下运行了一下,还行。

过程很麻烦,结果很不错。

欢迎提供更好的解决方法的链接地址!