2012-12-28 19 views
2

这可能不知道主类的名称?具体来说,我是在应用程序启动时通过信息电子邮件发送的Implementation版本属性之后。我知道访问这个的唯一方法是需要知道我想访问的信息的jar文件的名称或包名;我不知道怎么做,只是通过寻找主要的课程。以编程方式访问主类的MANIFEST.MF

+0

请看:[http://stackoverflow.com/questions/1272648/reading-my-own-jars-manifest][1] [1 ]:http://stackoverflow.com/questions/1272648/reading-my-own-jars-manifest –

+0

@LeeMeador这些答案都假设知道主类的名称。 – djechlin

+0

从你的问题中不清楚你的背景 - 如果你没有jar文件名*和*你没有包名/类名,你需要告诉我们我们的信息必须从中工作。这是一个命令行实用程序,还是应用程序服务器上下文中的某些东西等等。您是否试图查找当前正在运行的类的清单属性? – Gus

回答

0

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

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

  1. 确定主类(不好意思,这将是一个要求)
  2. 找出这个类加载
  3. 如果它是一个JAR文件,从JAR文件中加载清单

第1步可能是困难的:在发起主类的线程可能已经完成 - 例如,许多GUI程序将执行Class.main(String[])方法,然后在AWT线程使进程保持活动状态时终止。你可能根本无法确定主要课程。如果是这样的话,你可能倒霉。您可以尝试使用sun.java.command系统属性,但这可能仅在Sun/Oracle JVM上有效。

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

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

1

来自@Lee Meador的评论指出了寻找您的Manifest的很好的提示。你不需要知道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); 
     }