0

我想在编译时分配的每个 jar 文件的主类中定义一个版本号,就像在 C 中使用带有外部文件值的 #include 语句可以轻松完成的操作一样。我只想在该外部位置设置一个值,因此在我更改它之前编译/构建的任何 jar 文件都会获得相同的值。

我的第一个想法是在一个通用类中定义它,然后像这样简单地引用它:

我创建一个 Base.java 文件:

class Base
{
    public final static String version = "1.2.3";
}

然后我编译 Base.java 并将其打包。

然后我创建一个 Module1.java 文件:

class Module1
{
    public final static String version = Base.version;

    public static void main( String[] args )
    {
        Module1();
    }

    Module1()
    {
        System.out.println( "Module1: "+this.version );
    }
}

但当然,如果不导入 Base 类,这将无法编译,所以我将其插入到 Module1 类之前:

import Base;

然后我编译 Module1.java 并将其 jar 起来,然后执行它;正如预期的那样,它返回:

Module1: 1.2.3

到目前为止,一切都很好。但随后我编辑 Base.java 文件并将版本值更改为不同的值,例如“1.3.0”,然后编译 Base.java 并将其打包。

现在我想创建一个 Module2.java 文件:

import Base;
class Module2
{
    public final static String version = Base.version;

    public static void main( String[] args )
    {
        Module2();
    }

    Module2()
    {
        System.out.println( "Module2: "+this.version );
    }
}

我编译并 jar 了 Module2,并正确执行它返回:

Module2: 1.3.0

也很好。但作为一个健全的检查,我希望(想要/希望)Module1 返回与以前相同的结果,所以我重新运行 Module1,但假的!它返回:

Module1: 1.3.0

关于如何解决这个问题的任何建议?所以模块中的版本保持在编译时的状态,而不是在运行时的每个会话期间设置?

4

1 回答 1

1

在 Java 中,存储 .jar 文件版本的标准位置是清单文件 (META-INF/MANIFEST.MF),而不是类文件。具体来说,把这条线放在那里:

Implementation-Version: 1.2.3

有关更多详细信息,请参见此处

要从您的代码中访问此信息,请使用java.util.jar.Manifest类,特别是 getMainAttributes() 方法。

于 2015-02-02T08:09:37.673 回答