使用ant获取Manifest文件的条目

时间:2014-05-29 12:07:40

标签: ant manifest multiline

我正在尝试开发一个Ant macrodef,它获取在作为参数传递的Manifest文件中以Require-Bundle属性的逗号分隔的值。我想要获得的是这样的:

Require-Bundle=org.eclipse.ui,org.eclipse.ui.ide,org.eclipse.ui.views ...

我在代码中遇到的问题是,如果属性在多行中有多个值,则不会考虑这个问题,这是我的代码:

<macrodef name="getDependencies">
    <attribute name="file" />
    <attribute name="prefix" default="ant-mf." />
    <sequential>
        <loadproperties>
            <file file="@{file}" />
            <filterchain>
                <linecontains>
                    <contains value="Require-Bundle" />
                </linecontains>
                <prefixlines prefix="@{prefix}" />
            </filterchain>
        </loadproperties>
    </sequential>
</macrodef>

但这就是我得到的:

[echoproperties] ant-mf.Require-Bundle=org.eclipse.ui,

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

最有可能的是,您的清单文件如下所示:

Require-Bundle: org.eclipse.ui,
 org.eclipse.ui.ide,
 org.eclipse.ui.views,
 ...

不幸的是,Java Manifest文件并不是Java Properties文件。清单文件可以具有跨越多行的属性,而属性文件不能具有多行值。 <loadproperties>任务无法处理多行属性。

相反,您需要一个了解Manifest文件的Ant任务。在另一个问题中,Richard Steele provides Ant script从Jar文件加载Manifest文件。您可以调整示例以仅获取Require-Bundle属性。

答案 1 :(得分:1)

感谢Chad Nouis,我已将macrodef方法更改为scriptdef。我调试并调整了Richard Steele脚本以满足我的需求:

<!--
    Loads entries from a manifest file.
    @manifest   A manifest file to read
    @entry      The name of the manifest entry to load (optional)
    @prefix     A prefix to prepend (optional)
-->
<scriptdef name="getDependencies" language="javascript" description="Gets all entries or a specified one of a manifest file">
    <attribute name="manifest" />
    <attribute name="entry" />
    <attribute name="prefix" />
    <![CDATA[
        var filename = attributes.get("manifest");
        var entry = attributes.get("entry");
        if (entry == null) {
            entry = "";
        }
        var prefix = attributes.get("prefix");
        if (prefix == null) {
            prefix = "";
        }

        var manifest;
        if (filename != null) {
            manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename)));
        } else {
            self.fail("File is required");
        }

        if (manifest == null) {
            self.log("Problem loading the Manifest");
        } else {
            var attributes = manifest.getMainAttributes();
            if (attributes != null) {
                if (entry != "") {
                    project.setProperty(prefix + entry, attributes.getValue(entry));
                } else {
                    var it = attributes.keySet().iterator();
                    while (it.hasNext()) {
                        var key = it.next();
                        project.setProperty(prefix + key, attributes.getValue(key));
                    }
                }
            }
        }
    ]]>
</scriptdef>