在 java 中,可以在打包是往包里添加包的版本等基本信息,这有助于各版本包之间的协调,在分布式系统中也适用。
在 java 包中添加基本信息有两种方式,一是传统的往包的 MANIFEST.MF 文件中写信息,二是用注解。
1,往 MANIFEST.MF 写信息,包括:
Name The name of the specification.
Specification-Title The title of the specification.
Specification-Version The version of the specification.
Specification-Vendor The vendor of the specification.
Implementation-Title The title of the implementation.
Implementation-Version The build number of the implementation.
Implementation-Vendor The vendor of the implementation.
如,java 的 util 包该文件内容如下:
Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Sun Microsystems, Inc.
该文件在打包时产生,信息由打包者输入。
以上信息将被 Java 虚拟机自动封装到 Package 对象中。假设包中包含 Test 类,那么用如下语句可以获取该包的信息:
Package myPackage = Test.class.getPackage();
myPackage.getImplementationVersion()
...
2,用注解添加包的基本信息
在 java 中有几种级别的注解,包括变量级、方法级、类级和包级,我们可以添加包注解,并在注解中添加包基本信息。
对于包级注解,java 做了如下规定:
包注解只能用在文件名为 package-info.java 的源文件中,并且该源文件只有包声明的语句,在包声明语句之前添加注解类,如:
@Annotation1(...)
package sample;
当 java 编译器碰到 package-info.java 文件的时候,它会为该文件产生一个名为 package-info.class 的文件,通过反编译可以看到该文件是一个抽象接口,如:
package sample;
@Annotation1(...)
abstract interface package-info{
}
于是在运行过程中就可以通过该接口获取包级注解了。
可以通过 java.lang.Package 对象来获取包级注解,查看该类的源码,可以看到获取某个特定注解过程如下:
应用程序调用 Package 的 getAnnotation 方法
/**
* @throws NullPointerException {@inheritDoc}
* @since 1.5
*/
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
return getPackageInfo().getAnnotation(annotationClass);
}
getAnnotation 方法再通过 getPackageInfo() 获得由编译器根据 package-info.java 文件产生的 package-info 接口,从而可以获得所有注解信息
private Class<?> getPackageInfo() {
if (packageInfo == null) {
try {
packageInfo = Class.forName(pkgName + ".package-info", false, loader);
} catch (ClassNotFoundException ex) {
// store a proxy for the package info that has no annotations
class PackageInfoProxy {}
packageInfo = PackageInfoProxy.class;
}
}
return packageInfo;
}
下面,写个简单例子,假设所有代码都在包 sample 下。
由上可以知道需要写的类有:
1.注解类:SampleAnnot.java(可以多个)
2.包级注解存放文件:package-info.java
3.我们再写个 Test.java
注解类:SampleAnnot.java,该类只有一个 field,就是 version
package sample;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PACKAGE)
public @interface SampleAnnot {
String version();
}
-------------------------------------------------------------
package-info.java:该文件只有一行包的声明语句和一行注解
@SampleAnnot(version="1.0")
package sample;
-------------------------------------------------------------
Test.java:该文件获取包对象,并从包对象中获取包的注解信息,关于获取过程请参照上面源码分析
package sample;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// 获取 SampleAnnot 注解
SampleAnnot sampleAnnot = Test.class.getPackage().getAnnotation(SampleAnnot.class);
// 打印版本信息
System.out.println(sampleAnnot.version());
}
}
分享到:
相关推荐
把java打包为可执行文件jar方法
用例子的详细的介绍了java中打包成可执行文件的过程,经过测试。
利用swt中的一个获取图片的类SwingResourceManager 来解决将程序打为使用java打包之后,生成的jar包中图片找不着的。这是因为通过class.getResource()方法在IDEA中运行的路径和生成jar包获取的的路径是不同的。打成...
java 打包 目录 文件 zip java 打包 目录 文件 zip java 打包 目录 文件 zip
java打包工具软件下载 nativej-trial.exe
基于JAVA的学生信息管理系统打包里面包涵多个用JAVA写的系统!
java打包jar.pdf
java项目打包工具!
java打包成exe
java打包成jar有多种方法,有jar命令,有eclipse有相关操作,有制作完成的jar文件就是可执行的,文件有详细操作步骤
java打包压缩ZIP 里面详细讲解了如何将一个文件打包 如何解压一个包
详细地介绍了最常用的几种Java打包方式,已及使用工具,是你能更方便和轻松地完成java打包
java打包成exe方法,内有详细说明。
详细说明了JAVA程序的打包和发布过程。
用java实现的一个下载打包功能,整理后供大家参考
NULL 博文链接:https://chenruieye.iteye.com/blog/1786421
JAVA打包EXE的工具 使用它后,JAVA做出来滴东东也可以直接生成EXE可执行文件 JAR TO EXE
将我们用Java写的程序打包成exe,让没有装Java的电脑也能运行
java打包技巧,应该还不错,下下来看看
java程序打包java程序打包java程序打包java程序打包java程序打包java程序打包