jar包打包实现
jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容
从最后显示的两个示例看出存在两种打包的方法,两者的区别就是是否使用自己定义的MANIFEST清单文件。第一个示例没有使用MANIFEST文件进行打包,所以最终生成的jar包中MANIFEST文件为默认文件,这种方式适用于比较简单的jar包结构,不存在其他jar包依赖以及生成的jar包不需要可执行。这种方式生成的jar包不能使用java -jar XXX.jar命令执行,因为MANIFEST文件中未指定程序入口。而第二个实例是比较常用的打包方式,即是使用自定义的MANIFEST文件参与打包,这样能够实现往包中添加依赖,并且可以指定程序入口,实现java -jar XXX.jar 直接运行jar包。
第一种简单的打包方式
最简单的就是在当前文件夹下将编译的class字节码文件进行打包输出。示例如下:
编写三个java文件,test1.java test2.java 以及Main.java
public class test1 { public static void main(String[] args) { } public void display() { System.out.println("this is class test1"); } }
以及test2.java 文件
public class test2 { public static void main(String[] args) { } public void display() { System.out.println("this is class test2"); } }
Main.java
public class Main { public static void main(String[] args) { for(String a:args) { System.out.println("给定的参数"+a); } test1 t1 = new test1(); t1.display(); test2 t2 = new test2(); t2.display(); } }
命令行下将这三个文件进行编译,使用javac命令实现编译。
用jar指令将编译的class文件打包
打包过程中有显示已添加清单。用解压工具打开生成的test.jar包,可以看到如下的结构:
除了编译的三个class文件外多了一个META-INF文件夹,里面有一个MANIFEST.MF(清单文件)的文件,这个文件的作用非常重要,后面说明。我们先看它里面的内容
非常简单的清单,只包含清单版本与java版本。
这个时候执行java -jar test.jar有如下效果:
没有主清单属性报错。这是因为我们使用第一种方法生成jar使用了默认的清单,默认清单没有指定程序入口,所以出错。
可以直接更改jar包中的MANIFEST文件(解压工具打开,更改后保存),改成如下效果:
再一次执行java -jar test.jar 后程序输入正确内容:
在MANIFEST文件中添加了Main-Class属性指定了程序入口,实现了直接执行jar文件。
所以说使用默认的MANIFEST是不能直接执行jar文件,要么使用自己定义的MANIFEST文件打包,要么更改包中的MANIFEST文件。
第二种打包方式
第二种打包方式更加通用,一般情况下java文件第一行都是package XXX;即是包名,也决定了编译后的class文件存在的路径。当有多个java文件要编译打包并且他们存在不同的包名时,如果还是按照第一种方法打包时一个文件一个文件的写非常不现实,所以有了第二种方法。将所有要打包的class文件存在的目录以及依赖的jar包全部放在一个根文件夹里面(比如是foo),然后编写MANIFEST清单文件,指定程序入口以及其他添加的依赖的jar包。在执行指令:
注意 上面的指令中foo/ 文件夹后面有一个空格还有一个点
下面看一个例子
同样还是test1.java与test2.java以及Main.java 但是各自有自己的包名。
package cn.mytest1; public class test1 { public static void main(String[] args) { } public void display() { System.out.println("this is class test1"); } }
package cn.mytest2; public class test2 { public static void main(String[] args) { } public void display() { System.out.println("this is class test2"); } }
package cn.mymain; import cn.mytest1.test1; import cn.mytest2.test2; public class Main { public static void main(String[] args) { for(String item:args) { System.out.println("传递参数"+item); } test1 t1 = new test1(); test2 t2 = new test2(); t1.display(); t2.display(); } }
同样使用javac 指令编译,三个class文件存在于不同的路径下,因为他们包名不一样。把编译号的含有class文件的文件夹全部放在foo文件夹下:
然后在foo 外面写一个MANIFEST文件:
MANIFEST内容如下:
注意:MANIFEST 文件最后一行是空行。
命令行下执行指令:jar cvfm test.jar MANIFEST.MF -C foo/ .
在命令行下测试jar包是否能够直接运行了,使用指令java -jar test.jar
正确打包,成功运行jar.
MANIFEST文件介绍
通过上面的两个例子,可以看到MANIFEST文件对于jar打包都是必须的。MANIFEST文件描述了打包后的jar文件的详细信息,存在于打包后的META-INF 的文件夹.一个简单的MANIFEST文件主要内容如下:
主要就是Manifest-Version Main-Class Class-Path这三个属性在制作jar包时非常重要.Manifest-Version 是版本号,照着写就行。Main-Class则是jar包的入口程序,指定运行的类的全称(一定要包含包名),这样可以使用java -jar name.jar直接运行jar包。第三个Class-Path是指的打包时需要依赖的其他jar包,打包的时候自己的程序中也可能含有其他的jar包所以要添加依赖。
注意每个MANIFEST属性冒号与内容之间都有一个空格,并且写完后最后还要留有一行空行,不然运行时还是出现找不到主清单属性的错误
小结
jar文件打包容易出错的地方就是Manifest清单文件的编写,容易出一些格式上的错误比如属性的冒号和内容之间少空格,Class-Path中添加依赖之间没有空格,依赖文件过多,多行书写的时候每行开头没加空格,文件最后一行没有空行等等。写MANIFEST文件的时候注意这些关键的地方就不会在打包上面耗费太多的时间。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍spring boot打包成可执行jar包,包括了spring boot打包成可执行jar包的使用技巧和注意事项,需要的朋友参考一下 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。 下面介绍一下如何解决。 这样就能够打出jar包了。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: 我已经阅读了以前发布的问题。有些含糊不清,没有一个解决我的问题,所以我不得不再问一次。 我有两个简单的课程, 另一类是 我在Windows cmd中的基本文件夹“ basic”中。我用编译 将创建一个文件夹和子文件夹。 这会产生大量错误。许多答案旨在指定无效的完整路径。我的班级在One中,因此使用-cp指定One也不起作用。 问题答案: 您将其运行为: …但是从 根 目录(), 不是
命令行界面钱包 综述 命令行界面钱包程序为 keosd,位于 eos/build/programs/keosd 路径下,用于存储交易签名的私钥。keosd 在本地节点上运行,并将私钥保存在本地节点上。 如何运行keosd keosd 默认情况下,keosd会在目录 ~/eosio-wallet 中生成一个基础的配置文件 config.in。在运行命令行钱包时,通过配置命令行参数 --config-
主要内容:tar命令做打包操作,tar命令做解打包操作,tar命令做打包压缩(解压缩解打包)操作Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个单独的磁带或磁盘中进行归档。不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包。 使用 tar 命令归档的包通常称为 tar 包(tar 包文件都是以“.tar”结尾的)。 tar命令做打包操作 当 tar 命令用于打包操作时,该命令的基本格式为: [root@localhost
本文向大家介绍浅析Linux tar打包命令,包括了浅析Linux tar打包命令的使用技巧和注意事项,需要的朋友参考一下 范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar [root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩! [root@linux ~]# tar -zcvf /tmp/etc.tar.gz /e
nutz本身并不强制依赖第三方的jar,但项目需要还是会加入下列的jar Nutz本身 不需要废话了 下载地址 Mysql数据库驱动 Mysql作为本书选用的数据库,那它的驱动当然是必不可少的 若使用6.x版本的驱动的话,务必使用最新版的druid 下载地址 数据库连接池Druid 推荐与Nutz一起使用的数据库连接池,带强大的SQL监控功能 下载地址 关于Log4j 如果你执意要加入log4j.