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

Java 以编程方式访问主类的MANIFEST.MF,java,jar,manifest,Java,Jar,Manifest,在不知道主类的名称的情况下,这是可能的吗?特别是我想要在应用程序启动时通过信息电子邮件发送实现版本属性。我所知道的访问该文件的唯一方法是知道我想要访问其信息的包或jar文件的名称;我不知道如何通过查找主类来实现这一点。那么您想了解主类,但不想知道它的名称 为了找到你要找的东西,你需要: 确定主类(抱歉,这是一项要求) 找出该类的加载位置 如果是JAR文件,则从该JAR文件加载清单 步骤1可能很困难:启动main类的线程可能已经完成——例如,许多GUI程序将执行class.main(String[

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

那么您想了解主类,但不想知道它的名称

为了找到你要找的东西,你需要:

  • 确定主类(抱歉,这是一项要求)
  • 找出该类的加载位置
  • 如果是JAR文件,则从该JAR文件加载清单
  • 步骤1可能很困难:启动main类的线程可能已经完成——例如,许多GUI程序将执行
    class.main(String[])
    方法,然后在AWT线程保持进程活动时终止。您可能根本无法识别主类。如果是这样的话,你可能就不走运了。您可以尝试
    sun.java.command
    system属性,但这可能仅在sun/Oracle JVM上有效

    步骤2相当简单:获取
    类加载器
    ,然后请求.Class文件本身的URL


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

    来自@Lee Meador的评论为查找清单提供了很好的提示。您不需要知道jar名称,只需要能够识别您的清单。建议:使用其他实现属性的任意组合来标识正确的清单。如果您已经在设置IMPLEMENTATION\u VERSION,为什么不同时设置IMPLEMENTATION\u名称以便可以找到它呢。一旦你得到了它,你可以通过查看条目找到你想要的。这样做更容易:

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

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