从外部值定义编译时常量

时间:2015-02-02 07:05:09

标签: java compile-time-constant

我想在编译时分配的每个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并将其打包,并执行它;并按预期返回:

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 );
    }
}

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

Module2: 1.3.0

也很好。但作为一个完整性检查,我希望(希望/希望)Module1返回与之前相同的结果,所以我重新运行Module1,但是Bogus!它返回:

Module1: 1.3.0

关于如何解决此问题的任何建议?因此,模块中的版本保持与编译时相同,而不是在运行时的每个会话期间设置?

1 个答案:

答案 0 :(得分:1)

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

Implementation-Version: 1.2.3

有关详细信息,请参阅here

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