设置类路径
结构
可通过对 JDK 工具使用 -classpath 选项(首选方法)或设置 CLASSPATH 环境变量来设置类路径。
C:> jdkTool -classpath path1;path2...
C:> set CLASSPATH=path1;path2...
每个 path 以文件名或目录结尾,该文件名或目录取决于将类路径设置成什么:
对于包含 .class 文件的 .zip 或 .jar 文件,路径以 .zip 或 .jar 文件名结尾。
对于未命名包中的 .class 文件,路径以包含 .class 文件的目录结尾。
对于已命名包中的 .class 文件,路径以包含“root”包(完整包名中的第一个包)的目录结尾。
用分号来分隔多个项目。使用 set 命令时,需要省略等号两边的空格(=)。其中 jdkTool 可以为 java、javac、javadoc,等等。有关详细列表,参见 JDK 开发工具。
说明
类路径告诉 Java 应用程序去哪里查找第三方和自定义类 -- 即不是 Java 扩展或 Java 平台一部分的类。在 JDK 1.2 中,JVM 和其他 JDK 工具通过依次搜索平台库、库扩展和类路径来查找类(有关搜索策略的详细信息,参见如何查找类)。
多数应用程序的类库都会充分利用扩展机制。因此,只有想要加载某个类库 (a) 未位于当前目录或其分枝包中 且 (b) 未位于扩展机制所指定的位置时,才需设置类路径。
如果用户是从旧版本 JDK 升级而来,则启动设置可能包括不再需要的 CLASSPATH 设置。这时应该删除任何非应用程序特定的设置。有些使用 Java 虚拟机的第三方应用程序可能修改 CLASSPATH 环境变量以包括它们使用的类库。这种设置可以保留。
可通过在调用 JVM 或其他 JDK 工具时使用 Java 工具的 -classpath 选项改变类路径(例如: java -classpath ...)。这是改变类路径的首选方法。还可通过使用 CLASSPATH 环境变量改变类路径。
注意:JDK 1.2 缺省类路径是当前目录。设置 CLASSPATH 变量或使用 -classpath 命令行开关将覆盖缺省值,因而如果想要在搜索路径中包括当前目录,则必须在新设置中包括“.”。
类可以存储在目录(文件夹)或归档文件(例如 classes.zip 或 classes.jar)中。有关归档文件的详细信息和类路径的工作原理,参见本文档最后的理解类路径和包名。
重要说明:JDK 旧版本在缺省类路径中还包括 <jdk-dir>/classes 项。该目录仅供 JDK 使用,且不用于应用程序类。应用程序类应该放置在 JDK 外部的目录。这样,安装新 JDK 时不必需要重新安装应用程序库。为了与旧版本的兼容性,使用 <jdk-dir>/classes 目录作为类库的应用程序在当前版本中仍能运行,但不能保证在以后的版本中它们还能运行。
使用 Java 工具的 -classpath 选项
Java 工具 java、jdb、javac 和 javah 具有 -classpath 选项,在工具运行时它将取代缺省类路径或由 CLASSPATH 环境变量所指定的类路径。这是改变类路径设置的推荐方法,因为这样每个应用程序可具有它所需的类路径而又不会干扰其他应用程序。
运行时工具 java 和 jdb 还具有 -cp 选项。该选项是 -classpath 的缩写。
对于非常特殊的情况,java 和 javac 都具有开关,使得可改变它们使用的路径以查找它们自己的类库。但是,绝大多数用户从来都不会用到这些开关。
使用 CLASSPATH 环境变量
如前一节中所述,一般用户将想要使用 -classpath 命令行选项。本节将介绍如何设置 CLASSPATH 环境变量或清除以前安装遗留下的设置。
设置 CLASSPATH
在 DOS 提示符下,可用 set 命令修改 CLASSPATH 环境变量。其格式为:
set CLASSPATH=path1;path2 ...
路径应该以指定驱动器的字母开头,例如 C:\...。这样,在偶然切换到不同驱动器时仍可找到类(例如,如果路径项以 \... 开头,并且当前位于驱动器 D: 上,则所需的类将在 D: 而不是 C: 驱动器上找)。
清除 CLASSPATH
如果 CLASSPATH 环境变量被设置成不正确的值,或启动文件或脚本程序设置了不正确路径,则可通过使用下列命令清除 CLASSPATH:
C:> set CLASSPATH=
该命令仅清除当前会话的 CLASSPATH。要确保在以后的会话中具有正确的 CLASSPATH 设置,则应该删除或修改启动设置。
更改启动设置
如果在系统启动时设置 CLASSPATH 变量,则查找它的位置取决于所使用的操作系统:
操作系统 方法
Windows 98 和
Windows 95 检查 autoexec.bat 文件中的 set 命令。
Windows NT 启动“控制面板”,选择“系统”,单击“环境”选项卡,并在“用户变量”部分中,检查 CLASSPATH 变量。
理解类路径和包名
Java 类被组织成包,而这些包被映射到文件系统中的目录。但是与文件系统不同的是,无论何时指定包名,都应指定完整包名 -- 永远不要仅指定它的一部分。例如,java.awt.Button 的包名总是应指定为 java.awt。
例如,假定想要 Java 运行环境在包 utility.myapp 中查找名为 Cool.class 的类。如果该目录的路径为 C:\java\MyClasses\utility\myapp,则应该将类路径设置成包含 C:\java\MyClasses。
要运行该应用程序,可使用下述 JVM 命令:
C:> java -classpath C:\java\MyClasses utility.myapp.Cool
当该应用程序运行时,JVM 使用类路径设置查找在 utility.myapp 包中定义的任何其他类。
注意:应在命令中指定完整包名。例如,设置类路径包含 C:\java\MyClasses\utility 并使用命令 java myapp.Cool 是不可能的,因为这找不到该类。
(您可能想知道用什么定义类的包名。答案是:包名是类的一部分,并且不能修改,除非重新编译该类。)
注意:包规范机制一个有趣的结果是,属于相同包的多个文件实际上可存在于不同的目录中。对于每个类,包名都是相同的,但是每个文件的路径可从类路径中的不同目录开始。
文件夹和归档文件
当类存储在目录(文件夹)中时,例如 c:\java\MyClasses\utility\myapp,则类路径项指向包含包名第一个元素的目录(在这里为 C:\java\MyClasses,因为包名是 utility.myapp)。
但是当类存储在归档文件(.zip 或 .jar 文件)中时,类路径项则是该 .zip 或 .jar 文件的路径。例如,要使用位于 .jar 文件中的类库,则命令应该类似下述形式:
java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool
多重指定
要在目录 C:\java\MyClasses 和 C:\java\OtherClasses 中查找类文件,则可将类路径设置为:
java -classpath C:\java\MyClasses;C:\java\OtherClasses ...
注意两个路径之间用分号分隔。
指定次序
指定多个类路径项的次序是相当重要的。Java 解释器将按照目录在类路径变量中的次序在各个目录中查找类。在上例中,Java 解释器首先在目录 C:\java\MyClasses 中查找需要的类。只有当它在该目录中没有找到该类时,解释器才能到 C:\java\OtherClasses 目录中查找
posted @
2006-07-20 20:29 murainwood 阅读(241) |
评论 (0) |
编辑 收藏
“C++比Java快”,“Java运行于虚拟机上,当然要比C++慢”,“C++生成的是本地代码,直接运行于本地硬件上”,“速度比Java快多了”......
这是我一年前学Java时的想法,为什么有那些想法?很简单,人云亦云罢了。既然那么多“高手”都这么说,那么多“精通”Java和C++的人都那么说,自然而然就信了。
就这么过去了一年,对Java也越来越熟悉。自己依然是个初学者,而且相信不上升到布卢斯.艾克尔那个高度,就别想说自己精通C++和Java!
虽说仍旧是初学者,却对国内那些“高手高手高高手”们的一些言论有了怀疑:Java不比C++慢!然而无论我在哪个论坛上,那个技术群里头发表这个观点,立刻会有一群“高手”来纠正,甚至有一次一个号称“一般不学语言,要学两个礼拜就能搞定”的“高手”很郑重其事地向我说明原理。当我了解到此人Java才学了一个月的时候,实在是无语了。还要一次一个高手批驳我,于是乎小心问了句,了解C语言里malloc和free函数的机制与否。此“高手”很不屑地告诉我:C++里的new 和 delete就能搞定,malloc早就没用了。又无语:也许他用的“C++"是他自己发明吧。
只想问一句那些“高手”,看过近年来Java PK C++的一些精彩报告没?那些报告可是国外权威机构的文献啊!是通过实验得来的数据!
还想问一句:你们说Java慢,是什么人,什么时候说的?那些言论的源头,大多数是Java 1.2时代以前的啊。
说Java比C++慢的人,是否真的亲自写过测试代码?(虽说我的代码不能算精确,但也好歹做过近十次的实验,用了好几种不同的JVM或Cpp编译器,Java大获全胜)
说Java比C++慢的人,是否了解JVM的运行机制?(我只能说我了解一些罢了)
说Java比C++慢的人,是否有拿得出手的报告或实验?(可惜,从来没遇到过)
说Java比C++慢的人,请去学习一下唯物论!
而且为什么只有在国外才有那么多人认为Java快,只有国外的科研机构才花费时间和精力去做那些被很多国内程序员斥为“没用”(和好多程序员聊天时,他们这么认为)的实验?是中国的程序员都是天才么?还是中国的计算机业太“先进”了,不需要去关心这些东西呢?
实在是发人深省!!!
posted @
2006-06-29 06:22 murainwood 阅读(5163) |
评论 (19) |
编辑 收藏
微软的J#我从开始接触就觉得是个比较有趣的东西:一个长得特像Java的混血儿。
前些天逛论坛,偶见一群人在讨论J#的前途问题,很多人说那东西“根本不如C#”,“甚至还不如VB。NET”。我的想法是:他们根本不了解.NET。
J#的目的是为了Java程序员能迁移到.NET平台而开发的。换而言之,J#是Java程序员准备的,而不是初学者。诚然,我认为C#拥有更优雅的语法,但是对于.NET这个平台本身而言,无论用什么语言(当然是在.NET上的程序语言),它们最终都是CLR。VB。NET,C#,J#,Delphi.NET.....各种语言的优劣在已经变得很不重要了--你熟悉那种,那种就是最好的!因为它们本质上几乎没差别的,极端说法是,.NET 语言仅仅是”外观“不同罢了。
就这点来说,.NET要比Java更有灵活性,虽然我是Java的忠实跟随者。
不过我们也看到了关于Java的一些有趣的新闻:去年出现了一种JPython,用Java翻译的运行于JVM上的“Python”。呵呵,不妨大胆地猜测,未来会出现更多的"JC++","JPascal",:JBasic",甚至是“JC#”,那么那时,Java会更像一个平台,语言的灵活性将更高!
posted @
2006-05-30 07:43 murainwood 阅读(355) |
评论 (1) |
编辑 收藏
据人说效果特别好,在Watson's 有的卖。
问题是,西安好像只有一家Watson's 专卖店,在南大街,怪远的,天热怕跑。记得去年易初莲花Watson's干姜汽水和苏打水大降价,我还买了老多,只是不知道那里有那牙膏没?
效果好的话,给表哥推荐,县城就有Watson's专卖店,门面要比西安的气派多了,导购MM也比南大街那家要漂亮。
唯一不爽的是价格有些贵,33块诶。
posted @
2006-05-17 02:29 murainwood 阅读(881) |
评论 (0) |
编辑 收藏
整个长假几乎什么事情也没做,除了睡觉发呆和无聊。
或许这才是我所需要的,前段时间太忙,以至于有些神经衰弱。而这几天觉睡得出奇地香。
唯一出过门就是五一那天去买了个手机和今天陪老马买电脑。西安五一的街头,总是人头窜动,恐怕毛贼也多吧。
过了这个长假,又得“玩命”起来了。
posted @
2006-05-06 17:30 murainwood 阅读(147) |
评论 (0) |
编辑 收藏
难得今天早起,更难得早上有个好精神。起床喝了杯咖啡,听了一会儿洛卡泰利长笛。
今天上周四的课,一天都是实验。有我最鄙视的VB,也有感觉最棒的系统编程。一直想在课表上把“系统编程”改名为“艺术编程”。
昨天晚上庆庆告诉我她决定考研,善变看来是女孩子们的普遍的性格。不过现在,的确到了决定些什么的时候了。
自认为不适合在象牙塔里自度春秋,所以旁人的决定对我丝毫没有什么影响。很庆幸父母一直尊重我的选择。从高考填报志愿,到是否考研。基本上都是自己说的算。
父亲只是告诉我路永远是自己的,不过既然自己选了,就一定要努力去走好!当他对我说这话时我明白,这也他这辈子唯一的格言。
posted @
2006-04-29 08:30 murainwood 阅读(157) |
评论 (0) |
编辑 收藏
周末对现在我来说,实在是称不上周末。
今天头晕了一天,部分是给那个HTML整坏的。终于体会到用记事本写HTML语言是多么痛苦的一件事情。 英语三天没复习过,六级还没过,是有些着急。寒假的时候还计划这学期复习日语考级,可惜这个计划看来是没法实施,推后到大四再说吧。寒假还有个完善“文曲星”GVmark编译器和扩充GVmark类库的打算,现在也只能Say Sorry
庆庆改用MSN,这才发现我的MSN终于有用了。昨天打电话回家,老爸问我QQ,居然忘了^_^.
现在我唯一要做的,就是珍惜时间。长这么大,第一次这么自觉。
posted @
2006-04-23 23:48 murainwood 阅读(145) |
评论 (0) |
编辑 收藏
很经典的"转圈数数踢人"问题,老早以前做的东西
这里是我的解法,利用STL里的List构建Ring List
头文件:
//:This part is partly from Bruce Eckel's source code .
// thought he don't hear of me at all ^_^
// Making a "ring" data structure from the STL
#ifndef RING_H
#define RING_H
#include<iterator>
#include<list>
using namespace std;
template <class Type> class Ring{
list<Type> lst;
public:
class iterator;
friend class iterator;
class iterator :public std::iterator<std::bidirectional_iterator_tag,Type,ptrdiff_t>{
typename list<Type>::iterator it;
list<Type>* r;
public:
iterator(list<Type>&lst,const typename list<Type>::iterator& i):it(i),r(&lst){}
bool operator==(const iterator& x)const{
return it==x.it;
}
bool operator!=(const iterator& x)const{
return!(*this==x);
}
typename list<Type>::reference operator*()const{
return *it;
}
iterator& operator++(){
++it;
if(it==r->end())
it=r->begin();
return *this;
}
iterator operator++(int){
iterator tmp=*this;
++*this;
return tmp;
}
iterator &operator--(){
if(it==r->begin())
it=r->end();
--it;
return *this;
}
iterator operator--(int){
iterator tmp=*this;
--*this;
return tmp;
}
iterator insert(const Type& x){
return iterator(*r,r->insert(it,x));
}
//I have to recognize that the iterator is not so smart as
//we expected .If the element in the list is erased ,the
//iterator will be lost and point to a null.The shortage of
//the stupid iterator will been seen the the Josephus.cpp
//we have to use a template variable to storage the next iterator
//of the deleting iterator.If not ,the programe will be nightmare
iterator erase(){
return iterator(*r,r->erase(it));
}
};
void push_back(const Type& x){lst.push_back(x);}
iterator begin(){return iterator(lst,lst.begin());}
int size(){return lst.size();}
};
#endif
实现文件:
//:Using circle list to solve Josephus problem
//:version 1.01
//:author Murainwood 12/3/2006
#include<iostream>
#include"Ring.h"
void main(){
//enter the number of people and the index
int n,m;
cout<<"Enter the Number of Contestants?";
cin>>n>>m;
Ring<int> ring;
for(int i=1;i<=n;i++) ring.push_back(i);
//determine the iterator
//it is reasonable to declare two iterator
Ring<int>::iterator tmp=ring.begin();
Ring<int>::iterator it=tmp;
//without the iterator tmp ,if we erase the it
//the it will lost ,so the loop can not work
for(int index=0;index<n-1;index++){
it=tmp;
for(int j=0;j<m-1;j++){it++;tmp++;}
tmp++;
cout<<"Delete person"<<*it<<endl;
it.erase();
}
it=ring.begin();
cout<<"The result is person"<<*it<<endl;
}
//:finished
这个Ring List有很高的效率和安全性,并且通用性也比较好
这里也发现个问题,就是STL里的Iterator 还不够"聪明",这也是为什么我会在程序里多加个迭代器:tmp,
因为如果我调用了it.erase();那么这个迭代器就丢失了,程序也就无非运行下去.
这样我们很容易地想,如果调用了it.erase()后,指针不是丢失,而是指向下一个元素该多好啊!
很遗憾,现阶段标准STL库里的List没有这个功能.猜想是因为List的物理存储结构的缘故,如果让他的迭代器变得如我们想像得那么"聪明",那么花费可能会有些大.
还没有验证过boost库,不知道那里的迭代器是否会更人性化些
有时间研究一下相关的STL源码,写一个"聪明些"的迭代器.
posted @
2006-04-18 00:10 murainwood 阅读(642) |
评论 (0) |
编辑 收藏
生于公元1984年,巨蟹座.
童年是在家乡小镇的镇政府大院度过的.大院外边就是小镇短短的街道.一条不算宽的运河在镇边缓缓
流淌.
小镇对于我而言,是春天田野里的油菜花,夏天晚上的星星,秋天路边的法国梧桐,和冬天翠绿的竹园--我可爱的小镇被田野所环抱着.
小时候很文静,几乎像个女孩子一样乖.
小学,初中,都是在小镇上的.
十六岁之前我的世界,大部分都是那个长江岸,黄海滨的小镇.
十六岁那年考上了县城里的高中,县城离有十五分钟车程.
县城也很小.一座精致的海边小城,虽说是城市,可大多数居民却也过着闲淡的生活.
三年后,我想去看看外边更远的世界,来到了西安,这座和我家乡截然不同的世界.
posted @
2006-04-13 03:45 murainwood 阅读(264) |
评论 (1) |
编辑 收藏