可执行jar

提出的问题:
java既然提供了打jar包的命令,我们为什么还要用maven中的命令呢?而且他还给提供了三种方式,分别有什么不同呢?
(我相信我们应该都一样吧,看见别人操作那么多的命令,首先感觉好强啊,然后就是我靠!这么多命令,真费脑子,我能不能只记一种比较实用的呢?)

Java提供了命令jar -cvf可以将calss文件打包成jar包,但是这种打包方式生成的jar包并不能通过java -jar来执行,下面是我实践的一个例子:

我将一个Test.class文件打包成可执行jar,解压目录:

META-INF文件夹里面有一个MANIFEST.MF文件,里面有两个属性

Created-By: 后面跟的是他自己生成的一个名字,chen是我后来改的

这样的jar是不能执行的,因为他没有指定执行的入口Main-Class,于是我添加一条属性

同时把这个MANIFEST.MF拷贝到Test.class同级的目录中,再用jar -cvfm test.jar MANIFEST.MF Test.calss 重新打包,这个jar就可以通过java -jar来执行了

(就这么一个简单的东西我都试了有俩钟头,因为我的java文件是在eclipes中编辑后拷贝过来的,这个java文件放在一个包下,打包成可执行jar之后老报找不到入口文件,后来我把Test.java文件最顶上的package 。。。去掉才能启动。后来我又加上,改变配置文件中的Main-Class路径,怎么都不好使,不明所以。。。)

但是在我们的实际开发中所写的java文件可不是只有这么一个类,而且各个类之间有相互的依赖关系,依赖关系就需要在MANIFEST.MF文件中用Class-Path来指定,而且配置文件的格式是必须要遵守的,少一个空格,少一个空行都会导致文件内容的读取不到,所以配置起来相当的麻烦,这个时候我们就希望有人能帮我们做了这个事情,maven提供的三种打包方式就可以帮到我们

下面简单介绍一下这三种打包方式的优缺点:

方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包
maven-jar-plugin:主要用来指定入口
maven-dependency-plugin: 主要用来指定依赖包
缺点:这种方式生成jar包有个缺点,就是生成的jar包太多不便于管理

方法二:使用maven-assembly-plugin插件打包
优点:这种打包方式不但包含了自己项目中的代码和资源,还包含了所有依赖包的内容。所以可以直接通过java -jar来运行
缺点:如果项目中用到spring Framework,用这种方式打出来的包运行时会出错,原因是有很多配置文件名重复,例如spring-config.xml,他们会被覆盖(没有考证过…)

方法三:使用maven-shade-plugin插件打包 
这个主要目的就是为了解决方法二种的配置文件问题,将配置文件配置到AppendingTransformer中即可

maven提供的打包方式,我们不仅可以指定入口,依赖 而且可以指定输出jar包的位置,是否打包时过滤掉哪些jar等等,非常方便

https://blog.csdn.net/qq_16055765/article/details/79480739

你可能感兴趣的:(可执行jar)