当前位置:  开发笔记 > 编程语言 > 正文

如何在生产中测试和运行jar时创建一个可用的MANIFEST.MF?

如何解决《如何在生产中测试和运行jar时创建一个可用的MANIFEST.MF?》经验,为你挑选了1个好方法。

我花了太多时间试图解决这个问题.这应该是最简单的事情,每个在Java中分发Java应用程序的人都必须处理它.

我只是想知道向我的Java应用程序添加版本控制的正确方法,以便我可以在测试时访问版本信息,例如在Eclipse中调试从jar运行.

这是我在build.xml中的内容:


    
    
    
        
    

    
        
                           
        
                        
                                      
    

                       

这创建了/META-INF/MANIFEST.MF,我可以在Eclipse中调试时读取值:

public MyClass()
{
    try
    {                        
        InputStream stream = getClass().getResourceAsStream("/META-INF/MANIFEST.MF");
        Manifest manifest = new Manifest(stream);            

        Attributes attributes = manifest.getMainAttributes();

        String implementationTitle = attributes.getValue("Implementation-Title");
        String implementationVersion = attributes.getValue("Implementation-Version");
        String builtDate = attributes.getValue("Built-Date");
        String builtBy = attributes.getValue("Built-By");
   }
   catch (IOException e)
   {            
        logger.error("Couldn't read manifest.");
   }        

}

但是,当我创建jar文件时,它会加载另一个jar的清单(可能是应用程序加载的第一个jar - 在我的例子中,是activation.jar).

此外,尽管所有正确的值都在清单文件中,但以下代码不起作用.

    Package thisPackage = getClass().getPackage();
    String implementationVersion = thisPackage.getImplementationVersion();

有任何想法吗?



1> gibbss..:

您可以在任意jar中获取任意类的清单,而无需解析类URL(可能很脆弱).只需找到您知道的jar所需的资源,然后将连接转换为JarURLConnection.

如果您希望代码在类未捆绑在jar中时工作,请添加一个instanceof检查返回的URL连接类型.解压缩的类层次结构中的类将返回内部Sun FileURLConnection而不是JarUrlConnection.然后,您可以使用其他答案中描述的InputStream方法之一加载Manifest.

@Test
public void testManifest() throws IOException {
    URL res = org.junit.Assert.class.getResource(org.junit.Assert.class.getSimpleName() + ".class");
    JarURLConnection conn = (JarURLConnection) res.openConnection();
    Manifest mf = conn.getManifest();
    Attributes atts = mf.getMainAttributes();
    for (Object v : atts.values()) {
        System.out.println(v);
    }
}

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有