【问题标题】:how to get entries from manifest.mf file bundled with jar如何从与 jar 捆绑的 manifest.mf 文件中获取条目
【发布时间】:2016-03-22 19:59:41
【问题描述】:

我遵循Reading my own Jar's Manifest 指南以编程方式获取清单条目。

我正在使用 maven-assembly-plugin 构建 jar 文件。清单文件位于 jar 文件内的META-INF/MANIFEST.MF

问题是无论如何我都会得到空条目。我尝试使用 JarFile 加载,使用 ClassLoaderResources 没有效果。

但是如果在 pom 文件中添加额外的条目,那么如果它们在单独的部分(用额外的换行符分隔),我可以读取这些条目。

如果我将条目添加到主要属性部分,那么它们是不可见的。

是否有可能出于某种安全原因以编程方式读取 manifest.mf 文件被禁用?

【问题讨论】:

  • 你为什么使用 maven-assembly-plugin 而不仅仅是 maven-jar-plugin?
  • 它非常强大。我需要一个罐子。
  • 奇怪的事情发生了。我读了清单,发现它是空的,然后将其转储到文件中。文件包含所有条目。我试图从文件中读取清单文件,结果相同,在内存中显示为空
  • 离题:插件有不同的用途。 maven-assembly-plugin 主要用于将各种不同的文件捆绑到单个 zip(或 tar 或任何其他支持的存档器)中以进行分发。如果你想要一个 jar,请使用 maven-jar-plugin。如果你想要一个胖客户端 jar,请使用 maven-shade-plugin。

标签: java maven maven-assembly-plugin


【解决方案1】:

我不知道为什么您在没有其他依赖项的情况下找不到清单条目,但是从清单中读取应该没有任何问题。我是这样做的:

private static final String MANIFEST_FILE_KEY = "META-INF/MANIFEST.MF";

......

        try (JarFile jar = new JarFile(URLDecoder.decode(jarFileURL.getPath(), "UTF-8"))) {
            Enumeration<JarEntry> entries = jar.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                if (entry.getName().equals(MANIFEST_FILE_KEY)){
                    //found our manifest
                    Manifest manifest = new Manifest(jar.getInputStream(entry));
                    Attributes attributes = manifest.getMainAttributes();
                    for (Entry<Object, Object> key : attributes.entrySet()) {
                        //do something with the key values
                    }
                    break;
                }
            }
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

【讨论】:

  • 我最终也想出了相同的解决方案。方法 getEntries() 的问题。它总是返回空的 hashmap。
猜你喜欢
  • 2017-01-26
  • 2011-10-27
  • 1970-01-01
  • 2011-04-16
  • 2013-02-13
  • 2016-10-17
  • 1970-01-01
  • 2013-11-02
  • 2012-09-23
相关资源
最近更新 更多