以编程方式访问主类的 MANIFEST.MF

Posted

技术标签:

【中文标题】以编程方式访问主类的 MANIFEST.MF【英文标题】:Programmatically access MANIFEST.MF of main class 【发布时间】:2012-12-13 21:20:33 【问题描述】:

如果不知道主类的名称,这可能吗?特别是我想要在应用程序启动时通过信息电子邮件发送的实施版本属性。我知道访问它的唯一方法需要知道我想要访问其信息的包或 jar 文件的名称;我不知道如何仅仅通过寻找主类来做到这一点。

【问题讨论】:

看这里:[***.com/questions/1272648/… [1]:***.com/questions/1272648/… @LeeMeador 这些答案都假定知道主类的名称。 从您的问题中不清楚您所处的上下文 - 如果您没有 jar 文件名 并且 您没有包/类名,您需要告诉我们我们必须使用哪些信息。这是一个命令行实用程序,还是应用程序服务器上下文中的东西等。您是否试图找到当前运行类的清单属性? @Gus 我希望可以从入口点开始工作,即 java 的任何类的 jar 都作为主类传递。 让你的构建编写一个类,每个可能的 main 方法调用它返回版本号可能会更容易。然后 main 方法可以将其放入您的电子邮件代码可以用来创建电子邮件的系统属性中。 【参考方案1】:

@Lee Meador 的 cmets 指出了查找清单的好方法。您不需要知道 jar 名称,您只需要能够识别您的清单。建议:使用其他 IMPLEMENTATION_* 属性的任意组合来识别正确的清单。如果您已经设置了 IMPLEMENTATION_VERSION,为什么不也设置 IMPLEMENTATION_NAME 以便您可以找到它。一旦你得到它,你可以浏览条目以找到你想要的。 Manifest API使它更容易:

            Attributes mainAtts = mf.getMainAttributes();
        if(mainAtts.containsKey(Attributes.Name.MAIN_CLASS))
            String mainClass = mainAtts.getValue(Attributes.Name.MAIN_CLASS);
            System.out.println(mainClass);
            String mainVer = mainAtts.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
            System.out.println(mainVer);
        

【讨论】:

【参考方案2】:

所以你想知道主类但不想知道它的名字是什么?

为了找到您要查找的内容,您需要:

    确定主类(抱歉,这是一个要求) 找出该类的加载位置 如果是 JAR 文件,则从该 JAR 文件加载清单

第 1 步可能很困难:启动主类的线程可能已经结束——例如,许多 GUI 程序将执行 Class.main(String[]) 方法,然后在 AWT 线程保持进程处于活动状态时终止。您可能根本无法识别主类。如果是这样的话,你很可能不走运。您可以尝试sun.java.command 系统属性,但这可能仅在 Sun/Oracle JVM 上有效。

第 2 步相当简单:获取 ClassClassLoader,然后询问 .class 文件本身的 URL。

第 3 步也相当简单:打开 JAR 文件并查找 META-INF/MANIFEST.MF 文件。

【讨论】:

以上是关于以编程方式访问主类的 MANIFEST.MF的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类(java)访问主类的变量?

在 Ruby 中以编程方式访问属性/方法注释

具有 UIView 继承类的 UIViewController,以编程方式

以编程方式从 CollectionView 单元推送 viewController 不起作用 - swift

子类如何访问父类

详解依赖注入(DI)和Ioc容器