[Java] eclipse 导出jar包

从以下两篇文章整理所得http://blog.csdn.net/kanfeikanfei/article/details/4024304 和http://blog.csdn.net/guanmjie/article/details/4437779

有时候需要将j2se工程导出,这样可以在别处运作,就不必拘泥于开发感觉中才能运行了。

具体做法如下:
方法一:(工程没有引用外部jar包时,直接导出)

1.在要生成jar的项目上右击,选择菜单上的Export(导出)

 

2.导出类型选择Jar File

3.选择或者输入生成路径

 4.manifest文件是默认生成的,你还可以选择把生成后的文件保存到指定路径

程序的切入点点击“浏览”Eclipse会自动检测可以切入的类,选择你要作为切入点的类就行了

选中工程---->右键,Export...--->Java--->JAR file--->next-->选择jar file的路径及名称-->next-->next---> 选择main class--->finish.

方法2:

当工程引用了其他的外部jar时,由于eclipse不支持同时导出外部jar包的功能,所以比较麻烦一点;具体步骤如下:
生成manifest file:选中工程--->右键,Export--->Java--->JAR file--->选择jar file的路径及名称--->next--->next--->next;
此时来到了方法1中要选择main class的窗口,但这里先不选择main class,选择最上方的Generate the manifest file, 勾上Save the manifest in the workspace,在Manifest file:中输入file的名称,如/testProject/main,(其中testProject为工程名,main为manifest file的名称)点击finish,回到工程,打开刚刚生成的main,在这里要输入如下信息:
Manifest-Version: 1.0
Class-Path: lib/hadoop-core-1.0.4.jar lib/hbase-0.94.2.jar  lib/commons-logging-1.1.1.jar
Main-Class: coprocessor.RegionObserverExample
其中,Manifest-Version: 1.0为刚刚自动生成的manifest版本号;
Main-Class: coprocessor.RegionObserverExample为main函数所在类;
Class-Path: lib/hadoop-core-1.0.4.jar lib/hbase-0.94.2.jar  lib/commons-logging-1.1.1.jar为外部jar包名称,这里是告诉导出的jar包,所要用到的外部的jar包的路径及名称。
上面都做完了就可以导出带外部jar包的jar包了,步骤如下:
选中工程--->右键,Export--->Java--->JAR file--->选择jar file的路径及名称--->next--->next--->next,这时又来到了选择main class的窗口,但这里也不选择main class,选择Use existing manifest from workspace,在Manifest file:里选择刚刚生成的main,如:/testProject/main,点击finish,到此就大功告成啦;假设生成的jar包的名称为test.jar,那么Class-Path中引入的jar都放在lib文件夹中,且lib目录和test.jar位于同一个目录下。

这里还有一点要注意:
如果想在命令行中运行刚刚生成的jar,命令如下:
java -jar test.jar
如果在jar中有一些System.out.prinln语句,运行后想看看打印出的内容,可以用一下命令:
java -jar test.jar >log.txt

输出信息会被打印到log.txt中,当然log.txt自动生成,并位于和test.jar一个目录中。


这里也可以新建一个start.bat文件,创建后;右键---编辑,输入:java -jar test.jar >log.txt;以后直接双击start.bat即可运行test.jar啦。


第三中方法:使用 FatJar插件

其实这样已经能够满足我的要求了,查看Eclipse如何打包的过程中我发现有个fatjar插件功能更强些,可以把需要的资源打进一个jar里。所以下载了一个,下载地址:http://sourceforge.net/projects/fjep/files/fatjar/
解压缩后是一个.../plugins/net.sf.fjep.fatjar_0.0.31.jar      把plugins下面的net.sf.fjep.fatjar_0.0.31.jar文件拷贝到eclipse的plugins下,重新启动 Eclipse3.7,Windows=>prefernce=>fat jar preference看到他就说明已经安装成功了。如果没有看到,没有关系,删除D:\eclipse3.7\configuration\org.eclipse.update\platform.xml文件(此文件可以自动生成)不用担心以前的插件会因此而消失。删除后重新启动Eclipse,发现fatjar插件已经安装成功了!

选中你的项目=〉Export..=>向导里有fat jar =>使用起来真的很方便~

总结:
    一般把src打包export=>Jar File 即可。
    想把src附属的资源一起打包,必须使用FatJar => export..=>FatJar.



MANIFEST.MF的用途  http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010112991634509/

1. Main-Class 指定程序的入口,这样可以直接用java -jar xxx.jar来运行程序。

 2. Class-Path 指定jar包的依赖关系,class loader会依据这个路径来搜索class。

我平时用mf文件一般说来都是让jar成为可以直接运行这一目的。虽然目的这么简单,但是每次打包还是很容易出现各种各样的问题让人头痛。mf总是没有被应用,或者是出错了。

首先给出一个简单而标准的例子:

Manifest-Version: 1.0
Main-Class: ui.JFrameMain
Class-Path: jtds-1.2.jar c3p0-0.9.1.2.jar 
esri_mo20.jar esri_mo20res.jar jsde83_sdk.jar

解释一下:

Manifest-Version mf文件版本号,这行照抄

Main-Class 包含main函数的类,程序的入口

Class-Path 用到的一些包

分析一下要点:

要点1:每行的“:”(冒号)用来分隔键值对。冒号后边一定要跟一个空格!!!

也就是说务必写为:

Main-Class:(空格)YouClassName

Class-Path:(空格)Class1.Jar

否则JBuilder会报("Manifest.mf": Error reading manifest: java.io.IOException: invalid header field
)这样的错。不再IDE帮助下做的JAR会发现MF没有起到应有的作用。顺便说一下以前我看到JBuilder报另一个个错大概说是什么换行符不对,好像也是由于这个问题引发的。原先总以为是windows里边的回车是由回车,换行2个字符构成而造成的。现在看来好像不是这样,是因为少了冒号后边那个空格。

要点2:Class-Path里边的内容用空格分隔而不是逗号或者分号。(唉。。。我总是下意识的用分号)

也就是说务必写成:

Class-Path:(空格)Class1.jar(空格)Class2.jar(空格)Class3.Jar

要点3:有的文章说MF文件每行不能超过七十多的字符,我的经验是如果在JBuilder里编辑MF超过了也无妨,一般我是尽量一行写完。续行挺麻烦又要以空格开头什么的。我也经常直接用winRar打开jar然后直接编辑里边的mf文件,这是个好方法,很直接了当,缺点就是如果改坏了也不会报错,只是MF有的部分失效了,好像运行时也会说"错误的MF文件版本"。

介绍几个技巧:

技巧1:使用winRar打开jar,双击MF文件,就可以编辑了,编辑完了Ctrl+S保存。特方便。也可以在外边写好一个Manifest.mf,然后直接拖入覆盖以前的。

技巧2:写一个run.bat来运行你的jar。run.bat大体内容如下:

java -jar yours.jar

pause

后边加一个pause就可以让你看到具体哪里出错了,一般来说问题如果出在MF上,那么往往就是哪个包,哪个类没有找到的NoClassDef这种异常。



你可能感兴趣的:(Java)