讲IDEA与eclipse打包可运行java程序的方法

IDEA打包包含main函数可运行java程序方法有两种,而eclipse有三种,IDEA的两种eclipse都包含了,但是差别在于第三种,就是打包的时候,打包的程序jar包中存在引用的第三方jar包。

IDEA打包时要设置的artifacts有两个选项
第一个意思是:提取第三方jar中的内容到目标jar(就是我们要生成的jar)。
第二个意思是:将第三方jar包复制到输出目录,并且在manifest文件中引用了该jar包的路径。
如下图标注
讲IDEA与eclipse打包可运行java程序的方法_第1张图片
第一种打包方式,你会发现他把所有的第三方jar包的内容都解压缩,所以你的包中会有很多第三方的jar中的class文件,这样会让你的jar包很复杂,而且我刚开始这么打包遇到很大的问题,如果你命名的package名称和第三方包一样,会出现和第三方包的class文件放在同一个目录的问题,这样很容易造成迷之问题。很惨的是我还遇到了。因为这个我的资源文件找不到。

第二种打包方式会比较友好。他仅仅把你的程序打包,把第三方包复制到程序打包目录,所以会出现这种情况,
目标目录下包括你自己的程序jar和一堆第三方jar包,manifest.FM中指引了第三方包的路径(相对于目标jar位置)
讲IDEA与eclipse打包可运行java程序的方法_第2张图片
manifest
如果希望目录不是这么一言难尽,可以加lib目录,并且把第三方包放入,并且修改manifest的class-path
讲IDEA与eclipse打包可运行java程序的方法_第3张图片
修改后manifest

eclipse 打包可运行jar文件(runnable jar file)包含三种方式,第一二种分别对应上面IDEA的一二种方式,这里讲第三种不同的方式,他的意思是将第三方包打包到生成的jar包中。
讲IDEA与eclipse打包可运行java程序的方法_第4张图片
打包好的jar内容是这样的。
讲IDEA与eclipse打包可运行java程序的方法_第5张图片
第三种方法manifest
更友好的方式就是lib目录,方式同上。在官方文档中说到,如果要将第三方包放到目标jar中,要用到自定义manifest字段,而不能通过main-class,原文如下,但是我没有看到很具体的介绍要怎么去加载这些字段,不过从上面的manifest看到,自定义了两个字段,一个rsrc-class-path,还有rsrc-main-class启动类变成了一个自动生成的java类,重点应该是在于这个main-class,有兴趣可以自己看下,讲真我还没看,看完有心得会再编辑吧。大概。
原文如下
官方原文
但是我查资料的时候有看到相应的在jar包中引入第三方包的问题,解答如下,他是通过官方文档中提到的命令方式创建jar包,问题的原路径

他的意思说假设有个工程目录D:/javademo,并且在这个目录下创建了helloworld.java并包含其他如comms-lang.jar的第三方包,然后要将其打包成test.jar。这里的manifest是这个哥们自己编辑的,要修改成如下,但是我不太明白为什么他的class-path会加上test.jar因为这个明明是要生成的jar。然后他用命令方式生成jar包。但是他的命令jar -c这个地方让我很迷。因为c才是创建,-c的C明显是大写啊。头秃了。所以如果以下句子报错,请改成c,去掉-

命令的大概意思是:(更具体可以参考官方文档)
c(创建)v(详情,可去掉在这个句子里)f(文件)m(用到自定义的mf) test.jar(目标包名) test.mf(自定义mf文件) -C(改变文件的目录) -C后面带的两个路径,第一个./表示当前目录下,第二个.表示目标jar包中的顶层目录。所以-C ./ .的意思就是把当前目录中的内容提取到目标jar包中的顶层目录。

所以执行这个确实是可以包含第三方jar包在目标jar中,但是,官方又说不能通过class-path引用到包中的第三方包,这个程序我没有验证,所以不确定是否可以执行,所以不多说啥。
讲IDEA与eclipse打包可运行java程序的方法_第6张图片
官方文档

你可能感兴趣的:(体验与心得)