网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  制作可执行jar     
  文章作者:未知  文章来源:水木森林  
  查看:74次  录入:管理员--2007-11-17  
 
  本文阐述了如何把一个不可执行的java archive(jar)文件变成可执行,而不用直接操作manifest文件。你会学到写出短小的一个程序,通过运行java -jar命令或在像windows一样的操作系统里面用双击鼠标运行任何jar文件。

你可以很容易地把应用程序的一整套class文件和资源文件打包到一个jar中。事实上这就是jar文件存在的一个目的。另外一个目的就是让用户能很容易地执行被打包到jar文件里面的应用程序。那么为什么jar文件仅仅作为文件在整个java里面占据了次要的地位,而本地执行则被忽视?

要执行一个jar文件,你可以使用java命令的-jar选项。举一个例子来说,假如你有个名叫myjar.jar的文件。这个jar是可以运行的,你可以运行它:java -jar myjar.jar.另外一个办法就是,当java runtime environment(jre)已经被安装到一个像windows的操作系统上,将jar文件与jvm关联(关联java.exe跟jar文件)在一起你就可以通过双击jar来运行这个应用程序。当然,jar文件必须是可执行的。

现在的问题是:如何做一个可以执行的jar?

manifest文件以及main-class入口

在大多数jar中,都在一个叫meta-inf的目录里面保存了一个叫manifest.mf的文件。那个文件里面,

包含了一个特殊表项名字叫main-class,告诉java -jar命令应该执行哪个class.
问题是你必须为manifest文件手工加入适当表项,而且必须在一定的位置和用一定的格式。不幸的是,不是每个人都喜欢打开写字板编辑配置文件。

让api帮你完成任务

自从java1.2发布以来,一个叫java.uil.jar包的出现,让你能够方便处理jar文件。(注意:该包基于java.util.zip)特别地,jar包让你通过mainfest类,可以容易操作那些manifest文件.

就让我们用这个api写一个程序吧。首先,这个程序必须知道三样东西:

1。我们要使之可运行的jar文件。
2。运行jar的主类(这个类必须包含在jar中)。

3。输出新jar文件的文件名,因为我们不能简单地覆盖原来的文件。

编写程序

上面列表的三点要求将组成我们的程序的参数。现在,让我们为这个程序选择一个适当的名字。

makejarrunnable听起来觉得怎样?

为main方法检查参数

假设我们的main方法入口点是一个标准的main(string[])方法。我们应该这样检查程序的参数:

if (args.length != 3) {
system.out.println("usage: makejarrunnable " + "<jar file> <main-class><output>");

system.exit(0);

}

请注意参数列表是如何描述的,因为这在以下代码中是很重要的。参数的次序和内容不是固定的;

然而,如果你要改变他们的话,要记住响应修改其他代码。

访问jar和jar的manifest文件

第一,我们必须创建一些了解jar和manifest的对象:

//create the jarinputstream object, and get its manifest

jarinputstream jarin = new jarinputstream(new fileinputstream(args[0]));

manifest manifest = jarin.getmanifest();

if (manifest == null) {

//this will happen if no manifest exists

manifest = new manifest();

}

设置main-class属性

我们把main-class入口放到manifest文件的main属性部分。一旦从manifest对象获得这个属性,就可以设置需要的main class。然而,如果main-class属性已经存在原来的jar当中又如何呢?这里我们只是简单地输出一个警告然后退出。我们能加入一个命令行参数告诉程序使用新的值,而代替了旧的那个:

attributes a = manifest.getmainattributes();

string oldmainclass = a.putvalue("main-class", args[1]);

//if an old value exists, tell the user and exit

if (oldmainclass != null) {

system.out.println("warning: old main-class value is: "

+ oldmainclass);

system.exit(1);

}

输出新的jar

我们需要创建一个新的jar文件,所以我们必须使用jaroutputstream类。注意:

我们必须确定我们不用跟输入文件相同的名字作为输出文件的名字。还有一个方案就是,程序应该考虑到一种情况,就是两个jar文件都是相同的,促使用户覆盖原来的文件,如果他愿意这么做的话。然而,我在保留了这一点,作为读者的一个练习。从如下代码开始:

system.out.println("writing to " + args[2] + "...");

jaroutputstream jarout = new jaroutputstream(new fileoutputstream(args[2]),manifest);

我们必须从输入jar写每个表项到输出的jar,所以迭代每个表项:

//create a read buffer to transfer data from the input

byte[] buf = new byte[4096];

//iterate the entries

jarentry entry;

while ((entry = jarin.getnextjarentry()) != null) {

//exclude the manifest file from the old jar

if ("meta-inf/manifest.mf".equals(entry.getname())) continue;

//write the entry to the output jar

jarout.putnextentry(entry);

int read;

while ((read = jarin.read(buf)) != -1) {

jarout.write(buf, 0, read);

}

jarout.closeentry();

}

//flush and close all the streams

jarout.flush();

jarout.close();

jarin.close();

完成程序

当然,我们必须把这些代码放到一个类的main方法里面,并且需要一大堆import代码。完整程序:

http://www.javaworld.com/javaworld/javatips/javatip127/makejarrunnable.zip

程序使用例子

让我们把这个程序应用到一个例子里面来。假设你有一个应用程序,该程序的入口点是一个叫hellorunnableworld的 类,再假设你已经创建了一个jar叫myjar.jar,包含了整个程序。运行makejarrunnable:

java makejarrunnable myjar.jar hellorunnableworld myjar_r.jar

正如前面提到的,注意一下我的参数顺序。如果你忘记了顺序,没有参数运行一下程序,它会响应出现一个 用法提示信息。

尝试对myjar.jar运行java -jar命令。然后对myjar_r.jar。注意区别不同!好了,你完成了这一切了, 浏览一下每个jar的manifest文件(meta-inf/manifest.mf)
 
 
上一篇: 直取sun大本营,ibm发表linux服务器    下一篇: 致 java 爱好者
  相关文档
如何避免程序中的死锁 11-17
用j2se 1.4进行internet安全编程(三) 11-17
weblogic 9.1的domain配置mysql连接池 11-16
sl-285 课程简介 11-16
php 5.2.8 紧急发布 修复5.2.7严重漏洞 12-09
nokia suite 3.0 for j2me功能介绍 11-17
window.open()代替window.showmodaldialog() 11-16
decodeuricomponent 方法 11-16
spring jdbc抽象框架简化web数据库开发 11-17
ejb轻松进阶之七 11-16
java学习:j2me中的内存泄漏 11-16
jakarta poi 3.0—访问微软office格式java api 11-17
java程序员需要了解的几个开源协议 11-17
jndi设计内幕 11-17
新手入门 eclipse插件的安装与配置 11-17
microsoft .net与j2ee的比较[e] 11-16
[java100例]078、播放声音 11-17
java指南之使用图形:动画 11-17
eclipse3.1中体验j2se 5.0之枚举类型 11-16
java中四种xml解析技术之不完全的测试 01-11
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息