Java 代码文件包含@author 和@version 标签。版本标签包含有关文件修订号的信息。此信息位于评论中。是否有任何可用的编译标志或其他机制可以将这些信息添加到 .class 文件中?
2 回答
简短的回答:编译器忽略 JavaDoc 作为所有其他形式的注释。
长答案:您需要编写一个应用程序来复制类/方法声明上方的现有元素@author AuthorName
和@version VersionString
javadoc 元素,例如:
@Author({"AuthorName", "OtherAuthor"})
@Version("VersionString")
public class Something [...] { [...] }
一个示例Author
注释可以是:
@Author("afk5min")
@Target({ ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
public @interface Author {
String[] value();
}
这样,每个注释都存在于生成的类文件中并且可以被访问。
9.6.3.2。@保留
注释可能只存在于源代码中,或者它们可能以类或接口的二进制形式存在。二进制形式的注解在运行时可能通过 Java SE 平台的反射库可用,也可能不可用。注释类型 java.lang.annotation.Retention 用于在这些可能性中进行选择。
此外,RetentionPolicy.RUNTIME
如果您希望运行时访问注释,可以指定。反射 API 允许这样做:
Author.class.getAnnotation(Author.class).value()[0] -> "afk5min"
有一次,我修改了我的 Ant 构建脚本以创建一个 MANIFEST.MF 文件,其中包含版本号以及其他信息。
这是最新的 MANIFEST.MF 文件,
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 19.0-b09 (Sun Microsystems Inc.)
Main-Class: gov.bop.svnreport.SVNReportMain
Built-By: Gilbert G. Le Blanc
Built-On: 20111109-1437
Version: 1.1.1
Specification-Title: Subversion Commit Report
Specification-Version: 1.1.1
Specification-Vendor: Federal Bureau of Prisons
Class-Path: svnkit.jar
这是来自 Ant 脚本的 JAR 目标。
<target name="jar" depends="compile">
<mkdir dir = "${jar}"/>
<echo>Jar directory - "${jar}"</echo>
<manifest file="META-INF/MANIFEST.MF">
<attribute name="Main-Class" value="gov.bop.svnreport.SVNReportMain"/>
<attribute name="Class-Path" value="svnkit.jar"/>
<!-- This line puts your username into the manifest.
Maybe you don't want to do that. -->
<attribute name="Built-By" value="Gilbert G. Le Blanc"/>
<attribute name="Built-On" value="${DSTAMP}-${TSTAMP}"/>
<!-- This property was set by the svn-info task -->
<!-- <attribute name="Revision" value="${svnrevision}"/> -->
<!-- This property comes from the build.properties file -->
<attribute name="Version" value="${app.version}"/>
<attribute name="Specification-Title" value="Subversion Commit Report"/>
<attribute name="Specification-Version" value="${app.version}"/>
<attribute name="Specification-Vendor" value="Federal Bureau of Prisons"/>
</manifest>
<jar jarfile="${jar}/${ant.project.name}.jar"
manifest="META-INF/MANIFEST.MF">
<fileset dir="${build}/">
<patternset refid="all-classes"/>
</fileset>
<fileset dir="." includes="${bin.includes}/"/>
</jar>
<copy file="${jar}/${ant.project.name}.jar" todir="${deploy}" />
<copy file="${svnkit}" todir="${deploy}" />
</target>
我试图将 Subversion 版本号放入 MANIFEST.MF 文件中,但我无法让它工作。
此方法的一个问题是它仅在您从 JAR 文件执行 Java 应用程序时才有效。如果您尝试从 Eclipse 等 IDE 中提取这些清单属性,null
则会返回值。