关于作者

姓名:拓塔小李天王

性别:男

出生日期:1983-01-09

地区:江苏-扬州

联系电话:

QQ:52347454婚否:未婚
用户名:ttt3278
笔名:拓塔小李天王
地区: 江苏-扬州
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



我亲爱的朋友

美丽的blog

天下

hoho

访问统计:
文章个数:70
评论个数:67
留言条数:26




Powered by BlogDriver 2.1

珍重芳姿昼掩门

欢迎来到我的空间

文章

linux学习笔记(下)

vi一般用法
一般模式              编辑模式                  指令模式
h 左               a,i,r,o,A,I,R,O             :w 保存
j 下                进入编辑模式                :w! 强制保存
k 上                dd 删除光标当前行           :q! 不保存离开
l 右                ndd 删除n行                 :wq! 保存后离开
0 移动到行首        yy 复制当前行                :e! 还原原始档
$ 移动到行尾        nyy 复制n行                  :w filename 另存为
H 屏幕最上          p,P 粘贴                     :set nu 设置行号
M 屏幕中央          u  撤消                      :set nonu 取消行号
L 屏幕最下          [Ctrl]+r 重做上一个动作       ZZ 保存离开
G 档案最后一行      [ctrl]+z 暂停退出            :set nohlsearch   永久地关闭高亮显示
/work 向下搜索                                   :sp 同时打开两个文档
?work 向上搜索                                   [Ctrl]+w 两个文档设换
gg 移动到档案第一行                              :nohlsearch    暂时关闭高亮显示
 认识SHELL
alias    显示当前所有的命令别名      alias lm="ls -al"   命令别名    unalias lm 取消命令别名
type      类似which
exprot    设置或显示环境变量
exprot PATH="$PATH":/sbin  添加/sbin入PATH路径
echo $PATH    显示PATH路径
bash      进入子程序
name=yang     设定变量
unset name    取消变量
echo $name    显示变量的内容
myname="$name its me"   &   myname='$name its me'     单引号时$name失去变量内容
ciw=/etc/sysconfig/network-scripts/     设置路径
env      列出所有环境变量
echo $RANDOM    显示随意产生的数
set      设置SHELL
PS1='[\u@\h \w \A #\#]\$ '     提示字符的设定
   [root@linux ~]# read [-pt] variable     -----------读取键盘输入的变量
   参数:
   -p  :后面可以接提示字符!
   -t  :后面可以接等待的『秒数!』
declare    声明 shell 变量
ulimit -a   显示所有限制资料
 ls /tmp/yang && echo "exist" || echo "not exist"
 意思是说,当 ls /tmp/yang 执行后,若正确,就执行echo "exist" ,若有问题,就执行echo "not exist"
 echo $PATH | cut -d ':' -f 5       以:为分隔符,读取第5段内容
 export | cut -c 10-20      读取第10到20个字节的内容
 last | grep 'root'    搜索有root的一行,加[-v]反向搜索
 cat /etc/passwd | sort    排序显示
 cat /etc/passwd | wc      显示『行、字数、字节数』


正规表示法
[root@test root]# grep [-acinv] '搜寻字符串' filename
       参数说明:
       -a :将 binary 档案以 text 档案的方式搜寻资料
       -c :计算找到 '搜寻字符串' 的次数
       -i :忽略大小写的不同,所以大小写视为相同
       -n :顺便输出行号
       -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
 grep -n 'the' 123.txt     搜索the字符 -----------搜寻特定字符串      
 grep -n 't[ea]st' 123.txt    搜索test或taste两个字符---------利用 [] 来搜寻集合字符
 grep -n '[^g]oo' 123.txt     搜索前面不为g的oo-----------向选择 [^]
 grep -n '[0-9]' 123.txt  搜索有0-9的数字
 grep -n '^the' 123.txt 搜索以the为行首-----------行首搜索^
 grep -n '^[^a-zA-Z]' 123.txt  搜索不以英文字母开头
 grep -n '[a-z]$' 123.txt    搜索以a-z结尾的行---------- 行尾搜索$
 grep -n 'g..d' 123.txt     搜索开头g结尾d字符----------任意一个字符 .
 grep -n 'ooo*' 123.txt     搜索至少有两个oo的字符---------重复字符 *
sed    文本流编辑器    利用脚本命令来处理文本文件
awd    模式扫描和处理语言
 nl 123.txt | sed '2,5d'   删除第二到第五行的内容
diff     比较文件的差异
cmp      比较两个文件是否有差异
patch    修补文件
pr       要打印的文件格式化
 
帐号管理
/etc/passwd  &nbp; 系统帐号信息
/etc/shadow    帐号密码信息    经MD5 32位加密
     在密码栏前面加『 * 』『 ! 』禁止使用某帐号
/etc/group     系统群组信息
/etc/gshadow
newgrp    改变登陆组
useradd  &  adduser    建立新用户  ---------> useradd -m test  自动建立用户的登入目录
          useradd -m -g pgroup test --------->指定所属级
/etc/default/useradd   相关设定
/etc/login.defs       UID/GID 有关的设定
passwd    更改密码 -----------> passwd test
usermod   修改用户帐号
userdel   删除帐号 ----------->userdel -r test
chsh      更换登陆系统时使用的SHELL   [-l]显示可用的SHELL;[-s]修改自己的SHELL
chfn      改变finger指令显示的信息
finger    查找并显示用户信息
id        显示用户的ID ----------->  id test
groupadd   添加组
groupmod   与usermod类似
groupdel   删除组
su test    更改用户   su -    进入root,且使用root的环境变量
sudo       以其它身份来执行指令
visudo     编辑/etc/sudoers      加入一行『 test ALL=(ALL) ALL 』
           %wheel ALL = (ALL) ALL               系统里所有wheel群组的用户都可用sudo
           %wheel ALL = (ALL) NOPASSWD: ALL     wheel群组所有用户都不用密码NOPASSWD
       User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3         加入ADMPW组
       ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
       !/usr/bin/passwd root      可以更改使用者密码,但不能更改root密码 (在指令前面加入 ! 代表不可)
PAM (Pluggable Authentication Modules, 嵌入式模块)
who & w     看谁在线                    
last        最近登陆主机的信息
lastlog     最近登入的时间    读取 /var/log/lastlog
talk        与其它用户交谈
write       发送信息    write test   [ctrl]+d 发送
mesg        设置终端机的写入权限    mesg n 禁止接收     mesg y
wall        向所有用户发送信息    wall this is q test
mail        写mail  
/etc/default/useradd    家目录默认设置
quota      显示磁盘已使用的空间与限制     quota -guvs ----->秀出目前 root 自己的 quota 限制值
           quota -vu   查询
quotacheck   检查磁盘的使用空间与限制     quotacheck -avug  ----->将所有的在 /etc/mtab 内,含有 quota 支持的 partition 进行扫瞄
             [-m] 强制扫描 
     quota一定要是独立的分区,要有quota.user和quota.group两件文件,在/etc/fstab添加一句:
     /dev/hda3 /home ext3 defaults,usrquota,grpquota 1 2
     chmod 600 quota*         设置完成,重启生效
edquota    编辑用户或群组的quota  [u]用户,[g]群组,[p]复制,[t]设置宽限期限
           edquota -a yang       edquota -p yang -u young ----->复制   
quotaon    开启磁盘空间限制     quotaon -auvg -------->激活所有的具有 quota 的 filesystem
quotaoff   关闭磁盘空间限制     quotaoff -a  -------->关闭了 quota 的限制
repquota -av     查阅系统内所有的具有 quota 的 filesystem 的限值状态
Quota 从开始准备 filesystem 的支持到整个设定结束的主要的步骤大概是:
1、设定 partition 的 filesystem 支持 quota 参数:
由于 quota 必须要让 partition 上面的 filesystem 支持才行,一般来说, 支持度最好的是 ext2/ext3 ,
其它的 filesystem 类型鸟哥我是没有试过啦! 激活 filesystem 支持 quota 最简单就是编辑 /etc/fstab ,
使得准备要开放的 quota 磁盘可以支持 quota 啰;
2、建立 quota 记录文件:
刚刚前面讲过,整个 quota 进行磁盘限制值记录的档案是 aquota.user/aquota.group,
要建立这两个档案就必须要先利用 quotacheck 扫瞄才行喔!
3、编辑 quota 限制值资料:
再来就是使用 edquota 来编辑每个使用者或群组的可使用空间啰;
4、重新扫瞄与激活 quota :
设定好 quota 之后,建议可以再进行一次 quotacheck ,然后再以 quotaon 来激活吧!

开机流程简介
1、加载 BIOS 的硬件信息,并取得第一个开机装置的代号;
2、读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的开机信息;
3、加载 Kernel 操作系统核心信息, Kernel 开始解压缩,并且尝试驱动所有硬件装置;
4、Kernel 执行 init 程序并取得 run-level 信息;
5、init 执行 /etc/rc.d/rc.sysinit 档案;
6、激活核心的外挂模块 (/etc/modprobe.conf);
7、init 执行 run-level 的各个批次档( Scripts );
8、init 执行 /etc/rc.d/rc.local 档案;
9、执行 /bin/login 程序,并等待使用者登入;
10、登入之后开始以 Shell 控管主机。
在/etc/rc.d/rc3.d内,以S开头的为开机启动,以K开头的为关闭,接着的数字代表执行顺序
GRUB vga设定
彩度\分辨率  640x480  800x600  1024x768  1280x1024   bit
    256        769      771      773       775      8 bit
   32768       784      787      790       793     15 bit
   65536       785      788      791       794     16 bit
   16.8M       786      789      792       795     32 bit

./configure    检查系统信息       ./configure --help | more  帮助信息
make clean     清除之前留下的文件
make           编译
make install   安装
rpm -q  ----->查询是否安装             rpm -ql ------>查询该套件所有的目录
rpm -qi ----->查询套件的说明资料       rpm -qc[d] ----->设定档与说明档
rpm -ivh  ---->安装                    rpm -V  -------->查看套件有否更动过
rpm -e  ------>删除                    rpm -Uvh ------->升级安装 
--nodeps ----->强行安装             &nbs;  --test ----->测试安装

- 作者: 拓塔小李天王 2007年04月1日, 星期日 10:10  回复(2) |  引用(0) 加入博采

linux学习笔记(上)

http://blog.chinaunix.net/u/30619/showart.php?id=249558

linux目录架构
/  
根目录
/bin   
常用的命令 binary file 的目录
/boot  
存放系统启动时必须读取的档案,包括核心 (kernel) 在内
     /boot/grub/menu.lst   GRUB
设置
     /boot/vmlinuz  
内核
     /boot/initrd    
核心解压缩所需 RAM Disk
/dev   
系统周边设备    
/etc   
系统相关设定文件
     /etc/DIR_COLORS  
设定颜色
     /etc/HOSTNAME  
设定用户的节点名
     /etc/NETWORKING  
只有YES标明网络存在
     /etc/host.conf
文件说明用户的系统如何查询节点名
     /etc/hosts
设定用户自已的IP与名字的对应表
     /etc/hosts.allow
设置允许使用inetd的机器使用
     /etc/hosts.deny
设置不允许使用inetd的机器使用
     /etc/hosts.equiv
设置远端机不用密码
 &nbs;   /etc/inetd.conf
设定系统网络守护进程inetd的配置
     /etc/gateways
设定路由器
     /etc/protocols
设定系统支持的协议
     /etc/named.boot
设定本机为名字服务器的配置文件
     /etc/sysconfig/network-scripts/ifcfg-eth0  
设置IP
     /etc/resolv.conf   
设置DNS 
     /etc/X11  X Window
的配置文件,xorg.conf XF86Config 这两个 X Server 的设定档
     /etc/fstab   
记录开机要mount的文件系统
     /etc/inittab
设定系统启动时init进程将把系统设置成什幺样的runlevel
     /etc/issue
记录用户登录前显示的信息
     /etc/group
设定用户的组名与相关信息
     /etc/passwd
帐号信息
     /etc/shadow
密码信息
     /etc/sudoers
可以sudo命令的配置文件
     /etc/securetty
设定哪些终端可以让root登录
     /etc/login.defs
所有用户登录时的缺省配置
     /etc/exports
设定NFS系统用的
     /etc/init.d/  
所有服务的预设激活 script 都是放在这里的,例如要激活或者关闭
     /etc/xinetd.d/ 
这就是所谓的 super daemon 管理的各项服务的设定文件目录
     /etc/modprobe.conf  
内核模块额外参数设定
     /etc/syslog.conf  
日志设置文件
/home  
使用者家目录
/lib   
系统会使用到的函数库
     /lib/modules   kernel
的相关模块
     /var/lib/rpm   rpm
套件安装处
/lost+found   
系统不正常产生错误时,会将一些遗失的片段放置于此目录下
/mnt    
外设的挂载点
/media  
/mnt类似
/opt    
主机额外安装的软件
/proc   
虚拟目录,是内存的映像
      /proc/version  
内核版本
       /proc/sys/kernel  
系统内核功能
/root   
系统管理员的家目录
/sbin   
系统管理员才能执行的指令
/srv    
一些服务激活之后,这些服务所需要取用的资料目录
/tmp    
一般使用者或者是正在执行的程序暂时放置档案的地方
/usr    
最大的目录,存许应用程序和文件
    /usr/X11R6
   X-Window目录
    /usr/src
    Linux源代码
    /usr/include
:系统头文件
    /usr/openwin
存放SUNOpenWin
    /usr/man
在线使用手册
    /usr/bin          
使用者可执行的 binary file 的目录
    /usr/local/bin    
使用者可执行的 binary file 的目录
    /usr/lib          
系统会使用到的函数库
    /usr/local/lib    
系统会使用到的函数库
    /usr/sbin         
系统管理员才能执行的指令
    /usr/local/sbin   
系统管理员才能执行的指令
/var  
日志文件
    /var/log/secure   
记录登入系统存取资料的档案,例如 pop3, ssh, telnet, ftp 等都会记录在此档案中
    /var/log/wtmp     
记录登入者的讯息资料, last
    /var/log/messages 
几乎系统发生的错误讯息
    /var/log/boot.log 
记录开机或者是一些服务激活的时候,所显示的激活或关闭讯息
    /var/log/maillog  
纪录邮件存取或往来( sendmail pop3 )的使用者记录
    /var/log/cron     
记录 crontab 这个例行性服务的内容
    /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log

   
分别是几个不同的网络服务的记录文件

 一些常用的基本命令:
uname -a   
查看内核版本      
ls -al   
显示所有文件的属性
pwd        
显示当前路径       
cd -   
返回上一次目录     cd ~    返回主目录
date s     
设置时间、日期         
cal     
显示日历     cal 2006
bc         
计算器具              
man  & info    
帮助手册
locale    
显示当前字体     locale -a    所有可用字体     /etc/sysconfig/i18n设置文件
LANG=en   
使用英文字体           
sync      
将数据同步写入硬盘       
shutdonw -h now & half & poweroff 
关机
reboot    
重启                  
startx  &  init 5  
进入图形接口
/work  & ?work   
向上、下查找文档内容
chgrp     
改变档案群组  chgrp testing install.log   
chown    
改变所属人   chown root:root install.log
chmod     
改变属性     chmod 777 install.log     read=4  write=2  execute=1
cp  
复制   cp filename
rm  
删除文件  rm -rf filename   强制删除文件
rmdir  
删除文件夹
mv 
移动    mv 123.txt 222.txt  重命名
mkdir    
创建文件夹
touch    
创建文件  更新当前时间
cat      
由第一行开始显示     cat |more  分页
nl       
在内容前加行号
more  &  less  
一面一面翻动
head -n filename  
显示第N行内容
tail -n filename 
显示后N行内容
od       
显示非纯文档
df -h
显示分区空间
du 
显示目录或文件的大小
fdisk  
分区设置    fdisk -l /dev/hda  显示硬盘分区状态
mkfs   
建立各种文件系统  mkfs -t ext3  /dev/ram15  
fsck   
检查和修复LINUX档案
ln     
硬链接   ln -s  软件链接
whereis  
查找命令
locate   
查找
find     
查找   find / -name "***.***"
which    
查看工具
whoami   
显示当前用户
gcc -v   
查看GCC版本
chattr +i filename 
禁止删除   chattr -i filename  取消禁止
lsattr   
显示隐藏档属性
updatedb 
更新资料库
mke2fs   
格式化   mkfs -t ext3
dd if=/etc/passwd of=/tmp/passwd.bak   
备份
mount    
列出系统所有的分区
mount -t iso9660 /dev/cdrom /mnt/cdrom  
挂载光盘
mount -t vfat /dev/fd0 /mnt/floppy      
挂载软盘
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2  
挂载fat32分区
moun -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3        
挂载ntfs分区
Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
umount /mnt/hda3 
缷载
ifconfig  
显示或设置网络设备
service network restart  
重启网卡 
ifdown eth0 
关闭网卡
ifup eth0   
开启网卡
clear   
清屏
history   
历史记录       !55  执行第55个指令
stty  
设置终端    stty -a
fdisk /mbr  
删除GRUB
at    
仅进行一次的工作排程
crontab  
循环执行的例行性命令    [e]编辑,[l]显示,[r]删除任务
&      
后台运行程序    tar -zxvf 123.tar.gz & --------->后台运行
jobs   
观看后台暂停的程序   jobs -l
fg     
将后台程序调到前台   fg n ------>n是数字,可以指定进行那个程序
bg     
让工作在后台运行
kill   
结束进程    kill -9 PID     [9]强制结束,[15]正常结束,[l]列出可用的kill信号
ps aux 
查看后台程序  
top    
查看后台程序   top -d 2    每两秒更新一次        top -d 2 -p10604   观看某个PID
        top -b -n 2 > /tmp/top.txt ----->
top 的信息进行 2 次,然后将结果输出到 /tmp/top.txt   
pstree  
以树状图显示程序    [A] ASCII 来连接, [u]列出PID, [p]列出帐号
killall  
要删除某个服务    killall -9 httpd
free     
显示内存状态     free -m  -------->M为单位显示
uptime   
显示目前系统开机时间
netstat  
显示网络状态    netstat -tulnp------>找出目前系统上已在监听的网络联机及其 PID
dmesg    
显示开机信息    demsg | more
nice     
设置优先权      nice -n -5 vi & -----> root 给一个 nice 植为 -5 ,用于执行 vi
renice   
调整已存在优先权
runlevel 
显示目前的runlevel
depmod   
分析可载入模块的相依性
lsmod    
显示已载入系统的模块
modinfo  
显示kernel模块的信息
insmod   
载入模块
modprobe  
自动处理可载入模块
rmmod    
删除模块
chkconfig  
检查,设置系统的各种服务     chkconfig --list ----->列出各项服务状态
ntsysv    
设置系统的各种服务
cpio     
备份文件
 

压缩命令:
 *.Z      compress
程序压缩的档案;
 *.bz2    bzip2
程序压缩的档案;
 *.gz     gzip
程序压缩的档案;
 *.tar    tar
程序打包的资料,并没有压缩过;
 *.tar.gz tar
程序打包的档案,其中并且经过 gzip 的压缩
compress filename 
压缩文件  [-d]解压  uncompress
gzip filename  
压缩  [-d]解压  zcat 123.gz 查看压缩文件内容
bzip2 -z filename 
压缩  [-d]解压   bzcat filename.bz2  查看压缩文件内容
tar -cvf /home/123.tar /etc 
打包,不压缩
tar -xvf 123.tar  
解开包
tar -zxvf /home/123.tar.gz 
gzip解压
tar -jxvf /home/123.tar.bz2 
bzip2解压
tar -ztvf /tmp/etc.tar.gz  
查看tar内容
cpio -covB  > [file|device]  
份份
cpio -icduv < [file|device]  
还原

- 作者: 拓塔小李天王 2007年04月1日, 星期日 10:08  回复(0) |  引用(0) 加入博采

JAR
JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。

一个 JAR 文件可以用于:

用于发布和使用类库 
作为应用程序和扩展的构建单元 
作为组件、applet 或者插件程序的部署单位 
用于打包与组件相关联的辅助资源 
JAR 文件格式提供了许多优势和功能,其中很多是传统的压缩格式如 ZIP 或者 TAR 所没有提供的。它们包括:

安全性。 可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。

减少下载时间。 如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。

压缩。JAR 格式允许您压缩文件以提高存储效率。

传输平台扩展。 Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。

包密封。 存储在 JAR 文件中的包可以选择进行密封,以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。

包版本控制。 一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息。

可移植性。 处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。 
压缩的和未压缩的 JAR
jar 工具(有关细节参阅 jar 工具)在默认情况下压缩文件。未压缩的 JAR 文件一般可以比压缩过的 JAR 文件更快地装载,因为在装载过程中要解压缩文件,但是未压缩的文件在网络上的下载时间可能更长。

META-INF 目录
大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。Java 2 平台识别并解释 META-INF 目录中的下述文件和目录,以便配置应用程序、扩展和类装载器:

MANIFEST.MF。 这个 manifest 文件定义了与扩展和包相关的数据。

INDEX.LIST。 这个文件由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程。

xxx.SF。 这是 JAR 文件的签名文件。占位符 xxx 标识了签名者。

xxx.DSA。 与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名。 
jar 工具
为了用 JAR 文件执行基本的任务,要使用作为Java Development Kit 的一部分提供的 Java Archive Tool (jar 工具)。用 jar 命令调用 jar 工具。表 1 显示了一些常见的应用:

表 1. 常见的 jar 工具用法 功能 命令 
用一个单独的文件创建一个 JAR 文件 jar cf jar-file input-file... 
用一个目录创建一个 JAR 文件 jar cf jar-file dir-name 
创建一个未压缩的 JAR 文件 jar cf0 jar-file dir-name 
更新一个 JAR 文件 jar uf jar-file input-file... 
查看一个 JAR 文件的内容 jar tf jar-file 
提取一个 JAR 文件的内容 jar xf jar-file 
从一个 JAR 文件中提取特定的文件 jar xf jar-file archived-file... 
运行一个打包为可执行 JAR 文件的应用程序 java -jar app.jar 

可执行的 JAR
一个可执行的 jar 文件是一个自包含的 Java 应用程序,它存储在特别配置的JAR 文件中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的 JAR 文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。

创建可执行 JAR
创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中的主类是 com.mycompany.myapp.Sample。您要创建一个包含应用程序代码的 JAR 文件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest 的文件,并在其中加入以下一行:

Main-Class: com.mycompany.myapp.Sample



然后,像这样创建 JAR 文件:

jar cmf manifest ExecutableJar.jar application-dir



所要做的就是这些了 -- 现在可以用 java -jar 执行这个 JAR 文件 ExecutableJar.jar。

一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如果使用了 -jar 选项,那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。

启动可执行 JAR
既然我们已经将自己的应用程序打包到了一个名为 ExecutableJar.jar 的可执行 JAR 中了,那么我们就可以用下面的命令直接从文件启动这个应用程序:

java -jar ExecutableJar.jar



包密封
密封 JAR 文件中的一个包意着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。

要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name 头,然后加上值为“true”的 Sealed 头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:

Name: com/samplePackage/
Sealed: true



Name 头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于在 Name 头中指定的文件或者包。在上述例子中,因为 Sealed 头出现在 Name 头后并且中间没有空行,所以 Sealed 头将被解释为只应用到包 com/samplePackage 上。

如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个 SecurityException。

扩展打包
扩展为 Java 平台增加了功能,在 JAR 文件格式中已经加入了扩展机制。扩展机制使得 JAR 文件可以通过 manifest 文件中的 Class-Path 头指定所需要的其他 JAR 文件。

假设 extension1.jar 和 extension2.jar 是同一个目录中的两个 JAR 文件,extension1.jar 的 manifest 文件包含以下头:

Class-Path: extension2.jar



这个头表明 extension2.jar 中的类是 extension1.jar 中的类的扩展类。extension1.jar 中的类可以调用 extension2.jar 中的类,并且不要求 extension2.jar 处在类路径中。

在装载使用扩展机制的 JAR 时,JVM 会高效而自动地将在Class-Path 头中引用的 JAR 添加到类路径中。不过,扩展 JAR 路径被解释为相对路径,所以一般来说,扩展 JAR 必须存储在引用它的 JAR 所在的同一目录中。

例如,假设类 ExtensionClient 引用了类 ExtensionDemo,它捆绑在一个名为 ExtensionClient.jar 的 JAR 文件中,而类 ExtensionDemo 则捆绑在 ExtensionDemo.jar 中。为了使 ExtensionDemo.jar 可以成为扩展,必须将 ExtensionDemo.jar 列在 ExtensionClient.jar 的 manifest 的 Class-Path 头中,如下所示:

Manifest-Version: 1.0
Class-Path: ExtensionDemo.jar



在这个 manifest 中 Class-Path 头的值是没有指定路径的 ExtensionDemo.jar,表明 ExtensionDemo.jar 与 ExtensionClient JAR 文件处在同一目录中。

JAR 文件中的安全性
JAR 文件可以用 jarsigner 工具或者直接通过 java.security API 签名。一个签名的 JAR 文件与原来的 JAR 文件完全相同,只是更新了它的 manifest,并在 META-INF 目录中增加了两个文件,一个签名文件和一个签名块文件。

JAR 文件是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须向 jarsigner 工具提供这个密码才能对 JAR 文件签名。

图 1. Keystore 数据库

JAR 的每一位签名者都由在 JAR 文件的 META-INF 目录中的一个具有 .SF 扩展名的签名文件表示。这个文件的格式类似于 manifest 文件 -- 一组 RFC-822 头。如下所示,它的组成包括一个主要部分,它包括了由签名者提供的信息、但是不特别针对任何特定的 JAR 文件项,还有一系列的单独的项,这些项也必须包含在 menifest 文件中。在验证一个签名的 JAR 时,将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。

清单 1. 签名 JAR 中的 Manifest 和 signature 文件
Contents of signature file META-INF/MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=

Name: Sample.class
SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=

Contents of signature file META-INF/JAMES.SF

Signature-Version: 1.0
SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
Created-By: 1.3.0 (Sun Microsystems Inc.)

Name: Sample.java
SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=

Name: Sample.class
SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=



数字签名
一个数字签名是.SF 签名文件的已签名版本。数字签名文件是二进制文件,并且与 .SF 文件有相同的文件名,但是扩展名不同。根据数字签名的类型 -- RSA、DSA 或者 PGP -- 以及用于签名 JAR 的证书类型而有不同的扩展名。

Keystore
要签名一个 JAR 文件,必须首先有一个私钥。私钥及其相关的公钥证书存储在名为 keystores 的、有密码保护的数据库中。JDK 包含创建和修改 keystores 的工具。keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的签名者的名字。

所有 keystore 项(密钥和信任的证书项)都是用唯一别名访问的。别名是在用 keytool -genkey 命令生成密钥对(公钥和私钥)并在 keystore 中添加项时指定的。之后的 keytool 命令必须使用同样的别名引用这一项。

例如,要用别名“james”生成一个新的公钥/私钥对并将公钥包装到自签名的证书中,要使用下述命令:

keytool -genkey -alias james -keypass jamespass 
-validity 80 -keystore jamesKeyStore 
-storepass jamesKeyStorePass



这个命令序列指定了一个初始密码“jamespass”,后续的命令在访问 keystore “jamesKeyStore”中与别名“james”相关联的私钥时,就需要这个密码。如果 keystore“jamesKeyStore”不存在,则 keytool 会自动创建它。

jarsigner 工具
jarsigner 工具使用 keystore 生成或者验证 JAR 文件的数字签名。

假设像上述例子那样创建了 keystore “jamesKeyStore”,并且它包含一个别名为“james”的密钥,可以用下面的命令签名一个 JAR 文件:

jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass 
-keypass jamespass -signedjar SSample.jar Sample.jar james



这个命令用密码“jamesKeyStorePass”从名为“jamesKeyStore”的 keystore 中提出别名为“james”、密码为“jamespass”的密钥,并对 Sample.jar 文件签名、创建一个签名的 JAR -- SSample.jar。

jarsigner 工具还可以验证一个签名的 JAR 文件,这种操作比签名 JAR 文件要简单得多,只需执行以下命令:

jarsigner -verify SSample.jar



如果签名的 JAR 文件没有被篡改过,那么 jarsigner 工具就会告诉您 JAR 通过验证了。否则,它会抛出一个 SecurityException, 表明哪些文件没有通过验证。

还可以用 java.util.jar 和 java.security API 以编程方式签名 JAR(有关细节参阅参考资料)。也可以使用像 Netscape Object Signing Tool 这样的工具。

JAR 索引
如果一个应用程序或者 applet 捆绑到多个 JAR 文件中,那么类装载器就使用一个简单的线性搜索算法搜索类路径中的每一个元素,这使类装载器可能要下载并打开许多个 JAR 文件,直到找到所要的类或者资源。如果类装载器试图寻找一个不存在的资源,那么在应用程序或者 applet 中的所有 JAR 文件都会下载。对于大型的网络应用程序和 applet,这会导致启动缓慢、响应迟缓并浪费带宽。

从 JDK 1.3 以后,JAR 文件格式开始支持索引以优化网络应用程序中类的搜索过程,特别是 applet。JarIndex 机制收集在 applet 或者应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中。下载了第一个 JAR 文件后,applet 类装载器将使用收集的内容信息高效地装载 JAR 文件。这个目录信息存储在根 AR 文件的 META-INF 目录中的一个名为 INDEX.LIST 的简单文本文件中。

创建一个 JarIndex
可以通过在 jar 命令中指定 -i 选项创建一个 JarIndex。假设我们的目录结构如下图所示:

图 2. JarIndex

您将使用下述命令为 JarIndex_Main.jar、JarIndex_test.jar 和 JarIndex_test1.jar 创建一个索引文件:

jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar 



INDEX.LIST 文件的格式很简单,包含每个已索引的 JAR 文件中包含的包或者类的名字,如清单 2 所示:

清单 2. JarIndex INDEX.LIST 文件示例

JarIndex-Version: 1.0

JarIndex_Main.jar
sp

JarIndex_test.jar
Sample

SampleDir/JarIndex_test1.jar
org
org/apache
org/apache/xerces
org/apache/xerces/framework
org/apache/xerces/framework/xml4j



结束语 
JAR 格式远远超出了一种压缩格式,它有许多可以改进效率、安全性和组织 Java 应用程序的功能。因为这些功能已经建立在核心平台 -- 包括编译器和类装载器 -- 中了,所以开发人员可以利用 JAR 文件格式的能力简化和改进开发和部署过程。.

参考资料 

参阅 jar 实用程序的命令行选项的文档。

Raffi Krikorian 在 ONJava 上发表的文章提供了有关 programmatically signing a JAR file 的帮助。

这篇关于Java Archive Tool 的文档解释了创建和操作 JAR 文件可以使用的选项。

文章“Java Web Start”(developerWorks,2001 年 9 月)描述了如何使用这种技术,以便允许应用程序可以指定所需的 JAR 文件并动态下载它们。

有关 J2EE 服务器(比如 IBM WebSphere Application Server)使用 JAR 文件格式的不同方式,请参阅“What are Java Archive (JAR) files?”

JAR 格式是 WAR (Web Archive) 格式的基础,WAR用于在 J2EE 容器中部署 Servlet 和 JSP 应用程序。更多内容请参阅“What are WAR files?”。

JAR 格式也是 EAR (Enterprise Archive) 格式的基础,EAR 用于在 J2EE 容器中部署 EJB。更多内容请参阅“What are Enterprise Archive (EAR) files?”。

在 developerWorks Java 技术专区上可以找到数百篇关于 Java 编程的各个方面的文章。

- 作者: 拓塔小李天王 2007年03月26日, 星期一 21:34  回复(0) |  引用(0) 加入博采

语录

    张良范蠡,急流勇退;天马行空,独往独来。

    我要象那夜半孤鹤,独来独往。

    读书时时有个我在,行事桩桩少对人言。

    人是自己的上帝。

    只要有信心,就会胜利。你必须尽可能少依赖别人。不管别人是多有经验,力量有多大。这就是要领。

    生死攸关时,别人都是其次,只有你是最重要的。此胜之要领也。

    硬就硬,莫激烈,软就软,莫投降。

    打仗,要么不打,要么致命。战争中不能想自己坐牢、杀头,只能想胜利。你要记住这个要领。我曾经把这个经验写给刘亚楼。含糊不得,犹豫不得,宽容不得。胜利了,什么都好说。

    你有千条计,我有老主意。

    我有长胜将军的美名,这并不是我有什么特别的才能。事实上,我只有一种才能,我决不把打赢一场战役的机会搞砸,这个机会绝对不能放过。机会一旦失去,就永远不会回来。

    一切战术中最重要的战术就是死打,打光就打光,完蛋就完蛋。

    不管上边怎样催,总是要准备好了再打,没准备好就不打。

    王者莫高周文。

    悠悠万事,唯此为大,克己复礼。  

    中庸之道合理——做什么事既不要达不到,也不要过头。

    凡事勿做绝了,两斗皆仇,两和皆友。

    大跃进,凭幻想胡来,是蚀本生意,搞得过分,过极了,破坏了个人积极性。对苏联,做绝了,绝则错。

    学习韦编三绝的治学精神。

    好人之所恶,恶人之所好,就会大难临头。

    谁不说假话,谁就得垮台。

    不说假话办不成大事。

    中国革命是革中国人民的命。

    无产阶级专政是独裁。

    他先为你捏造出一个“你的”意见,然后他再来驳你的意见。并不,而捏造——老东的惯用手法,今后当注意他这一着。

    毛,应照顾他,使他没有小帮帮的必要,他就不小帮帮了。政治上对其每一创举与功绩公道主动地指出来,则他自无锋芒的必要。