??xml version="1.0" encoding="utf-8" standalone="yes"?> public Cache() { public String getKey() { public long getTimeOut() { public Object getValue() { public void setKey(String string) { public void setTimeOut(long l) { public void setValue(Object object) { public boolean isExpired() { public void setExpired(boolean b) { 另外一个类Q?br style="line-height: normal" />
import java.util.Date; public class CacheManager { /** /** /** /** /** /** /** /** } Java Instant Messenger (or JIM) is an application to allow instant messaging over a network. JIM does not have a centralized server. Instead, users run the server on one of the computers on the network and other users connect to that server. (This Description is auto-translated)
Page 2
学习(fn)目标• 宏观C?Java EE> 什么是 Java EE> Z么要?Java EE> Java EE 的核心概?gt; Java EE ?API
--------------------------------------------------------------------------------
Page 3
Java ?Java EE
--------------------------------------------------------------------------------
Page 4
Java q_Java EEJava SEJava ME Java Card
--------------------------------------------------------------------------------
Page 5
Java 概况• Java Standard Edition (Java SE)> ~译器,常用工具 , Java q行环境?Java 应用开发的 API• Java Enterprise Edition (Java EE)> 开发,部v和管理服务器端的Q分散的Q多层的Zlg的企业应用pȝ• Java Micro Edition (Java ME)> J2SE 的一个子集,用于开发在型的,可移动的讑֤上的应用E序
--------------------------------------------------------------------------------
Page 6
The Java™ PlatformHigh-EndServerJava TechnologyEnabled DesktopWorkgroupServerJava TechnologyEnabled Devices
--------------------------------------------------------------------------------
Page 7
企业U应?br />
--------------------------------------------------------------------------------
Page 8
什么是企业U应用??企业U应用是以服务器Z心,通过|络把服务器和分散的用户联系在一L(fng)应用。|上银行Q新信息网Q校园网늽l可以是 Internet Q也可以是无U电(sh)话网?br />
--------------------------------------------------------------------------------
Page 9
企业U应用的演变• 单层pȝ> 庞大 , 直接相连• 两层pȝ> 客户端逻辑复杂 (rich client)• 三层pȝ> Browser, Web Server, DB> 商业逻辑的处理集中在中间件上。DBSQLDBSQLHTTP
--------------------------------------------------------------------------------
Page 10
企业U系l的发展势• 由单层和两层pȝ向多层结构演?#8226; 由庞大的Q整体的pȝ向独立组件的pȝ演变• 客户端由“ Rich Client” 向类似网l浏览器?#8220; Thin Client” 演变• 客户端更多样?gt; PC> 手机> 掌上?sh)?br />
--------------------------------------------------------------------------------
Page 11
由此产生的问?.“ 中间?#8221;很复?gt; “ 中间?#8221;Q应用中q行在应用服务器上的部分2.每一个应用都?x)重复一些基本的pȝ服务> 协调对共享资源的调用> 保证对共享资源的事务性操?gt; ׃n资源的^衡负?gt; 保护׃n资源的安全?br />
--------------------------------------------------------------------------------
Page 12
什么是 Java EE Q?br />
--------------------------------------------------------------------------------
Page 13
什么是 Java EE Q Java EE ?Sun 公司针对C企业U应用的解决Ҏ(gu)?涉及企业U应用的开发,部v和管?br />
--------------------------------------------------------------------------------
Page 14
Java EE 针对解决了企业应用的问?#8226; Java EE 通过提供> 一套标准的 API> 以组件ؓ(f)基础的架?gt; 一个新的容器概念,通过容器来提供标准的pȝ服务大大减低?#8220;中间?#8221;的复杂程?#8226; l承?Java 的特?gt; 安全?gt; 高可UL?br />
--------------------------------------------------------------------------------
Page 15
Java EE 包含的技术内?#8226; q_标准> 容器的技术规?#8226; API 接口规范> lg开?#8226; 参考实?#8226; 开发工?#8226; 兼容性测试包• 蓝图> pȝ架构设计指导
--------------------------------------------------------------------------------
Page 16
Java EE q_架构
--------------------------------------------------------------------------------
Page 17
Java EE 5.0 ?APIs 和技术基QJava SE 5.0表现层:(x)ServletJSPJSF中间Ӟ(x)EJBJAX-WSJavaMailJMSConnectorJTAJAX-RPCJava EE ManagementJava EE DeploymentJMXJAXRJACCJAF
--------------------------------------------------------------------------------
Page 18
Java EE 的发展过E?br />
--------------------------------------------------------------------------------
Page 19
Java EE q_的发展过E?8 q?5 ?99 q?12 ?01 q?9 ?03 q?11 ?06 q?5 月JPEProjectJ2EE 1.2Servlet,JSP, EJB,JMS, JTA,JNDI,RMI/IIOPJ2EE 1.3EJB 2.0,ConnectorArchitectureJ2EE 1.4Web Services,Management,Deployment,Async.ConnectorJava EE5Annotations,EJB 3.0,PersistanceAPI,JSF,Renewed WebServices企业q_初始E_性Web 服务开发的易?br />
--------------------------------------------------------------------------------
Page 20
Footnote position, 12 pts.o
--------------------------------------------------------------------------------
Page 21
Java EE 的优?br />
--------------------------------------------------------------------------------
Page 22
大量的开发h?#8226; Ҏ(gu)学习(fn)Q容易上?gt; Java> 有许多可选择的开发工?gt;NetBeans• Ҏ(gu)搭徏环境> Java EE 实现可免费获得,免费q用>Sun Q?Apache Q?JBoss• 大量的学?fn)资?gt; 书籍> |络学习(fn)资料
--------------------------------------------------------------------------------
Page 23
大量的中间g提供?#8226; Java EE 标准的制定是公开?gt; 各厂商共同制定标?gt; 厂商有不同的实现但支持相同的标准• 在不影响lg间交互性的情况下,厂商有够的I间来发挥自q创造性,提高自己产品的竞争力?#8226; 需求大Q商机多
--------------------------------------------------------------------------------
Page 24
吸引商业客户• 应用的可UL性高> 不同的操作系l?gt; 不同的中间g• 供选择?Java EE 产品?gt; h> 可扩展?gt; 可靠?gt; 性能• Ҏ(gu)扑ֈ开发h?br />
--------------------------------------------------------------------------------
Page 25
Java EE d了现代的企业U应?br />
--------------------------------------------------------------------------------
Page 26
怎样学习(fn) Java EE
--------------------------------------------------------------------------------
Page 27
步骤 1: 针对初学?#8226; 下蝲Java EE SDK Q试用其中的例子> http://java.sun.com/javaee/downloads/index.jsp>Java SE 5.0>Sun application server 9.0>例子>API 文档• 下蝲 Java EE 在线教材> http://java.sun.com/javaee/5/docs/tutorial/doc/> W二章:(x) Web Application h> W三章:(x) Servlet> W四章:(x) JSP
--------------------------------------------------------------------------------
Page 28
步骤 2: 学习(fn)使用 IDE• NetBeans IDE> http://www.netbeans.org> 免费且开?gt; 非常杰出?Java EE 支持>下蝲即用Q完整的 Java EE 环境• Eclipse
--------------------------------------------------------------------------------
Page 29
步骤 3: 学习(fn)使用 Java EE 架构• 架构提供解决Ҏ(gu)Q简化开?gt; Struts, JSF Q?Tapestry (Web ?)> Spring framework> JUnit ( 单元试架构 )> Log4j ( 日志架构 )> Hibernate (O/R mapping)> JDO ( 数据持久化框?)
--------------------------------------------------------------------------------
Page 30
步骤 4: 时刻保持技术更?• http://gceclub.sun.com.cn/>中国 Java 开发者社?#8226; http://www.csdn.net/• http://java.sun.com/Javaee• www.theserverside.com
--------------------------------------------------------------------------------
Page 31
ȝ
--------------------------------------------------------------------------------
Page 32
ȝ• Java EE 是标准的企业U应用的规范集合• Java EE 是开发现代的Z|络的企业应用的首选^
]]>
]]>
private Object value;
private long timeOut;
private boolean expired;
super();
}
public Cache(String key, String value, long timeOut, boolean expired) {
this.key = key;
this.value = value;
this.timeOut = timeOut;
this.expired = expired;
}
return key;
}
return timeOut;
}
return value;
}
key = string;
}
timeOut = l;
}
value = object;
}
return expired;
}
expired = b;
}
}
import java.util.HashMap;
private static HashMap cacheMap = new HashMap();
* This class is singleton so private constructor is used.
*/
private CacheManager() {
super();
}
* returns cache item from hashmap
* @param key
* @return Cache
*/
private synchronized static Cache getCache(String key) {
return (Cache)cacheMap.get(key);
}
* Looks at the hashmap if a cache item exists or not
* @param key
* @return Cache
*/
private synchronized static boolean hasCache(String key) {
return cacheMap.containsKey(key);
}
* Invalidates all cache
*/
public synchronized static void invalidateAll() {
cacheMap.clear();
}
* Invalidates a single cache item
* @param key
*/
public synchronized static void invalidate(String key) {
cacheMap.remove(key);
}
* Adds new item to cache hashmap
* @param key
* @return Cache
*/
private synchronized static void putCache(String key, Cache object) {
cacheMap.put(key, object);
}
* Reads a cache item's content
* @param key
* @return
*/
public static Cache getContent(String key) {
if (hasCache(key)) {
Cache cache = getCache(key);
if (cacheExpired(cache)) {
cache.setExpired(true);
}
return cache;
} else {
return null;
}
}
*
* @param key
* @param content
* @param ttl
*/
public static void putContent(String key, Object content, long ttl) {
Cache cache = new Cache();
cache.setKey(key);
cache.setValue(content);
cache.setTimeOut(ttl + new Date().getTime());
cache.setExpired(false);
putCache(key, cache);
}
/** @modelguid {172828D6-3AB2-46C4-96E2-E72B34264031} */
private static boolean cacheExpired(Cache cache) {
if (cache == null) {
return false;
}
long milisNow = new Date().getTime();
long milisExpire = cache.getTimeOut();
if (milisExpire < 0) { // Cache never expires
return false;
} else if (milisNow >= milisExpire) {
return true;
} else {
return false;
}
}
]]>
SourceForge 上一Ƒּ源IM软gQA simple and straightforeward instant messaging program written in Java for all platforms developed with ease of use and efficiency in mind.
http://sourceforge.net/projects/im-java/
Q?strong>Java Instant Messenger
http://zh.sourceforge.jp/projects/sfnet_jinstantmessage/
3?strong>IM客户?Spark
Spark是一个开源,跨^台IM客户端。它的特性支持集l聊天,?sh)话集成和强大安全性能。如果企业内部部|IM使用Openfire+Spark是最佳的l合?br />
http://www.oschina.net/p/spark
http://blog.csdn.net/masterjames/archive/2009/08/21/4465255.aspx
Q?strong>LumaQQ
LumaQQ 是一个独立的 Java QQ 客户端,h可重用的UJava核心和基于SWT的仿 QQ 界面。我们遵循GNU General Public License 许可证(UGPLQ发布。该条款的原文可见和 LumaQQ 源代码一同发布的 COPYING 文g?
需要特别声明的? LumaQQ 是以研究和学?fn)?f)目的的,我们q没有违? QQ 的版权许可的东西。一切的协议分析都是? QQ 当作黑箱分析Q我们所做的一切都遵@中华人民共和国《计机软g保护条例》?
http://lumaqq.linuxsir.org/main/index.php
Q?strong>Openfire
Openfire 是实时的ZWEB的即时消息传输^収ͼ是原来的Jive Messenger
http://www.oschina.net/p/openfire
Q?strong>cMQQ的聊天Y件JAVA版源码(附设计文档)
作者:(x)其实像QQ聊天q样的Y件有很多Q但基本上都没有公开源代码,而且也只是提供Y件客L(fng)Q有一些像ICQ的Y件虽提供服务端但却不公开源代码。本人很想知道它的运行机理,惛_明白它是怎么一回事Q所以就试着做了一个,虽然没有正式公司的那么复杂和友好的界面,但至可以给你点启发Q对学习(fn)是有帮助的?br />
http://www.codefans.net/soft/1472.shtml
http://www.chinajia.com/soft/downinfo/3383.html
Q?strong>JavaQQ.
用java写的单QQQ共?span class="t_tag" onclick="tagshow(event)">学习(fn) ?br />
http://www.itxuexi.com/bbs/thread-13226-1-1.html
http://download.csdn.net/source/745684
]]>
Java 中的 ClassPath ?Package
前言:
׃q两个问题新手问得较? 且回{比较零? 很难l一整理, 所
以就直接写了一? q请大家见谅.
正文:
一, c\?(class path)
当你满怀着希望安装好了 java, 然后兴冲冲地写了?hello world,然后~译,
q行, q着那两个美好的单词出现在眼? 可是不幸的是, 只看C Can't find
class HelloWorld 或?Exception in thread "main" java.lang.NoSuchMethodError: ma
in.
Z么呢? ~译好的 class 明明在呀.
我们一h看一?java E序的运行过E? 我们已经知道 java 是通过 java
发信? SuperMMX (W天?, 信区: Java
?? [整理] Java ?Class Path ?Package
发信? BBS 水木清华?(Mon Apr 9 08:15:01 2001)
Java 中的 ClassPath ?Package
前言:
׃q两个问题新手问得较? 且回{比较零? 很难l一整理, 所
以就直接写了一? q请大家见谅.
正文:
一, c\?(class path)
当你满怀着希望安装好了 java, 然后兴冲冲地写了?hello world,然后~译,
q行, q着那两个美好的单词出现在眼? 可是不幸的是, 只看C Can't find
class HelloWorld 或?Exception in thread "main" java.lang.NoSuchMethodError: ma
in.
Z么呢? ~译好的 class 明明在呀.
我们一h看一?java E序的运行过E? 我们已经知道 java 是通过 java
虚拟机来解释q行? 也就是通过 java 命o(h), javac ~译生成?.class
文g是虚拟执行的代? UC为字节码(bytecode), 虚拟机通过 classloader
来装载这些字节码, 也就是通常意义上的c? q里有一个问? classloader ?br />
哪里知道 java 本n的类库及用户自己的类在什么地方呢? 或者有着~省?当前路径).
或者要有一个用h定的变量来表? q个变量是c\?classpath), 或者在q行
的时候传参数l虚拟机. q也是指明 classpath 的三个方? ~译的过E和q行
的过E大同小? 只是一个是扑և来编? 另一个是扑և来装?
实际?java 虚拟机是?java luncher 初始化的, 也就?java (?java.exe)
q个E序来做? 虚拟机按以下序搜烦q装载所有需要的c?
1, 引导c? l成 java q_的类, 包含 rt.jar ?i18n.jar 中的c?
2, 扩展c? 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的 .jar 档案?
3, 用户c? 开发者定义的cL者没有?java 扩展机制的第三方产品. 你必d
命o(h)行中使用 -classpath 选项或者?CLASSPATH 环境变量来确定这些类的位|? ?br />
们在上面所说的用户自己的类是Ҏ(gu)q些c?
q样, 一般来? 用户只需指定用户cȝ位置, 引导cd扩展cL"自动"L?
那么到底该怎么做呢? 用户c\径就是一些包含类文g的目? .jar, .zip 文g?br />
列表, 至于cd体怎么? 因ؓ(f)牉|?package 的问? 下面会(x)说到, 暂时可认?br />
只要包含了这个类q扑ֈ了这个类. Ҏ(gu)q_的不同分隔符略有不同, c?unix 的系
l基本上都是 ":", windows 多是 ";". 其可能的来源?
* ".", 卛_前目? q个是缺省?
* CLASSPATH 环境变量, 一旦设|? 缺省D?
* 命o(h)行参?-cp 或?-classpath, 一旦指? 上两者覆?
* ?-jar 参数指定?.jar 档案? 把所有其他的D? 所有的c都来自q个?br />
定的档案包中. ׃生成可执行的 .jar 文g, q需要其他一些知? 比如 package, q有
特定的配|文? 本文的最后会(x)提到. 可先看看 jdk 自带的一些例?
我们举个 HelloWorld 的例子来说明. 先做以下假设:
* 当前目录?/HelloWorld (?c:\HelloWorld, 以后都用前一?
* jdk 版本?1.2.2 (linux 下的)
* PATH 环境变量讄正确. (q样可以在Q何目录下都可以用工?
* 文g?HelloWorld.java, 内容?
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!\n");
System.exit(0);
}
}
首先q个文g一定要写对, 如果?c 熟?zhn)的? 很有可能写成q样:
public static void main(int argc, String[] argv)
{
....
}
q样是不对的, 不信可以试一? ׃手头没有 java 的规? 所?br />
作如下猜? java ?application E序, 必须?public static void main(String[])
开? 其他不一L(fng)都不?
到现在ؓ(f)? 我们讄斚w只设|了 PATH.
1, 当前路径是指你?.class 文g在当前目录下,
[HelloWorld]$ javac HelloWorld.java //q一步不?x)有多大问?
[HelloWorld]$ java HelloWorld // q一步可能就?x)有问?
如果Z象开头那L(fng)问题, 首先定不是׃敲错命o(h)而出? 如果没有敲错命o(h),
那么接着?
[HelloWorld]$ echo $CLASSPATH
或?/p>
c:\HelloWorld>echo %CLASSPATH%
看看 CLASSPATH 环境变量是否讄? 如果讄? 那么用以下命?
[HelloWorld]$ CLASSPATH=
或?br />
c:\HelloWorld> set CLASSPATH=
来它ؓ(f)I? 然后重新q行. q次用户c\径缺省的?".", 所以应该不?x)有?br /> 同的问题? q有一个方法就是把 "." 加入?CLASSPATH ?
[/]$ CLASSPATH=$CLASSPATH:.
或?br />
c:\HelloWorld> set CLASSPATH=%CLASSPATH%;.
同样也可以成? Good Luck.
2, 当你的程序需要第三方的类库支? 而且比较常用, 可以采用此U方?比如?br />
用的数据库驱动程? ?servlet 需要的 servlet 包等{? 讄Ҏ(gu)是在环境变量中
加入 CLASSPATH. 然后可以直接编译运行了. q是?HelloWorld Z, 比如你想在根
目录中运行它, 那么你直接在根目录下执行
$ java HelloWorld
或?br />
c:\>java HelloWorld
q样肯定?x)出? 如果你的 CLASSPATH 没有改动的话. 我想大家应该知道Z么错?br />
? 那么怎么改呢? 前面说过, 用户c\径就是一些包含你所需要的cȝ目录, .jar 档案
? .zip ? 现在没有生成? 所以只好把 HelloWorld.class 所在的目录加到 CLASSPAT
H
? Ҏ(gu)前面的做? 再运行一? 看看, 呵呵, 成功? 换个路径, 又成功了!! 不仅?br />
?br />
以直接运行其中的c? 当你?import 其中的某些类? 同样处理.
不知道你惛_没有, 随着你的pȝ的不断的扩充, (当然? 都是一些需?java 的东
?
如果都加到这个环境变量里, 那这个变量会(x)来臃? 虽然环境变量I间可以开很大, ?br />
觉得有些不舒? 看看下面一个方?
3, 在命令行参数中指?classpath.
q是和上面相同的目标, 在Q何目录下执行 HelloWorld, 用这个方法怎么实现?
[/]$ java -cp /HelloWorld HelloWorld
或?/p>
c:\>java -cp c:\HelloWorld HelloWorld
可以了. q是q种Ҏ(gu)的最单的应用? 当你使用了另外的包的时? q可以采?br /> q?br /> U方? 例如:
$ javac -classpath aPath/aPackage.jar:. myJava.java
$ java -cp aPath/aPackage.jar:. myJava
或?br />
c:\> javac -classpath aPath\aPackage.jar;. myJava.java
c:\> java -cp aPath\aPackage.jar;. myJava
q种Ҏ(gu)也有一个不方便的的地方是当第三方包所在的路径较长或者需要两个以上包
?br />
时? 每次~译q行都要写很? 非常不方? q时候可以写脚本来解? 比如一个例?
compile (文g, 权限改ؓ(f)可执? 当前目录)
$ cat compile
---------------------------
#!/bin/bash
javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJav
a.java
---------------------------
run (文g, 权限改ؓ(f)可执? 当前目录)
$cat run
---------------------------
#!/bin/bash
java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava
---------------------------
或?
compile.bat
c:\HelloWorld> type compile.bat
-------------------------
javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJav
a.java
-------------------------
run.bat
c:\HelloWorld> type run.bat
------------------------
java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava
------------------------
可以了. 试试?
前面提到了扩展类, 扩展cL什么呢? java 的扩展类是应用E序开发者用?br />
扩展核心q_功能?java cȝ?或者是 native code). 虚拟像用系l类一
样用这些扩展类. 有h可以把包攑օ扩展目录? q样, CLASSPATH 也不用设?
也不用指定了, 岂不是很方便? 实可以正确q行, 但是个h认ؓ(f)q样不好, 不能什?br />
东西都往里搁, 一些标准的扩展包可? 比如, JavaServlet, Java3D {等. 可以提个
, 加一个环境变? 比如?JARPATH, 指定一个目? 专门存放用户?jar zip
{包, q个要等 SUN 公司来做?
windows98 ? 我原来安装的时? 一直装不上, LL, 好不Ҏ(gu)装上? ~?br />
省的是不能运行正的, 然后?tool.jar 攑օ CLASSPATH 后工作正? 现在作测?
L仍然是正的. l过多次试, 发现如果原来曾装q?jdk 的都很好, 没有装过?br />
装的时候会(x)L, 多装几次可以了. 如果你发现正安装后, 不能正常工作, 把
tools.jar 加入 CLASSPATH, 试一?
? ?(package)
Java 中的 "? 是一个比较重要的概念, package 是这样定义的:
Definition: A package is a collection of related classes and interfaces
that provides access protection and namespace management.
也就? 一个包是一些提供访问保护和命名I间理的相关类与接口的集合.
使用包的目的是使类Ҏ(gu)查找使用, 防止命名冲突, 以及控制讉K.
q里我们不讨论关于包的过多的东西, 只讨论和~译, q行, c\径相关的东西.
至于包的其他内容, 误己查阅相x?
单一Ҏ(gu)? 包就是一个目? 下面的子包就是子目录, q个包里的类是
q个目录下的文g. 我们用一个例子来说明.
首先建目录结构如? PackageTest/source/, 以后根目录指的是 PackageTest
目录, 我们的源E序攑֜ source 目录? 源程序如?
PackageTest.java
package pktest;
import pktest.subpk.*;
public class PackageTest
{
private String value;
public PackageTest(String s)
{
value = s;
}
public void printvalue()
{
System.out.println("value of PackageTest is " + value);
}
public static void main(String[] args)
{
PackageTest test = new PackageTest("This is a Test Package");
test.printvalue();
PackageSecond second = new PackageSecond("I am in PackageTest");
second.printvalue();
PackageSub sub = new PackageSub("I am in PackageTest");
sub.printvalue();
System.exit(0);
}
}
PackageSecond.java
package pktest;
public class PackageSecond
{
private String value;
public PackageSecond(String s)
{
value = s;
}
public void printvalue()
{
System.out.println("value of PackageSecond is " + value);
}
}
PackageSub.java
package pktest.subpk;
import pktest.*;
public class PackageSub
{
private String value;
public PackageSub(String s)
{
value = s;
}
public void printvalue()
{
PackageSecond second = new PackageSecond("I am in subpackage.");
second.printvalue();
System.out.println("value of PackageSub is " + value);
}
}
Main.java
import pktest.*;
import pktest.subpk.*;
public class Main()
{
public static void main()
{
PackageSecond second = new PackageSecond("I am in Main");
second.printvalue();
PackageSub sub = new PackageSub("I am in Main");
sub.printvalue();
System.exit(0);
}
}
其中, Main.java 是包之外的一个程? 用来试包外的程序访问包内的c?
PackageTest.java 属于 pktest q个? 也是ȝ? PackageSecond.java ?br />
属于 pktest, PackageSub 属于 pktest 下的 subpk ? 也就?pktest.subpk.
详细使用情况, 请参看源E序.
好了, 先把源程序都攑֜ source 目录? ?source 成ؓ(f)当前目录, 然后~?br />
译一? 呵呵, 出错?
Main.java:1: Package pktest not found in import.
import pktest.*;
q里涉及到类路径中包是怎么查找? 前面我们做了一点假? "只要包含?br />
q个cd找Cq个c?, 现在有问题? 其实 jdk ?工具 javac java
javadoc 都需要查扄, 看见目录, p为是包的名字, 对于 import 语句来说,
一个包对应一个目? q个例子? import pktest.*, 我们知道c\径可以包
含一个目? 那么׃那个目录为根, 比如有个目录 /myclass, 那么׃(x)在查?br />
/myclass/pktest 目录及其下的c? 所有的都找? 如果没有׃(x)报错. ׃现在
的类路径只有当前目录, 而当前目录下没有 pktest 目录, 所以就?x)出? c\?br />
q可以包?.jar .zip 文g, q些是可以带目录的压羃? 可以?.jar .zip
文g看做一个虚拟的目录, 然后和目录一样对待了.
好了, 应该知道怎么做了? 修改后的目录l构如下:
PackageTest
|
|__source Main.java
|
|__pktest PackageTest.java PackageSecond.java
|
|__subpk PackageSub.java
然后重新~译, q行, 哈哈, 通过? 我们再来q行一?PackageTest.
[source]$ java pktest/PackageTest
怎么又出错了?
Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest
是这L(fng), java 所要运行的是一个类的名? 它可不管你的cd什么地? p
我们前面所讨论的一h查找q个c? 所以它?pktest/PackageTest 看成是一个类?br />
名字? 当然?x)出错? 应该q么?
[source]$ java pktest.PackageTest
大家应该明白道理? 我就不多说了. 注意 javac 不一? 是可以指明源文g路径
? javac 只编? 不运? 查找cM只有在源文g中碰?import 时才?x)? 与源文g
所在的包没有关p?
gq又些不好的地方, 怎么生成?.class 文gq么分散呀, 看着真别? 别?
javac 有一?-d 命o(h)行参? 可以指定一个目? 把生成的 .class 文g按照包给?br />
好好地搁在这个目录里?
[source]$ mkdir classes
[source]$ javac -d classes pktest/PackageTest.java
[source]$ javac -d classes Main.java
那么q行怎么q行?
[source]$ cd classes
[classes]$ java pktest.PackageTest
[classes]$ java Main
可以了. 其实 jdk 的这一套工具小巧简? 功能强大, 不会(x)用或者用错其
实不兛_L(fng)? 关键是明白工兯后的一些原理和必要的知? 集成环境是很?
但是它屏蔽了很多底层的知? 不出错还? 一旦出? 如果没有q些必要的知?br />
很隑֊, 只好?bbs ? 别h只告诉了你解决的具体Ҏ(gu), 下一ơ遇到稍微变?br />
一点的问题又不懂了. 所以不要拘泥于工具, java 的这一套工L(fng)合v来? ?/p>
型工程(五六十个c?, q是应付得下来的.
? jar 文g
以下?.jar .zip 都看做是 .jar 文g.
1, 从前面我们可以看出来 jar 文g?java 中非帔R? 极大地方便了用户?br />
使用. 我们也可以做自己?.jar ?
q是使用前面那个例子, Main.java 是包之外的东? 用了 pktest 包中的类,
我们现在是要把 pktest 做成一?.jar ? 很简? 刚才我们已经?pktest
中的 .class 都集中v来了,
[classes]$ jar -cvf mypackage.jar pktest
׃(x)生成 mypackage.jar 文g, 试一? 刚才我们生成?Main.class 在
classes 目录? 所? 从前面可以知?
[classes]$ java -cp mypackage.jar:. Main
可以运行了.
2, 如果你看q?jdk 所带的例子, 你就?x)知? .jar q可以直接运?
[/demo]$ java -jar aJar.jar
那好, 那我们的试一?
[classes]$ java -jar mypackage.jar
Failed to load Main-Class manifest attribute from
mypackage.jar
看来我们?jar 和它?jar q不一? 有什么不一样呢? 拿它一个例子出?
重新~译, 生成 .jar 文g, 比较后发? ?.jar 压羃包中 META-INF/MANIFEST.MF
文g不一? 多了一? Main-Class: xxxxx, 再看看出错信? 原来是没有指?br />
Main-Class, 看看 jar 命o(h), 发现有一个参?-m,
-m include manifest information from specified manifest file
和出错信息有点关p? 看来它要M个配制文? 只好照猫画虎写一个了.
[classes]$ cat myManifest
Manifest-Version: 1.0
Main-Class: pktest.PackageTest
Created-By: 1.2.2 (Sun Microsystems Inc.)
[classes]$ jar cvfm mypackage.jar myManifest pktest
added manifest
adding: pktest/(in = 0) (out= 0)(stored 0%)
adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflated 40%)
adding: pktest/subpk/(in = 0) (out= 0)(stored 0%)
adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(deflated 38%)
adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflated 42%)
[classes]$ java -jar mypackage.jar
value of PackageTest is This is a Test Package
value of PackageSecond is I am in PackageTest
value of PackageSecond is I am in subpackage.
value of PackageSub is I am in PackageTest
好了, 成功? q样做好了一个可以直接执行的 .jar 文g. 大家可以自己试一?br /> 做一个以 Main ZE序的可执行?jar.
结:
q篇文章? 我们讨论?java 中的 class path, package, jar {基本但比较
重要的东? 主要?class path. q不是简单的一?CLASSPATH 的完全功? 而是
试图让读者明白其原理, 自己思? 自己动手. 其实大多C襉K?sun ?java doc
中都? 我只不过l合例子E微谈了一? 希望能有所帮助. ׃条g所? 只测试了
jdk1.2.2 ?98 ?linux 的情? 其他版本?jdk 和^台请大家自己试, 错误?br />
所隑օ, q请指正.
下面是一些需要注意的问题:
1, 如果c\径中需要用?.jar 文g, 必须?jar 文g的文件名攑օc\? 而不?br />
其所在的目录.
2, 在Q何时? cd必须带有完全的包?
3, "." 当前目录最好在你的c\径中.
下面是一些常见的~译和运行的模式.
4. To compile HelloWorld.java app in the default package in C:\MyDir, use
CD \MyDir
C:\jdk1.3\bin\Javac.exe -classpath . HelloWorld.java
5. To run a HelloWorld.class app, in the default package in C:\MyDir, use
CD \MyDir
C:\jdk1.3\bin\Java.exe -classpath . HelloWorld
6. To run a HelloWorld.class app, in the default package in a jar in C:\MyDir, u
se
CD \MyDir
C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar HelloWorld
7. To compile a HelloWorld.java app in C:\MyPackage, in package MyPackage, use
CD \
C:\jdk1.3\bin\Javac.exe -classpath . MyPackage\HelloWorld.java
8. To run a HelloWorld.class app in C:\MyPackage, in package MyPackage, use
CD \
C:\jdk1.3\bin\Java.exe -classpath . MyPackage.HelloWorld
9. To run a HelloWorld.class app in C:\MyPackage, in a jar in package MyPackage,
use
CD \MyDir
C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar MyPackage.HelloWorl
d
(? default package 指的是在E序中不指定M?.
最后一个小的, ?sun ?jdk tools documentQtion 好好地看一?
?jdk 的那些工?java javac javadoc jar javap jdb......好好用一? ?br />
有好处的. The Simplest Is The Best.
2.如何一ơ把一个目录下的所?jar加入到classpath?
tomcat的做?br />
//tomcat.bat
...
set _LIBJARS=
for %%i in (%TOMCAT_HOME%\lib\*.jar) do call
%TOMCAT_HOME%\bin\cpappend.bat %%i
...
//cpappend.bat
set _LIBJARS=%_LIBJARS%;%1
3.classspath 的默认值是什?
?JDK 1.2 中,有三个搜索\径用于查扄Q?br /> 1) java 搜烦cȝW一个位|是自Dc\径?br /> 可通过调用 System.getProperty("sun.boot.class.path") 查该路径的倹{?br /> 注意Q其中前~“sun.”昄臛_到现在ؓ(f)止,该属性是特定?Sun 公司的实现?br /> 2) java 查找cȝW二个位|是扩展目录?br /> 可通过调用 System.getProperty("java.ext.dirs") 查目录列表?br /> 3) java 查找cȝW三个位|是应用E序c\径?br /> 可通过调用 System.getProperty("java.class.path") 查该路径的倹{?/p>
you can get:
1) java_base\jre\lib\rt.jar
java_base\jre\lib\i18n.jar
java_base\jre\classes
2) java_base\jre\lib\ext
4.怎样扑ֈE序q行需要的c?
~译的时候用选项 javac -verbose ********
可以看你的程序都用到了类库中的哪些类 .
java -verbose
javac -verbose
是jdk很好的调试功?/p>
5. Linux下Path和ClassPath是怎么讄?
修改文g /etc/profile
CLASSPATH = pathAathBathC
export CLASSPATH
JAVA_HOMEcM
和windows下设|的主要区别应该在分隔符?/p>
6.如何修改path和classpath?
Ҏ(gu)一Q用cmdq入控制収ͼ输入set命o(h)Q你?x)看C机子上的所有环境变量的名称和|
然后你再输入set classpath=你要讄目录。就可以了!Q!
Ҏ(gu)二:(x)
2000,控制面板-》系l?》高U?》环境变?》系l变量,如果没有CLASSPATH变量p己新?br />
一?br />
xp:
开?> 我的?sh)?>属?>高Q>环境变量->新徏
JAVA_HOME
CLASSPATH
PATH
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/yicikou/archive/2004/06/28/28715.aspx
Fields_count ?fields
紧接着 interfaces 后面的是对该cL者接口中所生命的字D늚描述。首先是计数 fields_count Q它是类变量和实例变量的字段的数量d。在q个计数后面有相应数目个 field_info 表。此表包含了字段的名字、描q符和修饰符。如果该字段被声明ؓ(f) final Q?field_info q会(x)展示其常量倹{?
?2 Q?field_info 表的格式
自上而下分别为:(x)讉K标志Q简单名Uͼ非全限定名)Q字D|q符Q属性。字D|q符卌字段的型别?
Ҏ(gu)表与Ҏ(gu)表计数。方法表的格式与 field_info cMQ区别在于其描述的是Ҏ(gu)。故不再赘述?
Java 虚拟机实现定义了两种属?----SourceCode ?InnerClasses Q它们出现在 ClassFile 表中的属性列表中?
Class 的生命周?
Java 虚拟机通过装蝲、连接和初始化一?java cdQ该类型可以被正在q行?java E序所使用。其中,装蝲是把二q制形式?java cdd java 虚拟ZQ而连接就是把q种已经d虚拟机的二进制Ş式的cd数据合ƈ到虚拟机的运行时状态中。连接阶D分Z个子步骤 ----- 验证、准备、解析?#8220;验证”保?java cd数据格式正确q且适于 java 虚拟机的使用。?#8220;准备”步骤则负责ؓ(f)该类型分配它所需的内存,比如为它的类变量分配内存?#8220;解析”步骤则负责把帔R池中的符号引用{换ؓ(f)直接引用?
?3 Q类型生命周期的开?
装蝲
要装载一个类型, java 虚拟机必:(x)
通过该类型的完全限定名,产生一个代表该cd的二q制数据?
解析q个二进制数据流为方法去内的内部数据l构
创徏一个俄表示该类型的 java.lang.Class cȝ实例
装蝲步骤的最l品就是一?java.lang.Class 的实例对象,而这个对象就是该cd在虚拟机中的“注册”Q要讉K该类型的信息Q程序就要调用该cd对应?class 实例对象的方法?
所有类都由c装载器载入Q蝲入内存中的类对应一?java.lang.Class 实例。存在一?Bootstrap Loader Q以下简UCؓ(f) BL Q,?C++ 写成Q负责在虚拟机启动后一ơ性加?Java 基础cd中的所有类。其他的c装载器?java 写成Q都?java.lang.ClassLoader 的子cR除 BL 之外的所有类装蝲器都有一?parent 属性,指向其父装蝲器?
用户自定义的c装载器?java.lang.ClassLoader 的子cȝ实例Q它以定制的方式装入cR?
装蝲一个类Ӟ首先要装载该cȝ基类及其接口
Java 基础cȝ BL 在虚拟机启动时一ơ性蝲?
包含 main() 的入口类?AL ?loadClass() Ҏ(gu)载入?
?new 关键字创Z个类的实例。该cȝq行时刻包含?new 语句的类实例的类装蝲器( ClassLoader.getCallerClassLoader() Q的 loadClass() Ҏ(gu)载入
q接
验证
q接q程的第一步是验证 - 认cdW合 JAVA 语言的语义,q且它不?x)危及虚拟机的完整性。确保每?final cM含有子类Q?final Ҏ(gu)不能被覆盖,以及帔R池中所有的域引用和Ҏ(gu)引用有有效的名字和类型描q符受?
准备
JAVA 虚拟Zؓ(f)cd量分配内存,讄默认初始|非初始化时的默认|?
解析
初始?
在初始化阶段Q?Java 虚拟计者需要将cd量赋予正的初始倹{? <clinit> Ҏ(gu)Q类变量初始化语句与静态初始化?
包括class文g的结构、class是如何进入到虚拟Z的(c装载)、class的消亡(垃圾攉Q?/span>
Class 的结?
Class 文g?java 代码~译而来Q每个类都会(x)生成一?.class 文g?Java class 文g中包含了 java 虚拟机所需知道的、关于类或接口的所有信息。这些信息用表格的Ş式来说明Q我们可以得?classfile 表:(x)如图 1
?1 classfile 表的格式
其中cd或者ؓ(f)表名Q或者如?1 所C的“基本cd”。所有存储在cd u2 ?u4 ?u8 中的|?class 文g中以高位在前的Ş式出现?
U1 |
1 个字节,无符h? |
U2 |
1 个字节,无符h? |
U3 |
1 个字节,无符h? |
U4 |
1 个字节,无符h? |
?1 class 文g“基本cd”
Classfile 表中各项介如下:(x)
1) Magic( 数 )
每个 java class 文g的前 4 个字节被UCؓ(f) magic number Q?0xCAFEBABE 。魔数的作用在于Q可以轻杄分L?java class 文g和非 java class 文g?
Class 文g的下?4 个字节包含了L版本受随着 java 技术的发展Q?java class 文g格式可能?x)加入新?gu)?Class 文g格式一旦发生变化,版本号也?x)随之变化。如?class 文g的版本号出?java 虚拟机所能处理的有效范围Q?java 虚拟机将不会(x)处理该文件?
之后的是帔R池。其中包含了与文件中cd接口相关的常量。常量池中存储了诸如文字字符丌Ӏ?final 变量倹{类名和Ҏ(gu)名的帔R?Java 虚拟机把帔R池组lؓ(f)入口列表的Ş式。在实际列表 constant_pool 之前Q是入口在列表中的计?constant_pool_count ?
帔R池中的许多入口都指向其他的常量池入口Q而且 class 文g中紧随着帔R池的许多条目也会(x)指向帔R池中的入口。在整个 class 文g中,指示帔R池入口在帔R池列表中位置的整数烦引都指向q些帔R池入口。列表中的一烦引gؓ(f) 1 Q第二项索引gؓ(f) 2 Q以此类推?
例:(x) act.class 的常量池?
“ { }V ”表示一个返回类型ؓ(f) void 的方法?
讉K标志。这个字D表C的意思指明了文g中定义的是类q是接口Q还定义了在cL接口的声明中Q用了哪种修饰W:(x)是抽象的q是公共的,或者是 final 。类的类型可以ؓ(f) final Q?final cM可能是抽象的Q同时接口也不能?final cd?
q个cȝ名字和超cd字。特D的Q对?object c, super_class ?0 Q除此以?super_class 对于所有的cd有效。对于接口,在常量池入口 super_class 位置的项?java.lang.object
?
紧接着 super_class 的是 Interfaces_count 。此的含义为:(x)在文件中pcȝ接实现或者由该接口所扩展的父接口的数量。在q个技术的后面Q是名ؓ(f) interfaces 的数l,它包含了Ҏ(gu)个由pcȝ接实现或者由该接口所扩展的父接口的常量池索引?