Java 程序打包

来源:互联网 发布:淘宝5星好评语 编辑:程序博客网 时间:2024/05/22 13:43

这几天为朋友写了一个java小工具,程序已经写好,就等着把程序打包了。

以前也看过java程序如何打包的文章,不过一直没有自己亲自打包一个程序,然后运行。

 

下面讲讲这次打包程序的过程,以及遇到的问题,和如何解决此问题。

 

1. 打包程序

 

因为我用的是eclipse,打包起来很简单了,直接使用export功能,选择jar文件,这样就可以打包了。

 

在打包的过程中,我们可以选择自己要打包的文件,最后一步我们需要注意manifest文件,有两种选择,自动生成,或者 选择自己写好的manifest文件。

 

如果没有什么依赖其他库,或者class,那就选自动生成即可。如果有一些库的依赖,那可以自己写manifest文件,加上一些classpath,或者选自动生成,然后到时候再编辑该manifest文件。

 

为了省事,我选择自动生成,然后自己在后面自己编辑此manifest文件。因为我要引用poi的库,所以加上classpath。

编辑后的manifest文件如下:

 

Manifest-Version: 1.0
Main-Class: exceltest.MainGui
Class-Path: lib/poi-3.6-20091214.jar

可以看到这里有我们指定的Main-class,和我添加的class-path。

 

还有一个注意的就是Main class。 如果你的程序中有多个class,那这个地方就需要指定一下Main class。这里指定的Main class将会写到manifest文件中。如果这个地方不指定,那你可以开始就写到自己的manifest文件中亦可。

 

然后点击finish即可。这样打包就成功了。

 

2.运行程序

我以为java -jar jarfile就ok了,可是还是遇到几个问题。

 

首先遇到一个错误,

 

Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

 

然后检查了一下,原因是class所使用的jdk和 运行时所加载的不一样。

 

因为我的环境变量path中指向的jdk是IBM的 jdk,而编译时候所使用的是sun的 jdk。所以抛出了这个问题。

只要把两者修改一致就ok了。要么修改环境变量,要么修改eclipse所使用的jre。两者都可以。

 

然后继续运行程序,程序界面可以出来了,但是又碰到一个问题。

运行后,在命令行中抛出一堆错误,说是我引用的poi库中的class找不到,可是我明明在manifest文件中添加了class-path了啊。

 

然后又查了查关于打包jar文件的一些注意事项。原来是因为我把引用的外部库打包到了jar中,jar是不能嵌套的。而且class-path中添加的库的相对路径 也是以jar包所在的目录为根目录寻找的。我之前是把库打包了jar中,所以当然找不到库了。

 

晕死。把lib/poi-3.6-20091214.jar移到和jar包同一层目录后,再运行,

 

ok。

 

这么小的一个打包程序,却也是问题不断。还真的是得自己动手了,才算是真的会啊。

 

 

 

 

原创粉丝点击