Java 版 (精华区)

发信人: rhine (静&&凉爽&&想念你), 信区: Java
标  题: jini核心技术1
发信站: 哈工大紫丁香 (2000年07月17日11:00:45 星期一), 站内信件

第1章   一种新的计算模式
主要内容:
* Jini的历史。
* Sun的Jini认证模型。
* 获取和安装Jini。
* 以命令行方式运行Jini服务。
计算机真是一种奇妙的设备,它们所能提供的计算能力、存储量以及计算速度,在几年
前都是不可想象的。这种耳熟能详的说法,只是证明了我们计算机业界所发生的惊人变
化。
尽管计算机发展如此迅速,当前计算机的基本结构与20世纪50年代相比仍然没有大的变
化:CPU、内存以及磁盘;尽管我们可以使用计算机完成很多在40年前不可思议的事情,
比如说游戏、平衡我们的收支预算等,但是从根本上说,我们仍然同我们的前辈们一样
管理机器:安装软件、运行应用程序、管理系统的磁盘资源(总是不够用的资源)。一
个50年代的主机系统管理员,可以毫不费力地理解我们现在的工作。事实上,我们已经
变成了系统管理员—每个人都要管理自己的计算机,做那些前一辈系统管理员熟知的工
作。计算机速度的提高、体积的减小,并没有为我们管理、安装和使用计算机带来质的
变化。
与电话系统相比,桌面计算机的处境就显得比较暗淡。无论是容量还是连入网络的电话
机数量,电话网络从一开始就一直保持指数级的增长。人们可以在世界上任何一个地方
,使用标准电话线与另外的地方建立起适于语言或者数据传输的通道。尽管系统的复杂
性也在以指数级增长,但对用户来说却感觉不到,我们对电话系统的感觉不会因为有外
国的用户拨来了电话而变得更加复杂。尽管越来越多的地方连入了网络,但是连接任何
一个地方的接口都是类似的。安装和维护自己的电话也是再容易不过了—只要把新设备
插入到接口中就可以连通世界了。电话网络中最末端的一部分属于我们自己,因此我们
自己就可“管理”(如果这个词还有意义的话),一切“工作正常”。
如果希望自己的机器更有用,或者说更可用,那么随着连入网络的设备的数量大量增加
,我们必须在可靠性、方便配置和方便管理等方面达到电话系统那样的水平。对于电话
系统,我们最常做的管理工作就是偶尔更换一个话筒,可是为什么我们当前的计算机和
计算机网络却需要如此繁琐的工作才能正常工作呢?
1.1   Jini的历史
从某种意义上说,Jini的历史就是Java的历史。Java的最初目标是在各种面向用户的设
备之间交换数据和代码位。Java语言最初被称为Oak,1990年出现在Sun微系统公司的实
验室,设计这种语言的目的是实现一种为嵌入式处理器编写程序的可移植方法。不过,
在项目完成之际,Oak语言被用于其他新类型的设备,其中较早的一次实验是将Oak运行
于一个称Star-7的手提式计算机上。另外,这种语言也被用来构造数字电视和其他娱乐
软件的接口。事实上,Oak的创造者Jams Gosling之所以决定实现这种新的语言,只是由
于工程小组在试图采用C++语言工作时,发现C++语言过于复杂和不友好。
Oak的第二次决定性变化,是被应用到Web上。1994年,Sun公司的两位工程师,Patrick
 Naughton和Jonathan Payne,完全使用Oak语言编写了一个Web浏览器,这个被称为Web
Runner的浏览器,后来成为HotJava浏览器的基础。由于它可以从Web服务器上下载称为
applet的可执行程序,然后在浏览器内安全执行,所以一举成名。1995年4月,这种语言
被重新冠名为Java,随浏览器一起发布,Internet的历史也因此而改变。
Java原来为消费类电器所设计的很多目标,例如在设备间移动代码的CPU无关性、安全性
、简洁性等,使之自然而然地在Web上找到了用武之地。
1.1.1   Jini的设想
尽管Java最初是面向消费类电器,但它通常只被认为是构造applet的工具。不过在Sun公
司内部,Java的最初目标并没有被丢弃,一些工程师认为这些想法仍具有挑战性。虽然
Java依靠其在机器间发送和安全执行可移植性代码的能力,使这个想法成为可能,可是
要在实际生活中使设备易于管理,从而实现公司最初的设想,仍然存在很多问题需要解
决。
这一设想需要一些我们通常不会与桌面计算机联系起来的机制:
* 这些设备的软件架构必须非常健壮。烤箱和电视不可能出现带有“Abort, Retry, Ig
nore?”提示信息的错误。软件不仅要允许,而且要有助于开发可靠的系统。
* 设备必须支持真正的、简便的“即插即用”,在Internet上它们要和电话类似,插上
就能工作。这种即插即用的需求会带来很多问题。首先,设备必须易于使用,典型的消
费类设备应该只有有限的接口,就像电话机一样。显然,不是家庭用的所有设备都有鼠
标和高性能显示设备。事实上,我们并不想要这样的接口—装上鼠标,只会使它们的使
用更加复杂。其次,这些设备必须易于管理,人们希望是只要插上它们就可以使用,根
本不需要为它们配置IP地址、设置网关和路由器,安装(或删除)驱动程序等等。在这
里软件的升级也是一个重要的问题,想象一下一个大宾馆里的所有电视都需要管理员进
行软件升级的情况,还不如不升级电视机。
* Internet时代的软件系统必须是可扩展的。为单独的设备,比如说微波炉中的CPU编写
软件已经十分具有挑战性,而潜在的问题在于它还需要与Internet上其他对等的设备进
行通信。更要命的是,最初的设备制造商并不知道他们的产品后来会变成什么样。我们
当然希望软件服务和设备不需做大量的重新配置网络的工作就可以相互利用。
* 这样的设备会形成自发的组合。设想一个数码相机与一台彩色打印机的连接,我们希
望能直接在打印机上打印快照,而不需要彼此明确地交互。在很多情况下,完成设备之
间相互通告所做的努力,使得把它们结合起来工作可获得的好处化为泡影,这也是我们
尽可能减少网络重新配置的一个原因。在当今世界,连网将变得越来越动态,而不再是
固定和静止的。
许多研究人员和计算机世界的领袖人物,早就支持把大量设备和软件服务简单可靠地组
织起来协同工作的设想。Xerox Palo Alto研究中心的Mark Weiser称这种构想为“无所
不在的计算”,其意思是指连网的设备随时都处于可用的状态。Bill Joy是Sun公司的奠
基人之一,Berkeley Unix的创始者,他相信在未来社会中传统的桌面计算机将继续存在
,并且将成为家庭和车辆中的智能设备。
基于这些想法,Sun公司的一个研究小组决定提供一种可以圆满解决Java最初目标的架构
,他们计划在Java的基础上建立一个具有可靠性、可维护性、可扩展性和自发性的软件
层,这正是当前世界所需要的产品。他们着手定义一个易于被编程人员理解的模型,从
而提供一种新的软件开发模式。这种新的模式对于很多人可能是生疏的,包括那些已经
熟悉了编写网络程序的人员。
这个项目就是Jini,它的开发人员支持者中有很多原来是Java的开发人员和支持者。Bi
ll Joy就像在Java工程中一样是这个项目的策动者和有力支持者。
Jim Waldo完成了Jini中的很多早期工作,是主要设计师和开发者;Ann Wollrath提出了
RMI(Remote Method Invocation)功能,现在她正在Jini环境中继续自己的工作,是系
统的关键设计人员;Ken Arnold定义了Jini的事务和存储模型;另一个关键人物是来自
Sun公司之外的Bob Scheifler,他曾经领导了X集团,是他定义了Jini的查找和发现协议

已经有一些不同的编程模型试图解决分布式计算的问题。Jini的设计者当然可以选择一
种模型来作为系统的基础以解决Jini面临的类似问题,比如说瞬态逻辑、弱一致数据库
或agent模型等,但是这样的系统一般需要人们在学习的时候从零开始,因为这些编程模
型都是十分基本的。幸运的是,设计人员最终把系统建立在了一组Java开发者熟悉的核
心概念之上:移动代码、强类型接口、接口和实现分离等。除了这些Java原有的概念外
,他们还加入了Jini独有的新概念,包括一个分布式存储模型,这个模型基于耶鲁大学
David Gelernter的Linda系统,可作为通用设备存储和检索对象。Jini还借用了一个在
RMI内部使用了多年的概念—租借(leasing),作为访问网上资源的方式。另外,Jini
大量使用周期性的组播(multicast),来完成协作的Jini应用和服务间彼此的通告。
Jini的基本概念都是Java程序员所熟悉的,同时Jini对Java增加了一些修改以适用于轻
量级的分布式计算,不过编程人员不需要花费精力从头学习新的计算模式。
1.1.2   更广泛的应用
有趣的是,消费类应用所需的许多属性在桌面和企业软件中同样需要。对于一个网络或
系统管理员来说,即使维护一台单独的计算机都会遇到很多问题,更不用说管理整个网
络了。PC网络有很多与消费类电器相似的需求:我们希望它们能真正是即插即用(不是
当前PC具有的一点点即插即用性能,这里指把PC机插到墙上的插孔就可以真正可靠地连
入网络)。我们希望整个网络以一种一致而且可靠的方式进行升级,比如说,如果在某
台计算机上安装操作系统升级程序,我们希望它能继续保持在网络上的正常工作。这种
特性无论是对于家庭网络还是工作组的网络,都同样重要。
企业系统有更为严格的要求。服务器需要几个月甚至几年不间断地运行,因此它们需要
更可靠;我们希望在对服务软件进行升级的时候,不必重新启动系统或者说不希望打断
服务器的工作。当然我们同样希望自己可以灵活地配置网络上的服务,如果数据库服务
器的能力不能满足要求,我们可以在客户不知觉的情况下把它转移到一个新的机器上。

这种对于“无需管理”网络的需要不仅仅是出于方便的原因,它确实可以使我做到许多
原来认为难以完成的工作。例如,Jini可以为人们提供这样一个世界,在其中用户可以
访问所有远程站点,使用所有远程网络上的软件服务以及设备;打印机、文件服务器、
扫描仪以及大量的纯软件服务,无需任何配置、管理或安装驱动程序就可以轻松使用。
Jini的“无需管理”特性使其能根据需要在任何时间任何地方自发地生成特定的网络。

1.1.3   Jini的公开
Jini这个项目一直在Sun公司内部悄悄进行,公众毫不知晓。直到1998年《纽约时报》的
技术专题记者John Markoff将其披露到报端。稍后不久,尽管有Sun的正式否认,Jini出
现在《Wired》杂志的封面。这项技术最终于1999年1月25日公布于众,这时已经有了很
多获取许可的申请。
这些开发商主要是开发支持Jini的服务和设备,包括磁盘驱动器、数码相机、打印机和
扫描仪等。鉴于此,Sun公司迅速发起了Jini联盟,就像1995年对待Java一样。
1.1.4   许可证
在本书写作过程中,已经有大约40家公司申请了Jini的许可证,这些公司涉及到从设备
制造商到企业级软件公司的许多领域,其中包括像Quantum和Seagate这样的磁盘驱动器
制造商,Nokia和Ericsson这样的蜂窝电话制造商,其他还有打印机制造商如Xerox、Ca
nnon、Epson和HP,相机制造商Kodak,网络设备制造商Cisco和3Com,软件开发商BEAY 
Systems、Novell和Inprise,许多消费类电器公司,如Sony、Sharp、Philips和Toshib
a。另外,一些多种经营的公司如AOL和Kinko誷也申请了Jini的许可证。
1.1.5   共享源码许可
Sun公司允许拥有其共享源码许可证即SCSL(Sun Community Source License)的团体和
个人获取Jini源码,该许可证的目的是为了保证在开发商自由方便地访问Jini源码的情
况下,能保持各Jini产品间的兼容性,同时避免Jini源码会被发展成许多不兼容的版本

共享许可模型与开放源码运动有很多相似之处。开放源码运动支持免费获取源码,认为
源码应该向所有需要的人开放。这种方法对于软件开发有很多好处,Linux的快速发展就
是极好的例子。但是它也有缺点,大多数开放源码的机构或者是对软件定义的控制很少
(意味着任何人可以引入不兼容的改动),或者是要求所有使用软件的人把对软件的改
动发回到某个机构。第一个不足意味着最初的开发者无法控制很多不兼容版本的出现,
第二个不足意味着那些热衷于这些技术发展的公司不得不把他们的智力劳动成果向第三
方公开。
共享许可模型允许源码的开放,同时保证了各开发者团体之间的兼容性,而且不要求其
他公司或开发商把自己的产品发送回Sun公司。它是如何工作的?SCSL定义了三种使用源
码的级别,使用者的责任随级别不同而递增。
在第一级许可下,使用者可以为了研究和教学目的获取源码,或者是用可行的方法评估
源码,许可证仅仅是Sun公司供下载站点的一个链接。事实上,在本章的后面我们将会看
到,Jini内核的下载包中就有Jini源码。在这一级别中,使用者不受任何约束,他们可
以自由地学习技术、修改源码、创造新的Jini构件的实现,并在自己的应用中尝试使用
。使用者只要在源码中加入正确的声明,甚至还可以“克隆”源码。
第二级许可是内部使用许可,如果你已经在第一级许可的范围使用了Jini,那么可以在
无任何额外法律负担的情况下获得第二级的许可证,不需要签名,也不必告知Sun公司你
要用这项技术做什么,唯一需要做的,就是在使用Jini源码来开发内部的应用时,该应
用必须遵守Jini的命名规范,并且所开发的软件必须同Jini技术兼容性测试套件相兼容
,此测试套件可从Sun公司免费获得。这项要求主要是为了保证你自己实现的Jini软件与
其他从Internet上下载或购买的第三方Jini源码兼容。
最后,如果计划出售基于Jini源码的新产品,就必须获取商业用途的许可。在前两级的
许可协定中,使用者可以自由使用和转移源码并且事实上与Sun公司没有实际接触,在第
三级情况有所不同,要出售基于Jini源码的产品,就必须与Sun签订商业用途共享源码许
可证。这一许可证仍然尽可能少地限制你的行为:通过Jini技术兼容性测试,同时申请
一个单独的Jini兼容性商标许可证(要交纳少量的费用)。
可见,这种方法可以自由地为教学和实验的目的使用Jini源码,我们的代码可能会被传
播开来,先是在自己的单位,然后传播到世界范围,共享源码许可协定可以保证代码的
兼容性。Sun或其他的开发者不需要开发者提交任何代码,不过如果自己愿意,也可以把
代码公之于众,通过Sun或其他的开发者重新发布。
这一切意味着什么呢?如果只是使用Sun公司Web站点上的二进制Jini代码,按照Jini运
行时架构开发服务软件,就不必遵循任何源码许可协定。不过开发者不能在发布自己的
应用时包含进Jini的二进制代码(那样的话还需要从Sun公司申请发布二进制代码的许可
证)。SCSL模型只是针对对Jini源码的访问、修改和发布,与二进制代码无关。只是当
开发者计划在自己的应用中使用源码或者修改源码时,才需要遵循SCSL的协定。
Sun公司希望通过共享许可的方法达到两个目的:源码可被方便地访问,同时在一定程度
上保证代码的兼容和协调发展。SCSL仍在不断发展之中,Sun公司欢迎对他们这种许可策
略的反馈信息。
有关Jini共享许可模型的全部细节,可以从Sun公司的Web站点上获取,如果读者对SCSL
仍有不明白的地方,最好访问一下该网页。由于SCSL仍在进化之中,因此有可能在本书
的写作过程中其内容已经发生了变化。
网址:http://java.sun.com/products/jini/licensing/
1.2   获取和安装Jini
很显然,只有安装了Jini系统,才可以开始Jini编程。如果你是一个Java开发人员,那
么你的系统中应该安装了Java 2;如果没有Java 2版本(或更高的2.x版本),那么你需
要先安装Java 2,因为Jini需要一些只有Java 2才具有的特征。
下面是安装并运行Jini的步骤:
1) 如果没有Java 2,先安装Java 2。
* 从Sun公司下载Java 2。
* 解包。
* 检查安装的内容。
2) 安装Jini。
* 从Sun公司下载Jini。
* 解包。
* 检查安装的内容。
3) 设置环境。
* 确保Java的可执行文件目录已加入了PATH中。
* 为Jini编辑CLASSPATH。
4) 使用GUI或命令行方式启动Jini运行时服务。
* 配置并启动HTTP服务器。
* 配置并启动RMI激活守护进程。
* 配置并启动Jini的查找服务。
5) 运行例子程序以验证各项配置正确。
本章接下来的内容将详细讨论下载并安装Java 2 JDK和Jini的过程。对于Java 2的安装
,这里只讨论了可从Sun公司下载的JDK的Windows和Solaris版本,如果需要在其他的平
台上运行JDK,或者是需要在上述两种平台上运行其他的JDK版本,那么应该按照该操作
系统厂家提供的说明书来下载和安装Java 2。
由于来自Sun公司的Jini样本程序是全部使用Java语言独立开发的,所以对所有的平台都
适用,因此这里的Jini安装指南对所有类型的机器和操作系统都适用。
注意:Jini的样例实现及其规范
Jini和Java一样定义了一组核心规范来说明软件是如何运行的,因此就像另外的操作系
统厂家或开发组可以开发其他符合此规范的Java版本一样,Jini也可以有多种不同的实
现方式。
Sun公司也实现了Jini规范的样例版本,就像他们为Java技术提供的Windows和Solaris样
例实现一样。Sun完全采用Java实现Jini,所以可以在任何符合Java 2规范的平台上运行
。Jini的样例实现已经在Windows和Solaris的Java参考实现上进行了测试,Jini的开发
队伍热诚欢迎感兴趣的开发者在其他JDK实现版上对Jini进行测试。
这里的安装指南详细地讨论了Java和Jini样例实现的安装过程。
1.2.1   安装Java 2
首先需要下载和安装Java 2。
1. 从Sun公司下载JDK
当前最新的Java 2 JDK可从下列网址得到:
http://java.sun.com/products/jdk/1.2/
在网页中点击适合你的操作系统的链接(Windows或Solaris),把目标文件保存到本地
硬盘。Solaris的用户还要注意,尽管Sun公司为Solaris操作系统提供了Java的一个参考
实现和一个“产品”实现,但直到写作本书时Jini的开发组仍推荐使用JDK的参考实现来
安装Jini。
在该站点还单独有相关文档供下载,如果没有其他途径获取Java 2的文档,可以把这些
文档复制到本地系统以供参考。下载时支持ZIP文件和tar文件两种格式。
2. 解包
接下来是解包下载的文件,安装JDK。
Windows系统:如果你使用的是Windows平台,那么下载的就是一个可自行安装的EXE文件
,只要双击这个可执行文件就可安装JDK。这时安装脚本程序将把两个独立的文件包复制
到本地的硬盘上,第一个是Java开发套件,包含编译器、调试器以及相关工具,第二个
是Java运行环境,包含Java虚拟机以及Java语言的类库。在大多数情况下,可以将其安
装在安装程序推荐的目录下。
Solaris系统:Solaris用户利用一个自行安装的Shell脚本文件完成安装,可以调用sh(
UNIX命令的Shell解释器)来执行下载的脚本文件。比如如果下载的文件被命名为Solar
is-install.bin,那么可以键入:
sh Solaris-install.bin
进行安装,这时系统将要求你接受许可协议并提供一个供解包用的目录。
3. 检查安装的内容
一旦下载并安装了JDK,你需要熟悉所有重要组成部分的位置。表1-1列出了JDK中最重要
的一些组成部分,表中假设你把程序解包到了一个名为jdk1.2的目录中。只有熟悉了这
些基本内容的位置,才能确认已经正确配置了运行Java的环境。
表1-1   JDK 1.2版的内容
  jdk1.2           JDK安装的根目录
jdk1.2/bin 包包含了Java的可执行二进制程序,包括Java,即Java虚拟机;javac,即
java编译器;rmic,即RMI编译器;rmid,即RMI激活守护进程,rmiregistry,即RMI名
字服务器
jdk1.2/demo 包各种演示程序和Applet
jdk1.2/doc 包Java平台的HTML格式文档。这个目录只有在下载了单独的文档包并解包后
才有效
jdk1.2/jre 包这个目录包含了“Java运行时环境”(“Java Runtime Environment”)
,这是运行(不是开发)Java程序所需工具和库的最小集
jdk1.2/jre/ext 包这个目录是Java平台的扩展,可以把JAR文件放置在这里,同时也支
持本地代码,由于Java虚拟机的支持,VM中所有的Java应用程序都可使用它
jdk1.2/lib 包这个目录包含了Java类库的JAR文件和一些不是Java API一部分的支持库
,这些支持库不直接被Java程序调用
1.1.2   安装Jini
接下来是在系统中安装Jini的参考实现。
1. 从Sun公司下载Jini
在写作本书时,Jini代码已经可以从一个供Java开发者连接的站点上下载。在得到代码
之前,这个站点要求先免费注册(当然非Java开发人员也可以在这个站点上注册,这个
站点上的源码是Sun公司早期的Java实现,另外列出了一些错误,还有许多有助于Java开
发的文章)。
本书要讨论的Jini实现是“Jini System Software 1.0”版,或简称为“Jini 1.0”。
在从那个供Java开发者连接的站点上下载之前,最好还是先访问一下Sun公司的主页,看
看是否在本书出版的过程中已经推出了更新的版本。Jini的主页地址为:
http://www.javasoft.com/products/jini/
如果需要从那个供Java开发者连接的站点下载软件,可以访问下面的地址(要先注册)

http://developer.javasoft.com/developer/products/jini/index.html
这个网页有最新Jini版本的消息,同时还帮助需要者提交测试的程序错误或获取更新内
容的信息。页面上“Product Offerings”链接,是下载Jini代码的入口,这里提供了许
多与Jini有关的软件包。
* Jini Starter Kit(基本软件包)。这个软件包中包含了Jini架构的基本组成部分,
包括主要Jini服务的规范、支持Java程序与这些服务进行交互的界面和库代码。它不仅
包含Jini软件的公共接口,而且实现了一些基本服务。另外Jini基本软件包还含有基本
Jini类的源代码。
* Jini Technology Compootibitity Kit(技术兼容性测试套件)。这个软件包是用来
测试Jini服务和应用兼容性的程序。如果开发者创建了自己的服务或重新实现了Jini的
内核接口,那么需要下载这个测试包来测试一下自己的软件是否与Jini的参考版保持兼
容。
* JavaSpaces Technology Kit(技术软件包)。JavaSpaces是基于Jini开发的“存储服
务”,我们将在第15章讨论它。这个软件包包括JavaSpaces服务的实现、接口以及文档

一开始你可以只下载Jini基本软件包,到第15章要创建JavaSpaces应用时再下载JavaSp
aces技术软件包。对于要开发商业的Jini服务,或根据需要重新实现Jini内核功能的开
发者,兼容性测试套件必不可少。
2. 解包
在下载了Jini基本软件包的ZIP文件(名为jini10.zip)之后,就可以着手解包并安装它
了。如果决定同时也下载兼容性测试套件和JavaSpaces软件包,那么一定注意要先安装
Jini基本软件包,然后在其基础上再安装其他的包。不过在第15章之前我们只讨论Jini
基本软件包,因此在这里只介绍Jini基本软件包的安装。
Windows系统:可以使用熟悉的如WinZip解压缩工具解包,在PC上选择一个安装目录,如
c:\,则解压缩工具会在c:\上建立一个jini1_0的目录,然后把Jini基本软件包解压放到
目的目录中。
如使用unzip解压缩工具,可用以下命令:
cd c:\
unzip -d jini10.zip
Solaris系统:把ZIP文件复制到安装软件目录中,比如/files,然后解包:
mkdir /files
cd /files
unzip jini10.zip
(注意在Solaris中unzip不需要-d选项)。
这个操作过程将在/file目录中创建一个名为jini1_0的目录。
3. 检查安装的内容
在本书中我们几乎会讨论到其中的所有内容,因此你应该清楚自己安装的内容以及各部
分的位置。表1-2列出了jini1_0目录中最重要的内容。
表1-2   Jini 1.0版的内容
       jini1_0                  安装 Jini的根目录
jini1_0/index.html 这index.html文件是与 Jini软件一起发布的所有文档的起始页
jini1_0/doc 这这个目录中是 Jini的文档,包括有关API、规范、术语以及运行 Jini例
子的提示等方面的JavaDoc
jini1_0/doc/api 这这个目录中是系统的API文档
jini1_0/doc/specs 这包含了所有的 Jini规范,这些规范描述了 Jini分布式计算的模
型以及所有 Jini内核服务
jini1_0/example 这Jini的1.0 DC版附带了许多例子程序,包括一个光线跟踪的例子和
分布式图书订购应用。尽管这些例子的代码事实上是和 Jini的其他实现一样位于lib目
录中,但这个目录中含有支持这些应用的安全“策略”文件
jini1_0/lib 这这个目录中是构建 Jini实现和接口的JAR文件,jini-core.jar、jini-
ext.jar以及sun-util.jar包含了开发应用程序要使用的基本 Jini接口,其他的JAR文件
包含了例子程序、核心服务的实现以及一些工具类
jini1_0/source 这这个目录中是 Jini的源代码,受Sun公司共享源码许可证保护
在下载并解包了这些文件之后,下面介绍了如何安装和配置Jini。注意,以下讨论只是
基于写本书时的Jini版本,在实际操作时,你最好是阅读一下index.html文件,看看安
装和配置过程是否已经更新
1.1.3   设置环境
有时候Jini也表现得相当复杂,在为Jini配置环境时就是这样。这种复杂性的起因主要
是由于Jini可以被应用到许多不同的开发环境,开发者可以使用Jini服务开发新的Jini
服务或Jini应用程序,也可以开发适合自己需要的Jini架构的核心部分。
下面这部分介绍了为通常的Jini开发,也就是使用Jini已有的工具开发新的服务和应用
程序时设置环境的方法。
1. 设置PATH变量
首先要确保Java 2版的bin目录已经包含在了PATH变量中。正确地设置PATH变量,主要是
为了保证所有的Java可执行文件(包括编译器和RMI生成器)都可被访问,这些文件在运
行时将“自动”扩展CLASSPATH,寻找基本的Java库的支持。
Windows系统:可使用下列命令完成设置:
set PATH=C:\jdk1.2\bin; %PATH%
当然也可以通过更新系统控制面板里环境控制窗口来永久更新PATH变量,下一组设置亦
如此。
Solaris系统:所使用的Shell不同,设置的方式也不同。对于常用的C-Shell,可以用下
面的命令设置,然后用rehash命令检查一下对PATH变量的设置是否生效:
Setenv PATH=/usr/java1.2/bin: ${PATH}
如果要永久改变PATH设置,可以编辑.cshrc文件。
2. 设置CLASSPATH变量
如果只是运行Jini所带的例子程序,就不必对CLASSPATH做任何修改,因为Jini所带的J
AR文件使用了“可执行JAR”机制,这项技术来源于Java 2,它允许JAR文件包含一个“
缺省”的应用类,这个类在调用JAR文件时自动被引用。有了它的支持,我们可以轻松地
把JAR文件连接到java的可执行文件,启动所需要服务或例子应用程序。如果只是需要启
动Jini服务使之在网上运行,这已经足够了。
不过除了运行例子之外,可能有些读者还想用Jini内核来开发一些自己的应用,这时就
必须修改CLASSPATH变量使之指向完成开发所要的JAR文件。
程序开发所需的JAR文件主要有三个、jini-core.jar包含了“内核”接口,是Jini规范
的一部分;jini-ext.jar包含了开发Jini应用程序要用到的一些“非标准接口”;sun-
util.jar包含了一些Sun公司提供的软件工具类,它们在例子程序中随处可见。所有的J
AR文件都位于jini1_0/lib目录中。
在第5章,我们将就如何设置环境以高效地开发Jini客户和服务程序而给出一些特别的指
导原则,其中有一条就是把程序开发要用到的JAR文件用命令行的方式扩展到Java编译器
,而不是使用CLASSPATH。读者最好是按第5章的方法做,当然如果你希望尽快地开始工
作,也可以采用设置PATH的方法,不过最好只把它当作一种临时方法。
Windows系统:用下列命令进行设置:
set cLASSPATH=c:\jini1_0\lib\jini-core.jar;
  c:\jini1_0\lib\jini-ext.jar;
  c:\jini1_0\lib\sun-util.jar;%CLASSPATH%
Solaris系统:仍然与所使用的Shell有关,语法将有些小变化。在C-Shell下用下面一组
命令:
setenv CLASSPATH
  $HOME/files/jini1_0/lib/jini-core.jar:
  $HOME/files/jini1_0/lib/jini-ext.jar:
  $HOME/files/jini1_0/lib/sun-util.jar:
  ${CLASSPATH}
注意,这里的CLASSPATH设置只是在开发新的Jini应用时才有用,如果只是运行标准的J
ini服务,那么不必专门设置CLASSPATH。事实上为了避免混乱,在运行标准Jini服务时
最好不要对CLASSPATH进行设置。
注意:软件包中的其他JAR文件
毫无疑问我们会注意到软件的lib目录中还有一些其他的JAR文件,并且有很多以“-dl”
结尾。以“-dl”结尾的文件在运行时将被下载到客户端执行,如reggie.jar(Sun公司
实现的Jini查找服务)和reggie-dl.jar(只包含客户端使用查找服务所需的代码)。如
果要开发自己的Jini应用,那么应该这样分开处理,在一个JAR文件中实现应用程序而把
客户端要用到的部分放到另一个JAR文件中。
1.2.4   启动Jini运行时的服务
前面的几节相对比较简单,读者只需快速地浏览一下。接下来讨论如何启动Jini运行时
所需要的服务,可能稍有些复杂。问题总有两面性,一方面为运行这些服务可能要花费
些精力完成设置参数等配置工作,而另一方面一旦这些服务已经运行起来,就很少再需
要做什么工作了。
Jini运行时很大程度上要依靠网络结构,因为在配置时,需要在一台服务器或者几台服
务器上运行几乎全部的服务。要使Jini有效工作,对于大部分的服务只需在局域网中运
行一个实例,而另外一些服务需要配置在每一台主机上(至少是几台主机)。当然如果
只是用Jini独自做些实验性的开发,也可以在一台桌面计算机上运行所有的服务。
Jini的分发软件包中包含有一些支持Jini运行所必需的基本服务,同时也有其他一些“
可选的”服务,下面列出了在网络中运行Jini应用时所需要的各种服务。另外在软件包
中还有两个其他的服务—Jini“事务管理器”和JavaSpaces“存储服务”,大部分的Ji
ni应用用不到它们,不过我们要知道它们的存在,本节最后的章节再讨论这两类服务。
如果要进行开发,就要事先把所有需要的服务都启动起来,在它们运行时可以基本不必
费神。
Jini所需要的服务有:
* 一个简单的Web服务器。之所以需要它是因为当需要通过RMI下载代码时,实际是通过
HTTP协议完成代码传送。Jini带有一个十分简单的HTTP服务器,不过对于供应用间传送
代码已是足够了。通用的配置是在每个要供其他应用下载代码的主机上都运行一个HTTP
服务器。
* RMI激活守护进程。尽管它的名字有些吓人,实际上它是Jini结构中十分简单也十分好
用的部分。这个进程允许那些很少被调用的对象基本保持在“睡眠”状态,然后在需要
的时候自动唤醒它们。这种情形一般出现在远程系统编程中,这时可能会有一些服务器
对象很少被访问。RMI激活守护进程管理这些对象在活跃和非活跃状态切换,也被其他的
Jini运行时核心服务所调用。激活守护进程至少要在运行查找服务的主机上运行,在下
面我们将讨论这个问题。
* 查找服务。渐渐我们就会看到,查找服务才是真正的Jini的核心,查找服务跟踪LAN中
所有活跃的Jini服务。Sun公司提供一个专门为Jini开发的查找服务,尽管JDK中的RMI注
册服务也可以作为查找服务使用,但没有必要使用它。Jini中的查找服务具有完备的功
能,在本书中我们将不分析RMI注册服务的查找服务功能。在出现故障或重新启动之后,
查找服务依靠激活守护进程来恢复其状态,因此在运行查找服务的机器上要同时运行激
活守护进程。
这看起来有很多工作,不过这些进程都可以在网络上传播,并且可以最大限度地自我维
护,这就意味着一旦把它们启动,你就不必再操太多心了。以我自己的经历为例,在我
进行Jini开发时,经常是让那些进程运行几周甚至几个月都不管它们,有很多次我都惊
奇地发现有一些我已忘记了的进程还在某个服务器上运行着。
启动这些服务有两种方法。如果想快速地启动和运行,那么可以使用Jini软件包中附带
的图形化用户界面。不过这种界面只能在本地机器上启动Jini服务,因此不适于调试将
在多机环境下运行的Jini应用程序。不过GUI毕竟可以帮助我们快速地启动那些服务,所
以我们会先讨论一下这种方法。
可是有些认真的开发者仍会刨根问底地想要知道如何“手工”地启动每个服务并把所需
参数传给它们,所以我们也要介绍一下命令行的方式。
接下来首先讨论通过图形用户界面运行所需的Jini服务,然后更进一步地讨论如何用命
令行的方式运行这些服务,讨论仍然是基于Windows和Solaris两类操作系统。
1.2.5   通过GUI启动所需服务
Jini附带了一个便于使用的GUI以启动所需的Jini服务。使用这个界面只能在本地机器上
启动这些服务,不过我们的开发工作也常是在本地机器上进行。GUI并不隐藏这些服务的
细节,它只是使通常的配置过程更加简便。
如果想了解这些服务的不同选项,可以阅读下一节,学习如何用命令行方式启动服务。
一般说来,随着使用Jini熟练程度的增加,充分理解这些服务的不同选项十分有必要,
也就是说,掌握用命令行方式启动这些服务的方法是十分重要的。
警告:启动服务的图形用户界面中的程序错误
使用图形用户界面的应用程序在PC上启动服务时,有一个错误会导致某些服务不能被启
动。或许等你阅读本书的时候这个错误已得到了修正,不过,在这里还是要提请你注意

产生这个错误的原因是,在GUI应用程序中指定URL时使用斜杠“/”,和UNIX中的路径方
式相同,但是StartSpace应用程序创建URL时错误地使用了Java文件的分隔符,这在PC机
上是反斜杠“\”,从而导致URL的格式不对。
这个错误使得不能通过GUI启动Jini查找服务,启动其他的基本服务不受此问题影响。如
果你在使用GUI启动查找服务时遇到了问题,那么只能采用后面介绍的用“手工”命令行
方式来进行。
运行GUI
在完成了对PATH的设置之后,可以很方便地启动配置应用程序。方法是:
Windows系统:
java -cp C:\jini1_0\lib\jini-examples.jar
    com.sun.jini.example.service.StartService
Solaris系统:
java -cp /files/jini1_0/lib/jini-examples.jar
    com.sun.jini.example.service.StartService
显然,这里的“files”目录只是代表安装Jini使用的目录,要注意替换;-cp选项的作
用是为Java虚拟机设置CLASSPATH,使之包含jini-examples.jar文件;最后一个选项是
启动服务的GUI应用程序的全名。
启动程序后,就可以看到一个带有多个可选窗格的窗口,如图1-1所示,不同的选项窗格
用于启动不同的服务。初始的窗格标题为“Jini Jar Files”,窗格中有服务运行时所
需要的各种JAR文件的名称。窗格的第一个条目是Jini文件的路径,需要指向Jini软件包
中包含JAR文件的目录,比如若是将Jini安装在了C:\jini1_0目录,这里就应该填C:\ji
ni1_0\lib。如果软件包中各文件的名称没有被改动过,那么本页中的其他条目可使用缺
省值,不必修改,目前这个窗格对我们来说比较重要。
接下来点击“Web Server”选项,其窗面如图1-2所示。这里一般只需要修改一个条目,
即让“ Top Level Web Document area”(Web文档最顶层区)域指向包括可下载Jini代
码的目录。由于一般所有Jini代码都安装在了同一目录,因此这里可以设为lib目录,与
前一窗格中第一项的设置相同。“Port”(端口)域用来设置Web服务器所运行的端口,
要和前一窗格中的第二项“URL to Client Jar Files”域保持一致,一般不必修改。这
个窗格还有两个复选框,第一个用来设定当外部请求下载一个类时,是否搜索整个目录
(否则直接返回错误信息),第二个用来设定是否记录下载信息。
图1-1  设定JAR文件的路径
图1-2   设置可下载代码的路径
第三个选项窗格是“Policy Files”窗格,如图1-3所示。一些运行时服务需要运行它们
的JVM被一个特定的安全策略文件启动。安全策略的概念来自于Java 2,用于对JVM中所
运行的Java代码提供更细化的控制。关于为什么有些特定服务需要安全策略文件的细节
,在用命令行方式启动服务的一节中有详细的解释,现在只需要设置路径使之指向Jini
软件中策略文件的位置。比如C:\jini1_0。
下一个选项窗格“RMI Activation”用于控制RMI激活守护进程。这个服务比较简单,不
需要做什么配置就可以使之正常地工作。下面是“Registry Services”选项窗格,如图
1-4所示。前面我们已经提到,在Jini中启动RMI注册服务或Jini查找服务,都可以用于
命名,此窗格中的单选按钮即用于选择启动那类服务。我们推荐选择“Lookup Service
s”项启动Jini查找服务,然后在“Log Directory”域中填写一个存放服务日志信息的
绝对路径。在Windows系统中,推荐使用C:\tmp\reggie_log目录,不过这个目录可能不
存在,需要创建tem 目录;在Solaris系统中可以使用/tmp/reggie_log目录。无论如何
填写,都应确认所填目录在系统中存在。Jini服务在运行时将会创建日志目录(此例中
的reggie_log),但不可能创建上级目录。
图1-3   设置安全策略文件的位置
图1-4   设置查找服务的参数
在前面的警告中已经提到,在PC上使用此图形界面应用程序启动查找服务时,可能会遇
到错误,这时只能用手工方式启动查找服务。
下面的两个选项窗格—Transaction Manager和Java Spaces配置—我们暂时不会用到,
所以这里先不介绍。
我们已经配置了运行时所需启动服务的所有参数,现在来看一下最后一个选项页“Run 
It All”,其窗面如图1-5所示,作用是控制这些服务的启动。在这里可以按照顺序启动
所需的服务:首先是HTTP守护进程,RMI激活守护进程(RMID),最后查找服务。注意现
在不要启动事务管理器(Transaction Manager)和JavaSpace服务。如果发现某些参数
配置错误需要修改,也可以在此页面中终止某项服务。
图1-5   启动Jini运行时的服务
启动各服务以后,就做好了运行一些Jini例子程序的准备。我们已经提到,启动这些服
务是比较困难的工作,因为各种选项、各种特殊的JVM参数(如安全策略)需要配置。不
过一旦启动那些服务,这些服务就可以运行很长时间而不用管它了。
下面我们详细介绍用命令行方式启动这些服务的方法,同时给出了一些有用的帮助脚本
,这种方式对于那些对Jini服务工作的方式特别感兴趣的读者很有帮助。如果想让这些
服务在引导服务器时就自动启动,可参照下面这部分如何手工加载服务的指南;另外在
这部分还将详细介绍几个在GUI方式下只是粗略提到的参数。
1.2.6   用命令行方式启动所需服务
如果已经通过GUI方式启动了所需要的服务,也可以跳过这节不看。这里介绍手工配置方
法的目的,是为了给出更多Jini服务不同选项的信息,介绍一下各种服务的哪些配置更
有用,同时说明如何通过手工配置使Jini服务在引导服务器时即自动启动。
运行这些服务的过程一般都是固定的,下面我们就逐步了解一下这个过程。为节省读者
的时间,对于每个服务,这里都列出了在Windows系统和Solaris系统中的命令表。
1. 启动Web服务器
前面已经提到,为了支持代码下载,网络中应该运行有放置应用程序所需代码的HTTP服
务器。这个服务器的功能可以很简单,只需要支持“get” (取)操作即可,原有旧的
Web服务器一般都能满足要求。
在tools.jar软件包中Jini也提供了Web服务器程序,下面介绍如何使其正常运行。
一般只要使用以下命令即可启动HTTP服务器:
Windows系统:
java -jar C:\jini1_0\lib\tools.jar
    -port 8080 -dir C:\jini1_0\lib
    -verbose
Solaris系统:
java -jar /files/jini1_0/lib/tools.jar
    -port 8080 -dir /files/jini1_0/lib
    -verbose
显然,以上使用的目录只是例子,要用安装Jini的真实路径替换。命令中是一个可执行
的JAR文件,当它被Java虚拟机调用时,文件中一个默认的程序被执行。
可以在命令中使用一些选项来配置服务器。缺省情况下,HTTP服务器运行在8080端口,
可是如果已经有一个Web服务器运行于8080端口,那么可以用-port(端口号)选项把Ji
ni的HTTP服务器配置到另外的端口,如例中所示。-dir(路径名)选项可以用来设置服
务器的根目录,在上面的例子中此选项设为Jini的lib目录,这样的话Jini的核心代码就
可被直接下载。最后的-verbose选项是用于调试的,加上它HTTP服务器就会显示所有的
请求以及这些请求的来源。如果要了解的选项,或者是需要做其他特殊的配置,可参阅
Jini发布的文档。
一般说来,所有需要通过网络下载的代码都应该能通过HTTP访问,这个HTTP服务器没必
要是一个功能齐全的通用Web服务器,Jini软件包中所附带的HTTP服务器已经足够用了。
可以把所有可下载代码都收集起来放在一个Web服务器上,也可以从开发程序的角度出发
,在网络中设置多个小的Web服务器,因为Jini应用通常是配置在多机环境中,所以最好
是每个服务都设置一个HTTP服务器。如何知道哪些代码会被下载呢?这个问题要在我们
深入到Jini结构内部后才会清楚。现在可以认为所有Jini的核心部分,如查找服务、事
务管理器、JavaSpace等都会被其他进程下载,因此这些代码应当至少能在网络中的某台
HTTP服务器上访问到。
2. 启动RMI激活守护进程
启动RMI激活守护进程十分容易,对应的可执行程序在jdk1.2/bin/rmid中。如果这个目
录已被设定到起始路径中,只要键入rmid命令就可以了。在每个可被激活对象所在的机
器中,都应当运行一个激活守护进程的实例,这些对象包括Jini查找服务、事务管理器
和JavaSpaces等。当然如果开发了自己的可激活对象,也应该在相应的主机上运行激活
守护进程的实例。
3. 启动查找服务
Sun公司实现的查找服务名为“reggie”,它位于分发软件的reggie.jar文件中。启动这
个服务要比启动其他服务复杂些,原因在于,启动时需要传递较多的参数给可执行程序
以设置其工作方式,而且还要设置相应Java虚拟机的一些选项以配置正确的安全参数。

启动查找服务器的基本命令格式是:
java -Djava.security.policy=<security_policy>
   -jar <reggie jar file>
   <lookup client codebase>
   <lookup policy file>
   <log directory>
   <lookup groups>
这看起来很复杂,下面分别进行解释。-Djava.security.policy选项用来指向一个JVM执
行此程序时要使用的安全策略文件。安全策略文件是Java 2中新引入的概念,用于控制
一个程序在运行时可使用哪些资源。
过去在运行Java程序时,从来不需要先设置安全策略。这里却必须提供安全策略,因为
查找服务使用激活守护进程记录自己的情况,激活守护进程根据需要控制查找服务为活
跃或非活跃状态。当激活守护进程重建查找服务时,它需要知道哪些程序可以被该查找
服务访问,使用安全策略启动查找服务的目的就是为了让它按许可权访问特定系统属性
、写日志记录、创建到客户端套接字的连接并在相应端口上监听。Jini软件在jini1_0/
example/lookup/policy目录中附带了用于查找服务的安全策略。
命令行中的下一部分是包含所运行代码的实际的JAR文件。-jar选项用于指向包含带mai
n ( )例程的程序的JAR文件。这里是启用带reggie服务的JAR文件reggie.jar,它应该在
Jini分发软件的lib目录中。
再下面的参数就不再是JVM运行reggie时使用,而是要传递给reggie程序。命令行中的c
odebase参数用来指定供下载到客户端的代码所在的位置,在这里应该给定指向reggie-
dl.jar文件的URL,因为是reggie-dl.jar文件包含了访问reggie时需传递给调用者的代
码。如果能保证所有的Jini服务和应用都在同一台机器上运行,那么只需要指定包含有
关JAR文件的目录的URL路径即可。不过在大多数情况下,程序会基于网络运行,这时应
该给出指向运行了Web服务器,用于提供代码下载服务的那台机器的URL,比如说用http
://hostname/reggie-dl.jar(把“hostname”替换成Web服务器所在的机器)。注意要
保证在Web服务器提供的根目录下可以访问到reggie-dl.jar文件。
注意:关于代码基(codebase)属性
RMI和Jini新手常会对代码基属性的设置感到困惑,要说清楚这个问题也不容易。实际上
,代码基属性只是用于设置服务器(为客户端提供可调用代码的程序),使之通知客户在
哪里可获取相关代码。设置程序的代码基属性,相应地就告诉了该服务器,当其为客户
端传送序列化对象时,它应当“声明”带有代码基URL的序列化对象,代码基URL指出哪
里去取得该对象的代码。
序列化只是传送一个对象内的数据成员,而不是代码本身。使用代码基是服务器告诉客
户程序如何下载所需代码的方法。
一般说来,在每台要向外传送代码的机器中都应该运行HTTP服务器。HTTP服务器可以是
一个独立运行的进程(例子中的情形),也可以仅是其他服务应用程序中的一个小实体

在使用代码基时要注意两个常犯的错误。第一个发生在使用文件方式URL时。文件URL是
指通过文件系统访问某服务的代码,这种形式只有在客户端和服务器程序位于同一台机
器上时才可以使用,一旦某些内容被转移到了其他主机上,这种方式就不能正常工作,
因为文件系统不再是公共的。
第二个要注意的情况是不要在代码基的URL中使用“localhost”,原因是主机名“loca
lhost”只是指正在计算主机名的主机的缩写,如果在代码基中使用localhost,客户程
序会试图从自己的本地系统装载代码,而不是从服务程序所在的机器。这当然不是你想
要的,而且是难于跟踪bug的潜在源。
尽管HTTP服务所在的主机常同时运行了Jini查找服务,但最好使用主机名或IP地址来指
定HTTP服务的位置。关于代码基,在关于RMI的附录中还有更详细的讨论。
下面来看一下另外一种安全策略文件。就像许多其他的Jini服务一样,reggie也利用RM
I激活守护进程来记录自己的情况,在reggie服务失败时,激活守护进程可保证在下次被
需要时重启服务。前面介绍的策略文件是在JVM运行reggie程序时给它赋予一定的许可权
,而这里的安全策略文件只是作为传向RMI激活守护进程子系统的参数,当它重新激活一
个reggie进程时,该reggie服务就会在新的安全许可下运行。以后我们会看到有很多其
他Jini运行时服务也使用多个安全策略,其方法与这里相同,即先为JVM设置安全策略,
然后通过激活守护进程为以后的启动重新设置安全策略。
下一个选项是给出一个供reggie写入日志的目录,可以是运行reggie的机器上任何可读
写的目录,不过一定注意要给出全路径名。尽管reggie可以创建自己的日志目录,但最
好还是事先创建所有的起始目录和日志目录。以后我们会发现很多Jini服务都使用日志
目录,这些日志文件可帮助服务程序定期检查自己的状态,或是在崩溃后重新恢复。如
果计划让查找服务运行很长一段时间,那么应当把日志目录设在一个稳定的文件系统中

最后一个参数是把要查找服务提供服务的组列表传递给程序。组本质上是对Jini服务集
合进行分组的一些名称,将在以后详细讨论。reggie还可以识别两个特殊的组名,“pu
blic”参数是指可以使用无名称的公共组,服务缺省情况下在此组中登记;“none”参
数是指不使用任何组(不常用),现在可以先暂时使用“public”参数。
下面是启动reggie的完整命令行。
Windows系统:
Solaris系统:
程序清单1-1和1-2分别是Windows和Solaris系统(也适用许多其他UNIX版本)中用于启
动查找服务的脚本文件。在前言中已经提到,这些脚本文件可以在Prentice-Hall的FTP
站点下载。
程序清单1-1   用于Windows系统的lookup.bat脚本文件
程序清单1-2   用于Solaris系统的lookup.sh脚本文件
1.2.7   运行例子程序
到这里为止,已经有了在机器上运行的所有需要的Jini服务,可以运行几个例子看看是
否一切工作正常。在这里选用一个Jini分发软件中附带的浏览器应用程序,可以使用下
面的命令启动它:
Windows系统:
Solaris系统:
当然,当你改变任何缺省配置时,要注意替换用于安装Jini JAR文件的路径,并使用We
b服务器正确的URL。
注意浏览器程序也需要自己的代码基设置,因为实际运行中它要把代码下载到不同的Ji
ni服务中,而且如果此浏览器应用是在单独的机器上运行,还需要在此机器上启动一个
HTTP服务器,以使其他的Jini服务可下载代码。
如果一切正常,就可以看到一个如图1-6所示的浏览器应用程序在运行了。使用这个应用
程序可以观察、控制网络上运行的Jini服务,或修改有关服务的属性,因此也可以使这
个应用程序保持运行以监控Jini查找服务的运行情况。当然读者可能对这个应用程序中
的有关控制还没有感觉,没关系,很快就会讲到Jini服务和有关属性的细节,现在至少
可看到刚才启动的Jini查找服务在运行。
图1-6   Jini浏览器的例子
1.3   参考读物和资源
如果对Java项目的早期历史感兴趣(包括一张star-7设备的照片),读者可以访问Jame
s Gosling的主页,其中有对Java项目过去情况的介绍。
如果关心如何把非桌面计算机融入日常生活以及如何在现实生活中“隐去”实在的计算
机,读者可以访问Mark Weiser的关于“无所不在的计算”主题的网站:
http://ubiq.com/hypertext/weiser/ubihome.html
《纽约时报》关于Jini的一些文章也很有价值:
http://www.nytimes.com/library/tech/98/07/biztech/articles/15sun.html
另外,《Wired》杂志上Bill Joy的关于Jini及其前景的评论文章给了Jini项目很高的评
价:
http://www.wired.com/news/technology/story/13744.html
对于Jini开发者来说,JINI-USERS邮件列表是十分有用的资源,如果要加入,可向list
serv@java.sun.com发送邮件,邮件内容为subscribe jini-users;如果想退出,向同一
地址发送内容为signoff jini-users的邮件。
RMI-USERS邮件列表对于有关RMI的问题可能很有帮助,如果要加入,向listserv@java.
sun.com发送内容为subscribe rmi-users的邮件,退出则发送内容为signoff rmi-user
s的邮件。
Sun公司专门有一个站点是关于Jini团体的,通过这个站点可以了解团体成员所更新的代
码、有关的新闻及Jini事件。登录这个站点需要事先注册,登录后可以访问其他Jini团
体成员的代码,而且会拥有一个上载自己代码的空间。站点地址为:
http://www.jini.org

--
           海纳百川,
                   有容乃大,
                           壁立千尺,
                                   无欲则刚。    

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: dip.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:212.066毫秒