Java 1.2引入了扩展机制(the extension mechanism)。
Extensions 是一组packages和classes,通过the extension mechanism来增加Java平台功能。 扩展机制让我们运行应用时,不用在classpath写extension classes的路径,就能让Java运行环境查找和装载这些extension classes。 Extension classes 如同Java 平台的core classes一样。 这就是为啥叫他们extentions的原因 --它们扩展Java的core API。
如上图所示,extensions充当Java平台的插件模块。他们的classes 和 public APIs可被平台上的所有应用使用。
扩展机制同时还为applets提供了下载远程extension classes的机制。
创建和使用Extensions
任意的packages或者classes都可以充当一个extension。Extensions用Jar文件来包装。可以通过如下2种方式来扩展extensions:
- install extensions - 把这个extension文件放到JRE的特殊的文件夹下
- download extensions - 把另一个jar文件的Manifest中引用这个extension文件。
Install extensions
把jar文件放到 <jdk_home>/jre/lib/ext文件夹下。
在Java 6 中,extension的搜索路径(java.ext.dirs)可以是多个,所以extension jar文件可以放置在任意文件路径下,没有上面必须放置在jre/lib/ext目录下的限制。这将是机器上的所有JRE都可以共享同一个扩展。
Download extensions
一个jar文件的Mainfest可以通过下面2中方式,在其headers中引用1个或多个extensions:
- Class-Path
- Extension-List
这2种方式是互斥的,也就是只能在headers使用任一种方式。Class-Path的方式不会把extension装在jre/lib/ext目录下,所以它每次都会下载所需的extensions,并且部署简单。 Extension-List方式只会在第一次下载extensions,然后安装在jre/lib/ext目录。缺点是部署系统时常常增加复杂性。
例如:
Class-Path: myapp/area.jar servlet.jar images/
在Class-Path中,任何不是以“/”结尾的路径,都被认作jar文件。以“/”结尾的路径表明时文件目录。
注:
- 在Manifest文件中,只可有一个Class-Path 头信息,并且每行长度不能超过72个字符长度。
- extensions的Manifest中也可以包含Class-Path头信息,也就是extensions可以是链状层次结构(daisy chained)。
Extension-List的例子请参考: http://java.sun.com/docs/books/tutorial/ext/basics/download.html
Extensions 的类加载策略
Java 的extension 框架采用委派方式加载类。当JRE需要加载一个类时,它按如下的路径顺序寻找该类:
- Bootstrap classes:rt.jar、i18n.jar等中的类。
- Installed extensions:先找java.ext.dirs路径中的类(install extensions),比如lib/ext目录下的类,然后再找download extensions。
- Class path:java.class.path路径下的类。
Java 类加载策略
Java平台用委派模型来加载类。每个类加载器都有一个“父”类加载器。当其需要加载一个类时,它首先从自己开始,层层向上委托检查是否已经加载,如果检查到,直接返回该类。如果没有查到,从根加载器(bootstrap)开始,层层向下委托,尝试加载。如果加载成功,返回该类。 如果最终所有的类加载器没有加载成功,抛出ClassNotFoundException异常。
如下是类加载api的一些提要:
- java.lang.ClassLoader及其子类的构造函数,在初始化时都允许指定一个“父”类加载器。如果没有指定,JVM会用system类加载器作为其默认的“父”类加载器。
- loadClass()方法执行如下任务:
- 如果这个类已经被加载,直接返回该类。
- 否则,委托让其“父”类加载器去加载该类(即调用父类的loadClass()方法)。
- 如此递归,如果“父”及其“祖先”类加载器加载该类失败,调用findClass()去查找并加载该类。
- findClass() 方法在其“父”及其“祖先”类加载器加载该类失败的情况下,才会自己查找该类。你可能要覆盖这个方法,如果你的应用需要开发使用自己的加载器的话。
- java.net.URLClassLoader作为extensions和其他jar文件的基础加载器类。它覆盖了java.lang.ClassLoader的findClass()方法,从而实现从1个或多个URL去查找类。
附: ClassLoader.loadClass()的源码
protected synchronized Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
// Returns the class with the given binary name if this
// loader has been recorded by the Java virtual machine as an initiating
// loader of a class with that binary name. Otherwise
// null is returned.
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
类加载和java命令
- 执行Java的命令时,如果指定-classpath或-cp命令行参数的值,会覆盖环境变量CLASSPATH的值。
- -jar 选项:如果通过java -jar 来运行一个可执行的jar包,这当前jar包会覆盖CLASSPATH的值。换句话说,-jar 后面所跟的jar包的优先级别最高,如果指定了-jar选项,所有环境变量和命令行制定的搜索路径都将被忽略。JVM APPClassloader将只会以jar包为搜索范围。
分享到:
相关推荐
1. **Java Extension Mechanism**:在Java中,"ext"通常与Java的扩展机制有关。Java平台允许开发者将自定义的类库放置在`jre/lib/ext`目录下,使得这些库对所有应用程序都可访问,无需在每个应用的classpath中单独...
Networking Override Mechanism Security Serialization Extension Mechanism XML JAXP lang and util Base Libraries lang and util Collections Concurrency Utilities JAR Logging Management Preferences ...
2. **扩展类装载器(Extension ClassLoader)**:用于装载扩展库,通常位于JAVA_HOME/lib/ext目录下。 3. **应用类装载器(Application ClassLoader)**:是程序默认的类装载器,用于装载应用程序的类路径...
Java提供了强大的加密库,如Java Cryptography Extension (JCE) 和 Java Cryptography Architecture (JCA),支持各种加密算法如AES、RSA等,可用于保护敏感信息,如密码、信用卡号等。 网络层面的安全同样不容忽视...
Note that the Java ...The Java Communications API is a Java extension that provides access to a variety of communication protocols and interfaces for communication between applications and devices.
* 使用安全点机制(Safepoint Mechanism):在 GC 发生时,让所有线程停在安全点上。 * 使用偏向锁机制(Biased Locking):让线程在锁竞争时停在安全点上。 垃圾收集器 Java 中的垃圾收集器有以下几种: * ...
- **Extension Mechanism**:允许用户通过扩展功能来增强Java应用程序。 - **XML JAXP**:Java API for XML Processing,用于处理XML文档。 #### `lang` 和 `util` 基础库 - **`lang`**:包含了一些核心类,如`...
2. ExtensionClassLoader(扩展类加载器):这种类加载器主要负责加载Java扩展机制(Extension Mechanism)指定目录下的jar包中的类。这些目录是由系统属性java.ext.dirs指定的。ExtensionClassLoader提供了对Java...
Java的包机制(Package Mechanism)是Java语言为了支持大型项目管理和组织代码而设计的一个重要特性。它允许开发者将类、接口等Java元素分组到不同的命名空间中,从而避免命名冲突,提高代码的可读性和维护性。 **...
Networking Override Mechanism Security Serialization Extension Mechanism XML JAXP lang and util Base Libraries lang and util Collections Concurrency Utilities JAR Logging Management Preferences ...
The JavaMail API is an optional package (standard extension) for reading, composing, and sending electronic messages. You use the package to create Mail User Agent (MUA) type programs, similar to ...
10. **Extension Mechanism**:JMF的设计允许添加新的媒体格式支持,开发者可以通过实现`javax.media.MediaLocator`和相应的Codec来扩展JMF对新格式的支持。 在`jmf20-apidocs`这个压缩包中,包含的是JMF 2.0版本的...
CXF这个名字代表了"Client eXtension Framework",暗示了它对客户端和服务端的支持。 2.2.8版本是Apache CXF的一个历史版本,发布于2010年,尽管现在已经有更新的版本,但这个版本仍然是许多项目中仍然使用的稳定...
7. **MTOM/XOP**:CXF支持Message Transmission Optimization Mechanism (MTOM)和XOP (XML-binary Optimized Packaging),这些特性可以显著减少大容量二进制数据传输时的网络带宽消耗。 8. **安全性**:CXF集成了...
- **cxf-rt-rs-extension-providers.jar**:RESTful服务的扩展提供者,如JSON和XML解析器。 此外,可能还包括其他的依赖jar包,如JAXB、StAX、DOM等基础库,以及Spring框架相关的jar,因为CXF经常与Spring集成来...
在实际应用中,根据项目需求,可能还需要添加其他的模块或特定功能的jar包,例如支持MTOM(Message Transmission Optimization Mechanism)或SWA(Simple Web Attachment)的文件上传,或者用于与其他WS-*规范(如WS...
5. **Extension Mechanism**: hybris 的核心是其扩展机制,允许开发者通过添加新的模块(称为“扩展”)来增加功能,而不会影响核心系统的稳定性和性能。 6. **PIM (Product Information Management)**: hybris ...
- `cxf-rt-rs-extension-providers.jar`:提供RESTful服务的扩展提供者,如JSON序列化和反序列化。 3. **依赖管理**:为了确保CXF能正常运行,还需要一些第三方库的JAR文件,如JAXB、Joda-Time(时间日期处理)、...