- 浏览: 1507067 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (595)
- Java咖啡厅 (208)
- IT杂侃 (23)
- 程序员笑话 (7)
- 我的后现代文学 (1)
- WEB编程 (116)
- 软件评测 (8)
- 操作系统 (3)
- 炫目Ruby (2)
- 行业知识 (7)
- 我的动漫情结 (6)
- 其他 (8)
- Window DIY (6)
- 古文学 (3)
- 转载文章 (2)
- IT百科 (7)
- 动态网页Active (1)
- 文档 (1)
- 设计理论 (11)
- .NET 快速开发 (18)
- 英语学习 (6)
- 网站分析 (2)
- 开源软件 (4)
- 数据库 (28)
- 笔记 (4)
- 源代码共享 (8)
- IT人物 (2)
- 软件管理 (10)
- 小说创作 (0)
- 大众软件 (12)
- 网站评论 (3)
- 小虾乱说 (10)
- 游戏 (8)
- 心情 (3)
- 娱乐休闲 (2)
- Delphi编程 (1)
- PHP编程 (4)
- 中间件 (2)
- 移动开发 (2)
- Office应用 (2)
- Photoshop (1)
- Eclipse (5)
- 面试题 (1)
- 手机评测 (0)
- VBScript (1)
- WEB前端-EXT (3)
- 吐槽 (1)
- Java咖啡厅 Ibatis (1)
- javascript Ext (1)
- jquery ui (1)
- require (1)
- WEB编程 Javascript (1)
- jquery (1)
- Swing (1)
- 分布式 (1)
最新评论
-
zhangjihao:
28. 下面哪个Set是排序的? A. LinkedHas ...
Java面试题(选择题) -
zhangthe9:
ICMP报文被封装在IP包里,也就是说他是由IP协议承载的,从 ...
Java面试题(选择题) -
zhunengfei:
真的假的?
自已写的jquery ui框架 -
white_crucifix:
少年,发烫是所有智能手机的特点,而莫名发烫是所有安卓手机的特点 ...
【吐槽】三星手机的OS是一砣屎 -
suzu88:
试了一下,可以用。如果美化一下控件和窗体更有意思。
一个用XML构建Swing视图的框架
1.创建相关
\>jar cf jar-file input-file(s)
/*
说明,windows下和UNIX下对目录结构的分隔符习惯不同,前者为\,后者为/ ,本文仅仅为了说明问题,并不严格加以说明。——注意,无论任何平
台,在manifest文件中均采用/
*/
/*
该形式的命令在当前目录下创建一个jar-file
c开关指明“创建”一个jar文件
f开关指明输出到文件,而不是stdout(标准输出)
jar-file如果不指明后缀,则默认为*.jar
空格用于分隔多个输入文件,可以使用通配符“*”
有必要时指明目录
开关出现的顺序不重要,但是如果有m开关则另当别论。
该命令默认创建一个manifest文件
*/
/*
对于java版本1,jar文件仅支持ASCII作文件名,java版本2则支持UTF-8编码的文件名。
*/
/*
关于创建,可用的其他开关:
v 当jar文件创建时,在stderr(java版本1)或stdout(java版本2)产生冗余(verbose)输出。报告添加到jar的文件名录。
0 (zero)指明不要压缩。
M 指明不要产生默认的manifest文件。
m 添加手工已编制好的manifest文件:
\>jar cmf existing-manifest jar-file input-file(s)
-C 在操作过程中转变目录(仅对java版本2)。
*/
/*
一个例子。
假设,如下目录结构(windows下):
TicTacToe\TicTacToe.class (文件)
TicTacToe\audio (子目录,该层下全是au文件)
TicTacToe\images (子目录,该层下全是gif文件)
如果要将该东东压入jar文件TicTacToe.jar,应在TicTacToe目录中(!)执行下面命令:
TicTacToe>jar cvf TicTacToe.jar TicTacToe.class audio images
jar程序会自动将audio和images目录及其子目录一咕脑(recursively)全压入TicTacToe.jar文件,该文件将出现于 TicTacToe\TicTacToe.jar
因为使用了verbose output开关,可以看到类似如下的输出:
adding: TicTacToe.class (in=3825) (out=2222) (deflated 41%)
adding: audio/ (in=0) (out=0) (stored 0%)
adding: audio/beep.au (in=4032) (out=3572) (deflated 11%)
adding: audio/ding.au (in=2566) (out=2055) (deflated 19%)
adding: audio/return.au (in=6558) (out=4401) (deflated 32%)
adding: audio/yahoo1.au (in=7834) (out=6985) (deflated 10%)
adding: audio/yahoo2.au (in=7463) (out=4607) (deflated 38%)
adding: images/ (in=0) (out=0) (stored 0%)
adding: images/cross.gif (in=157) (out=160) (deflated -1%)
adding: images/not.gif (in=158) (out=161) (deflated -1%)
如果:
TicTacToe>jar cvf0 TicTacToe.jar TicTacToe.class audio images
则表示只备份不压缩。
如果该目录内全是需要jar掉的文件及其相应目录结构:
TicTacToe>jar cvf TicTacToe.jar *
是比较简洁的写法。
如果不特别使用开关m或M,默认的manifest文件将产生于
META-INF/MANIFEST.MF
继承了GZIP的特点,-C开关用于跳到某目录,以改变所存入jar文件的目录结构。多半用于将原来位于不同目录结构的文件作jar时聚合在一起。例如:
TicTacToe>jar cf ImageAudio.jar -C images . -C audio .
产生的jar文件内容和结构:
META-INF/MANIFEST.MF
cross.gif
not.gif
beep.au
ding.au
return.au
yahoo1.au
yahoo2.au
(现在假设我们images子目录下还有子目录,像这样:
TicTacToe\images\jpg
jpg子目录下还有一些*.jpg文件那以上命令的结果应该是:
META-INF/MANIFEST.MF
jpg/AMAKUSA.jpg
jpg/UKYO.jpg
cross.gif
not.gif
beep.au
ding.au
return.au
yahoo1.au
yahoo2.au
说明了-C的真正含义。
)
*/
2.关于查看jar内容
\>jar tf jar-file
/*
t 开关指明jar文件的内容表(table of contents)。
f 开关指明该jar文件由命令行指出,如果不用该开关,jar则在stdin中期待一个文件名。
t和f出现的顺序无关,但是之间不能有空格。
该命令向stdout输出相应jar文件的内容表。
v 开关可以用于查看关于文件大小、最近更改日期等等详细内容。
*/
/*
例子。
TicTacToe>jar tf TicTacToe.jar
将在标准输出中看到:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
注意,无论在任何操作系统下(windows、Linux或Unix)所有文件结构均以正斜杠/(forward slash)分隔。而在jar文件中的路径显示都是相对
(relative)的。
又例。
TicTacToe>jar tvf TicTacToe.jar
显示如下:
256 Mon Apr 20 10:50:28 PDT 1998 META-INF/MANIFEST.MF
3885 Mon Apr 20 10:49:50 PDT 1998 TicTacToe.class
0 Wed Apr 15 16:39:32 PDT 1998 audio/
4032 Wed Apr 15 16:39:32 PDT 1998 audio/beep.au
2566 Wed Apr 15 16:39:32 PDT 1998 audio/ding.au
6558 Wed Apr 15 16:39:32 PDT 1998 audio/return.au
7834 Wed Apr 15 16:39:32 PDT 1998 audio/yahoo1.au
7463 Wed Apr 15 16:39:32 PDT 1998 audio/yahoo2.au
0 Wed Apr 15 16:39:44 PDT 1998 images/
157 Wed Apr 15 16:39:44 PDT 1998 images/cross.gif
158 Wed Apr 15 16:39:44 PDT 1998 images/not.gif
*/
3. 释放文件
\>jar xf jar-file [archived-file(s)]
/*
x 开关是“释放文件”的标志
f 开关指明是由命令行提供待释放jar文件的文件名,而不是stdin
jar-file 可以是一个带有路径的文件
[archived-file(s)] 指出期待释放的内容,如果略去这个参数,则将jar-file中的内容完全释放。
释放之后,原jar文件保持不变。
注意,当释放文件时,jar会覆盖目标目录下同名的文件(但之下不同名的目录和文件不会被洗掉(——覆盖的原则!))。
*/
/*
例子。
TicTacToe>jar xf TicTacToe.jar TicTacToe.class images/cross.gif
该命令做两件事情:
在当前目录下产生一个TicTacToe新的拷贝。
在当前目录下产生子目录images,并在其下产生一个cross.gif新的拷贝。如果该目录已经存在,则只作后一个动作。
可以用命令:
TicTacToe>jar xf TicTacToe.jar
释放整个TicTacToe.jar文件。
*/
4.jar归档和相应描述文件(manifest file)
jar归档实现多种功能,例如electronic signing, version control, package sealing, extensions。其中的 manifest文件发生了不可替
代的作用。
manifest像一个归档内容清单。(The manifest is a special file that can contain information about the files packaged in a JAR file.
)
manifest文件的默认和定制方法前面已经描述,下面看内容。
默认的MANIFEST.MF(java版本2制造):
————————————
Manifest-Version: 1.0
————————————
可见,manifest文件的表项形式为"header: value",由默认产生的manifest文件表项(entry)只包括描述manifest自身的一项(版本)。
java版本1和java版本2都对应相同的manifest标准(manifest版本一)。但是,两个java版本的jar产生的默认manifest文件却是不同的。如果是java版
本1,则产生MANIFEST.MF如下形式:
————————————
Manifest-Version: 1.0
Name: java/math/BigDecimal.class
SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=
MD5-Digest: z6z8xPj2AW/Q9AkRSPF0cg==
Name: java/math/BigInteger.class
SHA1-Digest: oBmrvIkBnSxdNZzPh5iLyF0S+bE=
MD5-Digest: wFymhDKjNreNZ4AzDWWg1Q==
————————————
可见,java版本1的MANIFEST.MF对jar包中每一个文件都有所描述,表项包括文件的路径名(pathname)和摘要值(digest value,指由文件内容产生
的某种哈希密文)。——注意Name和Digest之间没有空行。
这里的摘要值一般用于对jar文件签名(sign),但由于它不是总是很有必要,于是在java版本2中将其省掉了。(也是为了更好地将功能结构化。)
一言以蔽之,manifest记录什么样的文件信息完全取决于jar包的用途。(Exactly what file information is recorded in the manifest will
depend on what use you intend for the JAR file.)你可以根据jar文件打算扮演的何种角色,来修改manifest文件。
如果仅仅将jar用作一种简单的压缩方式(像一种zip),则不必关心manifest文件。
manifest用作特定用途(以下仅对java版本2):
1)java应用程序(application)以jar文件形式捆绑(bundle)
表项 Main-Class: classname 指明程序的入口(entry point)——即含有方法public static void main(String[] args){}的类。
2)下载扩展(Download Extensions)
下载扩展是指被其他jar文件的manifest文件所引用的jar文件(http://java.sun.com/docs/books/tutorial/ext/index.html)。
举典型一例,某个applet会被捆绑在一个jar文件内,该jar的manifest引用(指向)了一个或多个其他jar文件(这些文件serve as an extension(or
extensions) for the purpose of that applet)。当然,扩展之间可以相互引用。
下载扩展由引用者的相应manifest文件以Class-Path为头部(header field)的表项指明,例如:
Class-Path: servlet.jar infobus.jar acme/beans.jar
注意,The URLs in the Class-Path header are given relative to the URL of the JAR file of the applet or application.
3)包密封(Package Sealing)
这是指定义在同一个package内的所有的class都打包在同一个jar文件内。这样,可以保证版本一致性(version consistency)或者作为一种安全措施
(security measure)——避免默认的package可视性(当前目录.加入classpath之后)。
Seal一个包,格式如此:
————————————————
Name: myCompany/myPackage/
Sealed: true
————————————————
Name头(head)的值(value)指明该包对应的相对路径名(代码中"package myCompany.myPackage;")。(注意,它以/结尾以区别于文件名)。
4)包版本控制(Package Versioning)
参见 http://java.sun.com/products/jdk/1.2/docs/guide/versioning/spec/VersioningSpecification.html#PackageVersioning
一个例子。
————————————————
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
————————————————
关于manifest格式的specification:
http://java.sun.com/products/jdk/1.2/docs/guide/jar/manifest.html
下面有关jar工具的m开关的说明。
如果要使用m开关,则先要准备一个用作manifest的文本文件。m开关的意思是合并(merge),作用是将该文件的内容(!)附加在默认的(或者已有
的)manifest之上(注意不是替换!)。
\>jar cmf manifest-addition jar-file input-file(s)
\>jar cfm jar-file manifest-addition input-file(s)
产生同样的结果,注意开关和参数的对应关系!
一个例子,用以说明jar、manifest和package的seal……
假设jar文件准备包含下列package(注意package没有进行jar时和目录是对应的):
myCompany/firstPackage/
myCompany/secondPackage/
myCompany/thirdPackage/
myCompany/fourthPackage/
如果要seal了firstPackage和thirdPackage,应该写一个这样的manifest:
sealInfo
————————————————
Name: myCompany/firstPackage/
Sealed: true
Name: myCompany/thirdPackage/
Sealed: true
————————————————
注意,该文本文件需要以一对回车换行结束,否则难通过parse程序。
设当前目录为myCompany的父目录。则,
>jar cmf sealInfo myJar.jar myCompany
在myJar.jar中产生了如下的manifest文档:
————————————————
Manifest-Version: 1.0
Name: myCompany/firstPackage/
Sealed: true
Name: myCompany/thirdPackage/
Sealed: true
————————————————
其中,第一行来自默认manifest,其他来自手工添加。
5.更新jar文件
java版本2的u开关用于更新已存在的jar文件(通过修改他的manifest或者增添新的文件)。
\>jar uf jar-file input-file(s)
u开关指明更新一个已存在的jar文件。
input-file(s)是将要add进jar-file里的文件列表,以空格分隔。
用这个命令,jar-file里同名同路径的文件将被覆盖。
正如前面创建jar文件所述,可以用-C开关转换路径。
\>jar umf manifest1 jar-file
该命令归并manifest1到jar-file的manifest文件中。
一个例子。
TicTacToe.jar有如下内容:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
设将要向jar归档中加入images/new.gif,应该在images的父目录中执行:
TicTacToe>jar uf TicTacToe.jar images/new.gif
则修改过的jar归档应该有如下内容:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
images/new.gif
如果,
TicTacToe>jar uf TicTacToe.jar -C images new.gif
该命令会在添加new.gif文件前先转到目录images,归档结果就不会将images路径包括进去了。结果:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
new.gif
最后,假设想更改TicTacToe.jar的manifest文件(添加一些版本和销售商信息),应该先准备如下文本文档:
versionInfo
————————————————
Name: TicTacToe.class
Implementation-Title: "TicTacToe demo"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
————————————————
然后,
TicTacToe>jar umf versionInfo TicTacToe.jar
更新就搞定啦。
6.执行以jar归档的软件
三种情况:
1)jar归档了applet,被浏览器浏览
2)jar归档了application,在命令行调用
3)jar包含了将被用以扩展(extension)的代码
(前两种情况将在下面描述,3)参见URL: http://java.sun.com/docs/books/tutorial/ext/index.html)
对于applet,html中如下例:
————————————————
<applet code=TicTacToe.class
width=120 height=120>
</applet>
————————————————
如果该class在jar归档内,用参数archive:
————————————————
applet code=TicTacToe.class
archive="TicTacToe.jar"
width=120 height=120>
</applet>
————————————————
如果该jar和该html不在同一目录下,而在当前目录的子目录applets下,
————————————————
<applet code=TicTacToe.class
archive="applets/TicTacToe.jar"
width=120 height=120>
</applet>
————————————————
对于application,在java版本1的平台上。
可以使用jre工具:
\>jre -cp app.jar MainClass
-cp 开关将app.jar预添加到系统classpath中。
如果是在java版本2的平台上。
\>java -jar jar-file
注意,java版本2之前的java命令不支持-jar开关。
当然,runtime environment必需知道程序的入口点(Mainclass)。前面说过,这是manifest的任务了。在manifest中:
Main-Class: classname
例如:
————————————————
Main-Class: HelloWorld
————————————————
发表评论
-
原创程序- Web版数据库管理
2017-11-15 00:39 1177这是我自已写的Web版的数据库管理工具,主要是依赖于JDBC ... -
Eclipse创建Web项目
2017-07-29 10:53 7751. 打开创建Web项目的对话框 2 ... -
Ant常用的命令
2016-06-16 13:31 13481. 使用Ant生成War包: <war ... -
在Eclipse上使用Ant发布项目
2015-10-17 15:03 1370这里笔者使用是Eclip ... -
Resin中增加一个虚拟目录的方法
2015-09-13 12:53 1113打开resin.config 找到到<h ... -
一个用XML构建Swing视图的框架
2015-09-06 23:12 2600平常想用Java写一些 ... -
Eclipse常见问题
2015-08-24 19:41 738如果Eclipse被强制关闭时,Tomcat可能没有 ... -
Spring Tools Suite 入门教程
2015-05-09 09:15 0Spring Tools Suit,这里简称STS,是 ... -
使用FTP的方法
2015-03-01 17:49 9991. FlashFXP 收费的软件,但是比较好 ... -
关于Spring
2015-02-16 14:46 1998Spring是一个轻量级J2EE框架。 Sp ... -
用Java实现发送邮件到163
2014-12-28 14:50 3851/* 在java版经常看到有人问如何用javamai ... -
Hibernate入门
2014-12-27 01:34 925前言 使用面向对象的语言和关系型的数据库,开 ... -
修改date.toLocaleString()的警告
2014-10-15 11:31 2546我们在写程序的时候,经常要查看时间,所以我们经常会用到 ... -
Java基础题 -- 简述题
2014-04-26 13:44 726(1)简述Java的运行机制 答案:Java语言根 ... -
Java基础题 -- 填空题
2014-04-26 10:00 18851. ______是一个抽象的计算机,和实际的计算机一样, ... -
FreeMaker入门
2014-04-07 19:51 1010第一章 简介 1 什么是FreeMaker ... -
jdk8 新语法
2014-04-01 23:32 1279import java.util.*; public ... -
MyBatis 入门
2014-03-27 23:31 1721每个MyBatis的中心是SqlSessionFact ... -
Jetty入门
2014-02-26 23:48 1577Jetty是一个简易的WebServer框架,使用 ... -
用Swing做的H2管理器
2014-02-24 23:07 1566MainFrame 继承了 JFrame , 增加c ...
相关推荐
**JAR文件读取工具详解** Java Archive (JAR) 文件是Java平台上的一个重要组成部分,它主要用于打包Java类、资源文件以及元数据。JAR文件的出现使得Java开发者能够将多个类文件组合成一个单一的可执行文件,方便...
其中,`MANIFEST.MF`文件记录了JAR文件的基本属性信息。 #### 二、创建可执行的JAR文件包 创建可执行的JAR文件包是Java程序发布过程中的一个重要环节,它使得用户可以通过双击文件的方式启动Java程序,极大地提高...
但如果在使用第三方库进行文件操作(如Apache Commons IO、Guava等),则需要将对应的JAR文件添加到项目类路径中。例如,Apache Commons IO库提供了许多方便的文件操作工具类,如`org.apache.commons.io.FileUtils`...
生成Jar文件的基本命令格式如下: ```bash jar cf jar_file_name [-C dir] file(s) ``` - `c`:表示创建新的Jar文件。 - `f`:指定生成的Jar文件名。 - `jar_file_name`:是你想要生成的Jar文件的名称,包括路径和...
标题中的“jd_gui工具直接打开jar文件,显示源代码”是指使用JD-GUI这款软件来查看Java可执行jar包中的源代码。JD-GUI是一款独立的图形化工具,它允许开发者查看Java字节码反编译后的源代码,这对于调试、学习或者...
"TXT文件转为JAR文件的转换器"是一个工具,它允许用户将纯文本文件(TXT)转换成Java Archive(JAR)文件。这种转换在Java开发环境中非常有用,因为JAR文件是Java应用程序或库的打包形式,便于分发和执行。 TXT文件...
使用`jar`命令行工具,可以通过以下基本语法创建JAR文件: ``` jar cvfm JarFileName.jar ManifestFile [-C Dir] Files... ``` 其中,`cvfm`参数分别代表创建(c)、添加到归档文件(v)、指定manifest文件(f...
jar命令是Java开发工具箱中的一个命令行工具,用于创建、管理和操作JAR文件包。jar命令的基本语法如下: jar [-options] [jar-file] [manifest-file] [input-files] 其中,options是jar命令的选项,jar-file是生成...
总之,编译和打包JAR文件是Java开发者的基本技能,通过熟练掌握这一过程,你可以更有效地管理和分发你的Java应用程序。在实践中,结合使用构建工具和优化策略,可以提高开发效率并确保代码的质量。
将class文件打包成jar文件是Java开发中常见的需求,尤其在使用WebService的SOAP协议时,为了实现远程调用,往往需要将本地的类文件(.class)打包成jar包进行分发。本文将深入探讨这一过程,包括手动压缩和利用...
`JarFile`类是核心类,它允许我们打开并操作JAR文件。在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数...
【标题】"jar文件管理器 模拟文件管理"是一个基于Java编程语言开发的应用程序,主要目的是实现对文件和文件夹的基本操作。这个系统利用了Java的jar打包技术,将所有必要的类和资源打包成一个可执行的jar文件,使得...
### 生成可执行JAR文件的详细教程 #### 一、引言 在Java开发过程中,经常需要将项目打包成可执行的JAR文件,以便于分发和部署。本教程将详细介绍如何通过CMD命令行生成一个可执行的JAR文件。 #### 二、准备工作 在...
通过理解JAR文件的基本结构,掌握`jar`命令的使用,我们可以轻松地创建出可执行的JAR文件,这对于部署Java应用程序至不同的平台有着重要的意义。希望本文能帮助开发者们更高效地进行Java项目打包工作。
这三个jar文件分别提供了基本的JSON解析功能、数据绑定和注解支持。如果使用Gson库,那么需要的jar文件就是`gson.jar`。 在标签中,连续出现了三次"json",这可能意味着这个压缩包包含的是一个通用的JSON处理库,如...
**jar文件查看工具详解** 在Java开发环境中,`jar`文件是常见的二进制格式,用于打包类文件、资源文件以及元数据。`jar`文件的全称是Java Archive,它是Java平台的标准打包机制,类似于其他编程语言中的库或者DLL...
以下是这12个基本JAR文件的作用和相关知识点: 1. **struts2-core.jar**:这是Struts2的核心库,包含了所有必需的类和接口,如Action、Result、Interceptor等。它定义了框架的基本工作流程,并提供了控制器的功能。...
### Java入门:生成可执行JAR文件的详细教程 #### 标题与描述解析 本教程旨在引导初学者了解如何生成可执行的JAR文件,从而掌握Java的基础编程技能。对于初学者而言,掌握如何打包自己的Java程序为一个可执行的JAR...
使用这两个库进行文件上传的基本步骤如下: 1. **初始化解析器**:创建一个`ServletFileUpload`实例,设置最大上传大小和临时文件目录。 2. **检查请求**:调用`isMultipartContent`方法判断请求是否包含文件。 3...