-1

Java 代码文件包含@author 和@version 标签。版本标签包含有关文件修订号的信息。此信息位于评论中。是否有任何可用的编译标志或其他机制可以将这些信息添加到 .class 文件中?

4

2 回答 2

0

简短的回答:编译器忽略 JavaDoc 作为所有其他形式的注释。

长答案:您需要编写一个应用程序来复制类/方法声明上方的现有元素@author AuthorName@version VersionStringjavadoc 元素,例如:

@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"
于 2013-04-25T12:47:27.317 回答
0

有一次,我修改了我的 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则会返回值。

于 2013-04-25T13:06:29.857 回答