??xml version="1.0" encoding="utf-8" standalone="yes"?>
使用XMLOutputter转换XML文g的编码例子代码片?/P>
SAXBuilder builder = new SAXBuilder();
Document doc;
Format format = Format.getPrettyFormat();
format.setEncoding("GB2312");
XMLOutputter outputter = new XMLOutputter();
outputter.setFormat(format);
File file = new File(realPath);
doc = builder.build(file);
String xmlString = outputter.outputString(doc);
?JDOM 中,XML 元素是 Element 的实例,XML 属性就?Attribute 的实例,XML 文档本n是 Document 的实例?BR> 因ؓ JDOM 对象是?Document、Element ?Attribute q些cȝ直接实例Q因此创Z个新 JDOM 对象如?Java 语言中?new 操作W一样容易。JDOM 的用是直截了当的?BR> JDOM 使用标准?Java ~码模式。只要有可能Q它使用 Java new 操作W而不故弄玄虚使用复杂的工厂化模式Q对象操作即便对于初学用户也很方便?BR>
本文分两步对JDOM的应用加以介l:XML创徏 ?XML解析
一、XML文档创徏
我们由零开始利用JDOM生成一个XML文档。最后的l果(h文档)看v来象q样Q?BR> <?xml version="1.0" encoding="UTF-8"?>
<MyInfo comment="introduce myself">
<name>kingwong</name>
<sex value="male"/>
<contact>
<telephone>87654321</telephone>
</contact>
</MyInfo>
1.?MyInfo 为根元素创徏文档
Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的实例。根元素也不例外Q)
Document myDocument = new Document(rootElement);//以根元素作ؓ参数创徏Document对象。一个Document只有一个根Q即root元素?BR> 2.l根元素d属?BR> Attribute rootAttri = new Attribute("comment","introduce myself");//创徏名ؓ commnet,gؓ introduce myself 的属性?BR> rootElement.setAttribute(rootAttri);//刚创徏的属性添加到根元素?BR> q两行代码你也可以合成一行来写,象这P
rootElement.setAttribute(new Attribute("comment","introduce myself"));
或?BR> rootElement.setAttribute("comment","introduce myself");
3.d元素和子元素
JDOM里子元素是作?contentQ内容)d到父元素里面ȝ,所谓content是cM上面h文档?lt;name></name>之间的东东,即kingwong。罗嗦了Ҏ吧:Q?BR> Element nameElement = new Element("name");//创徏 name 元素
nameElement.addContent("kingwong");//kingwong作ؓcontentd到name元素
rootElement.addContent(nameElement);//name元素作ؓcontentd到根元素
q三行你也可以合Z句,象这P
rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因ؓaddContent(Content child)Ҏq回的是一个Parent接口Q而Elementcd时承了Contentcd实现了Parent接口Q所以我们把它造型成Content?BR>
我们用同LҎd带属性的子元?lt;sex value="male"/>
rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意q里不需要{型,因ؓaddAttribute(String name,String value)q回值就是一?Element?BR>
同样的,我们d<contract />元素到根元素下,用法上一P只是E微复杂了一些:
rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));
如果你对q种写Ş式还不太习惯Q你完全可以分步来做Q就象本节刚开始的时候一栗事实上如果层次比较多,写成分步的Ş式更清晰些,也不Ҏ出错?BR> 4.删除子元?BR> q个操作比较单:
rootElement.removeChild("sex");//该方法返回一个布?BR>
到目前ؓ止,我们学习了一下JDOM文档生成操作。上面徏立了一个样本文档,可是我们怎么知道对不对呢Q因此需要输出来看一下。我们将JDOM生成的文档输出到控制収ͼ使用 JDOM ?XMLOutputter cR?BR> 5. ?JDOM 转化?XML 文本
XMLOutputter xmlOut = new XMLOutputter(" ",true);
try {
xmlOut.output(myDocument,System.out);
} catch (IOException e) {
e.printStackTrace();
}
XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素羃q两个空|q且希望元素间有I?BR> new XMLOutputter(java.lang.String indent, boolean newlines)q个Ҏ在最新版本中已经不徏议用。JDOM有一个专门的用来定义格式化输出的c:org.jdom.output.FormatQ如果你没有Ҏ的要求,有时候用里面的几个静态方法(应该可以说是预定义格式)?getPrettyFormat()可以了。我们把上面的输出格式稍微改一下,pq样Q?BR> XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
6.JDOM文档转化为其他Ş?BR> XMLOutputter q可输出?Writer ?OutputStream。ؓ了输出JDOM文档C个文本文Ӟ我们可以q样做:
FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();
XMLOutputter q可输出到字W串,以便E序后面q行再处?
Strng outString = xmlOut.outputString(myDocument);
当然Q在输出的时候你不一定要输出所有的整个文档Q你可以选择元素q行输出Q?BR> xmlOut.output(rootElement.getChild("name"),System.out);
一句话QJDOM非常灉|方便Q如果你惌一步研IJDOMQ请到官方网站去看一看:http://www.jdom.org
本节CZ源码Q?BR>package com.cyberobject.study;
import java.io.IOException;
import org.jdom.Attribute;
import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestJDOM {
public static void main(String[] args)
{
Element rootElement = new Element("MyInfo");
Document myDocument = new Document(rootElement);
// Attribute rootAttri = new Attribute("comment","introduce myself");
// rootElement.setAttribute(rootAttri);
rootElement.setAttribute("comment","introduce myself");
//rootElement.setAttribute(new Attribute("comment","introduce myself"));
// Element sexElement = new Element("sex");
// rootElement.addContent(sexElement);
// Element nameElement = new Element("name");
// nameElement.addContent("kingwong");
// rootElement.addContent(nameElement);
rootElement.addContent((Content)(new Element("name").addContent("kingwong")));
rootElement.addContent(new Element("sex").setAttribute("value","male"));
rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));
rootElement.removeChild("sex");
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
try {
xmlOut.output(myDocument,System.out);
//xmlOut.output(rootElement.getChild("name"),System.out);
//String outString = xmlOut.outputString(myDocument);
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、XML文档解析
JDOM 不光可以很方便的建立XML文档Q它的另一个用处是它能够读取ƈ操作现有?XML 数据?BR> JDOM的解析器在org.jdom.input.*q个包里Q其中的DOMBuilder的功能是DOM模型的Document解析成JDOM模型的DocumentQSAXBuilder的功能是从文件或中解析出符合JDOM模型的XML树。由于我们经常要从一个文仉d数据Q因此我们应该采用后者作析工兗?BR>解析一个xml文档Q基本可以看成以下几个步骤:
1.实例化一个合适的解析器对?BR> 本例中我们用SAXBuilder:
SAXBuilder sb = new SAXBuilder();
2.以包含XML数据的文件ؓ参数Q构Z个文档对象myDocument
Document myDocument = sb.build(/some/directory/myFile.xml);
3.获到根元?BR> Element rootElement = myDocument.getRootElement();
一旦你获取了根元素Q你可以很方便地对它下面的子元素进行操作了Q下面对Element对象的一些常用方法作一下简单说明:
getChild("childname") q回指定名字的子节点,如果同一U有多个同名子节点,则只q回W一个;如果没有q回null倹{?BR> getChildren("childname") q回指定名字的子节点List集合。这样你可以遍历所有的同一U同名子节点?
getAttributeValue("name") q回指定属性名字的倹{如果没有该属性则q回null,有该属性但是gؓI,则返回空字符丌Ӏ?BR> getChildText("childname") q回指定子节点的内容文本倹{?BR> getText() q回该元素的内容文本倹{?BR>
q有其他没有|列出来的方法,如果需要的话,可以随时查阅JDOM的在U文档:http://www.jdom.org/docs/apidocs/index.html。当然你可以在你需要的地方d、删除元素操作,q记得上面的创徏XML的方法吗Q呵呵~~~
学习C东还是从实例学v最为快P下面单D个例子,׃上面的XMLh代码来学习JDOM的XML解析。本例中d了样本XML文g里一些属性和contentQ最后我们还在contact元素里插入了一个新元素<email value="wanghua@cyberobject.com" />。尽我们实C对于XML的基本操作,l心的朋友可能会
有疑问:如果XML文档的层ơ稍微复杂一些,如果嵌套多达几十上百层的话(开个玩W)Q如果靠q样从根元素一U一U地通过getChild("childname")来访问子元素的话Q将会非常痛苦!是的Q的是q样Q但是我们有另一个有力的工具XPathQؓ什么不用呢Q这是后话!先卖个关子(手敲累啦Q下回吧Q呵呵)?BR>
/*
* Created on 2004-8-21
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.cyberobject.study;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
* @author kingwong
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestJDOM2 {
public static void main(String[] args){
SAXBuilder sb = new SAXBuilder();
try
{
Document doc = sb.build("myFile.xml");
Element root = doc.getRootElement();
String str1 = root.getAttributeValue("comment");
System.out.println("Root Element's comment attribute is : " + str1);
String str2 = root.getChild("sex").getAttributeValue("value");
System.out.println("sex Element's value attribute is : " + str2);
String str3 = root.getChildText("name");
System.out.println("name Element's content is :" + str3);
String str4 = root.getChild("contact").getChildText("telephone");
System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");
Element inputElement = root.getChild("contact");
inputElement.addContent(new Element("email").setAttribute("value","wanghua@cyberobject.com"));
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());
String outStr = xmlOut.outputString(root);
System.out.println(outStr);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
JAR 文g是什么?
JAR 文g格式以流行的 ZIP 文g格式为基Q用于将许多个文件聚集ؓ一个文件。与 ZIP 文g不同的是QJAR 文g不仅用于压羃和发布,而且q用于部|和装库、组件和插gE序Qƈ可被像编译器?JVM q样的工L接用。在 JAR 中包含特D的文gQ如 manifests 和部|描q符Q用来指C工具如何处理特定的 JAR?
一?JAR 文g可以用于Q?
JAR 文g格式提供了许多优势和功能Q其中很多是传统的压~格式如 ZIP 或?TAR 所没有提供的。它们包括:
安全?/STRONG>?可以?JAR 文g内容加上数字化签名。这P能够识别{的工具就可以有选择Cؓ您授予Y件安全特权,q是其他文g做不到的Q它q可以检代码是否被改q?
减少下蝲旉?如果一?applet 捆绑C?JAR 文g中,那么览器就可以在一?HTTP 事务中下载这?applet 的类文g和相关的资源Q而不是对每一个文件打开一个新q接?
压羃。JAR 格式允许您压~文件以提高存储效率?
传输q_扩展?Java 扩展框架(Java Extensions Framework)提供了向 Java 核心q_d功能的方法,q些扩展是用 JAR 文g打包?Java 3D ?JavaMail 是?Sun 开发的扩展例子)?
包密?/STRONG>?存储?JAR 文g中的包可以选择q行密封Q以增强版本一致性和安全性。密一个包意味着包中的所有类都必d同一 JAR 文g中找到?
包版本控?/STRONG>?一?JAR 文g可以包含有关它所包含的文件的数据Q如厂商和版本信息?
可移植?/STRONG>?处理 JAR 文g的机制是 Java q_核心 API 的标准部分?
压羃的和未压~的 JAR
jar 工具(有关l节参阅 jar 工具)在默认情况下压羃文g。未压羃?JAR 文g一般可以比压羃q的 JAR 文g更快地装载,因ؓ在装载过E中要解压羃文gQ但是未压羃的文件在|络上的下蝲旉可能更长?
META-INF 目录
大多?JAR 文g包含一?META-INF 目录Q它用于存储包和扩展的配|数据,如安全性和版本信息。Java 2 q_识别q解?META-INF 目录中的下述文g和目录,以便配置应用E序、扩展和c装载器Q?
MANIFEST.MF?q个 manifest 文g定义了与扩展和包相关的数据?
INDEX.LIST?q个文g?jar 工具的新选项 -i 生成Q它包含在应用程序或者扩展中定义的包的位|信息。它?JarIndex 实现的一部分Qƈq装蝲器用于加速类装蝲q程?
xxx.SF?q是 JAR 文g的签名文件。占位符 xxx 标识了签名者?
xxx.DSA?与签名文件相兌的签名程序块文gQ它存储了用于签?JAR 文g的公q名?
jar 工具
Z?JAR 文g执行基本的Q务,要用作为Java Development Kit 的一部分提供?Java Archive Tool (jar 工具)。用 jar 命o调用 jar 工具。表 1 昄了一些常见的应用Q?
?1. 常见?jar 工具用法 功能 命o
用一个单独的文g创徏一?JAR 文g jar cf jar-file input-file...
用一个目录创Z?JAR 文g jar cf jar-file dir-name
创徏一个未压羃?JAR 文g jar cf0 jar-file dir-name
更新一?JAR 文g jar uf jar-file input-file...
查看一?JAR 文g的内?jar tf jar-file
提取一?JAR 文g的内?jar xf jar-file
从一?JAR 文g中提取特定的文g jar xf jar-file archived-file...
q行一个打包ؓ可执?JAR 文g的应用程?java -jar app.jar
可执行的 JAR
一个可执行?jar 文g是一个自包含?Java 应用E序Q它存储在特别配|的JAR 文g中,可以?JVM 直接执行它而无需事先提取文g或者设|类路径。要q行存储在非可执行的 JAR 中的应用E序Q必d它加入到您的c\径中Qƈ用名字调用应用程序的ȝ。但是用可执行?JAR 文gQ我们可以不用提取它或者知道主要入口点可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用E序?
创徏可执?JAR
创徏一个可执行 JAR 很容易。首先将所有应用程序代码放C个目录中。假讑ֺ用程序中的主cL com.mycompany.myapp.Sample。您要创Z个包含应用程序代码的 JAR 文gq标识出ȝ。ؓ此,在某个位|?不是在应用程序目录中)创徏一个名?manifest 的文Ӟq在其中加入以下一行:
Main-Class: com.mycompany.myapp.Sample
然后Q像q样创徏 JAR 文gQ?
jar cmf manifest ExecutableJar.jar application-dir
所要做的就是这些了 -- 现在可以?java -jar 执行q个 JAR 文g ExecutableJar.jar?
一个可执行?JAR 必须通过 menifest 文g的头引用它所需要的所有其他从?JAR。如果用了 -jar 选项Q那么环境变?CLASSPATH 和在命o行中指定的所有类路径都被 JVM 所忽略?
启动可执?JAR
既然我们已经自q应用E序打包C一个名?ExecutableJar.jar 的可执行 JAR 中了Q那么我们就可以用下面的命o直接从文件启动这个应用程序:
java -jar ExecutableJar.jar
包密?/STRONG>
密封 JAR 文g中的一个包意味着在这个包中定义的所有类都必d同一?JAR 文g中找到。这使包的作者可以增强打包类之间的版本一致性。密还提供了防止代码篡改的手段?
要密包Q需要在 JAR ?manifest 文g中ؓ包添加一?Name _然后加上gؓ“true”的 Sealed 头。与可执行的 JAR 一P可以在创?JAR Ӟ通过指定一个具有适当头元素的 manifest 文g密封一?JARQ如下所C:
Name: com/samplePackage/
Sealed: true
Name 头标识出包的相对路径名。它以一个?”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于?Name 头中指定的文件或者包。在上述例子中,因ؓ Sealed 头出现在 Name 头后q且中间没有IQ所?Sealed 头将被解释ؓ只应用到?com/samplePackage 上?
如果试图从密包所在的 JAR 文g以外的其他地方装载密包中的一个类Q那?JVM 抛Z?SecurityException?
扩展打包
扩展?Java q_增加了功能,?JAR 文g格式中已l加入了扩展机制。扩展机制?JAR 文g可以通过 manifest 文g中的 Class-Path 头指定所需要的其他 JAR 文g?
假设 extension1.jar ?extension2.jar 是同一个目录中的两?JAR 文gQextension1.jar ?manifest 文g包含以下_
Class-Path: extension2.jar
q个头表?extension2.jar 中的cL extension1.jar 中的cȝ扩展cRextension1.jar 中的cd以调?extension2.jar 中的c,q且不要?extension2.jar 处在c\径中?
在装载用扩展机制的 JAR ӞJVM 会高效而自动地在Class-Path 头中引用?JAR d到类路径中。不q,扩展 JAR 路径被解释ؓ相对路径Q所以一般来_扩展 JAR 必须存储在引用它?JAR 所在的同一目录中?
例如Q假讄 ExtensionClient 引用了类 ExtensionDemo,它捆l在一个名?ExtensionClient.jar ?JAR 文g中,而类 ExtensionDemo 则捆l在 ExtensionDemo.jar 中。ؓ了 ExtensionDemo.jar 可以成ؓ扩展Q必d ExtensionDemo.jar 列在 ExtensionClient.jar ?manifest ?Class-Path 头中Q如下所C:
Manifest-Version: 1.0
Class-Path: ExtensionDemo.jar
在这?manifest ?Class-Path 头的值是没有指定路径?ExtensionDemo.jarQ表?ExtensionDemo.jar ?ExtensionClient JAR 文g处在同一目录中?
JAR 文g中的安全?/STRONG>
JAR 文g可以?jarsigner 工具或者直接通过 java.security API {。一个签名的 JAR 文g与原来的 JAR 文g完全相同Q只是更C它的 manifestQƈ?META-INF 目录中增加了两个文gQ一个签名文件和一个签名块文g?
JAR 文g是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须?jarsigner 工具提供q个密码才能?JAR 文g{?
?1. Keystore 数据?/STRONG>
JAR 的每一位签名者都由在 JAR 文g?META-INF 目录中的一个具?.SF 扩展名的{文g表示。这个文件的格式cM?manifest 文g -- 一l?RFC-822 头。如下所C,它的l成包括一个主要部分,它包括了q名者提供的信息、但是不特别针对M特定?JAR 文g,q有一pd的单独的,q些也必须包含?menifest 文g中。在验证一个签名的 JAR Ӟ签名文件的摘要g?JAR 文g中的相应计的摘要D行比较?
清单 1. { JAR 中的 Manifest ?signature 文g
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 {文g的已{版本。数字签名文件是二进制文Ӟq且?.SF 文g有相同的文g名,但是扩展名不同。根据数字签名的cd -- RSA、DSA 或?PGP -- 以及用于{ JAR 的证书类型而有不同的扩展名?
Keystore
要签名一?JAR 文gQ必首先有一个私钥。私钥及其相关的公钥证书存储在名?keystores 的、有密码保护的数据库中。JDK 包含创徏和修?keystores 的工兗keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的{者的名字?
所?keystore ?密钥和信ȝ证书?都是用唯一别名讉K的。别名是在用 keytool -genkey 命o生成密钥?公钥和私?q在 keystore 中添加项时指定的。之后的 keytool 命o必须使用同样的别名引用这一V?
例如Q要用别名“james”生成一个新的公?U钥对ƈ公钥包装到自签名的证书中,要用下q命令:
keytool -genkey -alias james -keypass jamespass
-validity 80 -keystore jamesKeyStore
-storepass jamesKeyStorePass
q个命o序列指定了一个初始密码“jamespass”,后箋的命令在讉K keystore “jamesKeyStore”中与别名“james”相兌的私钥时Q就需要这个密码。如?keystore“jamesKeyStore”不存在Q则 keytool 会自动创建它?
jarsigner 工具
jarsigner 工具使用 keystore 生成或者验?JAR 文g的数字签名?
假设像上qC子那样创Z keystore “jamesKeyStore”,q且它包含一个别名ؓ“james”的密钥Q可以用下面的命令签名一?JAR 文gQ?
jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass
-keypass jamespass -signedjar SSample.jar Sample.jar james
q个命o用密码“jamesKeyStorePass”从名ؓ“jamesKeyStore”的 keystore 中提出别名ؓ“james”、密码ؓ“jamespass”的密钥Qƈ?Sample.jar 文g{、创Z个签名的 JAR -- SSample.jar?
jarsigner 工具q可以验证一个签名的 JAR 文gQ这U操作比{ JAR 文g要简单得多,只需执行以下命oQ?
jarsigner -verify SSample.jar
如果{?JAR 文g没有被篡改过Q那?jarsigner 工具׃告诉?JAR 通过验证了。否则,它会抛出一?SecurityExceptionQ?表明哪些文g没有通过验证?
q可以用 java.util.jar ?java.security API 以编E方式签?JAR(有关l节参阅参考资?。也可以使用?Netscape Object Signing Tool q样的工兗?
JAR 索引
如果一个应用程序或?applet 捆绑到多?JAR 文g中,那么c装载器׃用一个简单的U性搜索算法搜索类路径中的每一个元素,qɾc装载器可能要下载ƈ打开许多?JAR 文gQ直到找到所要的cL者资源。如果类装蝲器试囑֯找一个不存在的资源,那么在应用程序或?applet 中的所?JAR 文g都会下蝲。对于大型的|络应用E序?appletQ这会导致启动缓慢、响应迟~ƈ费带宽?
?JDK 1.3 以后QJAR 文g格式开始支持烦引以优化|络应用E序中类的搜索过E,特别?applet。JarIndex 机制攉?applet 或者应用程序中定义的所?JAR 文g的内容,q将q些信息存储到第一?JAR 文g中的索引文g中。下载了W一?JAR 文g后,applet c装载器用收集的内容信息高效地装?JAR 文g。这个目录信息存储在?JAR 文g?META-INF 目录中的一个名?INDEX.LIST 的简单文本文件中?
创徏一?JarIndex
可以通过?jar 命o中指?-i 选项创徏一?JarIndex。假设我们的目录l构如下图所C:
?2. JarIndex
您将使用下述命o?JarIndex_Main.jar、JarIndex_test.jar ?JarIndex_test1.jar 创徏一个烦引文Ӟ
jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar
INDEX.LIST 文g的格式很单,包含每个已烦引的 JAR 文g中包含的包或者类的名字,如清?2 所C:
清单 2. JarIndex INDEX.LIST 文gCZ
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
l束?/STRONG>
JAR 格式q远出了一U压~格式,它有许多可以改进效率、安全性和l织 Java 应用E序的功能。因些功能已l徏立在核心q_ -- 包括~译器和c装载器 -- 中了Q所以开发h员可以利?JAR 文g格式的能力简化和改进开发和部vq程?
Q关键字Qjava jarQ?
Q来源:csdn.netQ?/P>