
无论是在打 jar 或 war 包时,都会生成 META-INFO 这个文件夹。我们需要了解这个路径,丰富自己的知识框架。
官方一点的说法:META-INF 相当于一个信息包,目录中的文件和目录获得 Java 2 平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务 manifest.mf 文件,在打包时自动生成。
简单的说法:就是存储了项目的元信息,其中文件 manifest.mf 仅此一份,描述了程序的基本信息、 Main-Class 的入口、 jar 依赖路径 Class-Path 。
由于这个目录下的信息大多是项目构建时自动生成,所以在不必要的情况下,不建议使用这个目录或修改这里的文件。
当然,我们在学习或使用 spi 时,会用到 META-INFO 下的 services 目录,我们会在这个目录下建一个接口全限定名,内容为实现类的全限定的类名。这时我们算是直接使用了这个目录,在这种情况下打出 war 包,解析包后我们会发现 META-INFO/services 这个目录其实是放在了WEB应用的安全目录WEB-INF下。
所以结论是:基本不用从开发的角度不用过多去关心这个目录,也不要挑战自己去破坏这个路径。然而在 spi 的特殊情况下,还应遵循这种 JDK 内置的服务提供发现机制。
官方文档 : https://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html
meta-inf相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务
manifest.mf文件,在用jar打包时自动生成的。
META-INF 存在程序入口相关信息, 每个jar 都会有这个文件夹,里面的 MANIFEST文件 记录这些信息WEB-INF 使用web 项目才会有这个文件夹,普通的 j2se项目 是没有这个文件夹的 我们把MANIFEST中的配置信息进行分类,可以归纳出下面几个大类:
一. 一般属性
Manifest-Version用来定义manifest文件的版本,例如:Manifest-Version: 1.0
Created-By声明该文件的生成者,一般该属性是由jar命令行工具生成的,例如:Created-By: Apache Ant 1.5.1
Signature-Version定义jar文件的签名版本
Class-Path应用程序或者类装载器使用该值来构建内部的类搜索路径
二. 应用程序相关属性
Main-Class定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。
三. 小程序(Applet)相关属性
Extendsion-List该属性指定了小程序需要的扩展信息列表,列表中的每个名字对应以下的属性
<extension>-Extension-Name3. <extension>-Specification-Version4. <extension>-Implementation-Version5. <extension>-Implementation-Vendor-Id5. <extension>-Implementation-URL四. 扩展标识属性1. Extension-Name该属性定义了jar文件的标识,例如Extension-Name: Struts Framework五. 包扩展属性1. Implementation-Title 定义了扩展实现的标题2. Implementation-Version 定义扩展实现的版本3. Implementation-Vendor 定义扩展实现的组织 4. Implementation-Vendor-Id 定义扩展实现的组织的标识5. Implementation-URL : 定义该扩展包的下载地址(URL)6. Specification-Title 定义扩展规范的标题7. Specification-Version 定义扩展规范的版本8. Specification-Vendor 声明了维护该规范的组织9. Sealed 定义jar文件是否封存,值可以是true或者false (这点我还不是很理解)六. 签名相关属性签名方面的属性我们可以来参照JavaMail所提供的mail.jar中的一段Name: javax/mail/Address.classDigest-Algorithms: SHA MD5 SHA-Digest: AjR7RqnN//cdYGouxbd06mSVfI4=MD5-Digest: ZnTIQ2aQAtSNIOWXI1pQpw==这段内容定义类签名的类名、计算摘要的算法名以及对应的摘要内容(使用BASE64方法进行编码)
Eclipse下打包源码jar还是很方便的,IDEA下就没有那么快捷的方法了,需要手动建立Artifact。对于我这种开源癖患者,断然无法接受看不到源码的binary。特别是遇到Lucene这样的重量级类库,总是好奇里面发生了些什么,并且时不时需要查看方法的注释。
像Lucene这样的Apache项目一般采用Ant编译,编译脚本里就附带了source-jar选项,如果项目里没有这个项目,就需要参照下面的步骤手动建立。
在Project Structure页面,新建一个Empty的Artifact:
然后点击加号,添加一个Directory Content:
将项目源码的第一层包(一般是edu,com等等域名)的上一级选中加入:
然后选中Build on make:
接着编译,编译完成之后就可以在crawler4j\classes\artifacts\crawler4j_source下找到名为crawler4j_source.jar的源码包了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)