使用ant获取Manifest文件的一个条目



我正试图开发一个Ant macrodef,它在作为参数传递的清单文件中通过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,

您的Manifest文件很可能是这样的:

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

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

相反,你需要一个知道Manifest文件的Ant任务。在另一个问题中,Richard Steele提供了从Jar文件加载Manifest文件的Ant脚本。您可以调整该示例,使其仅获得Require-Bundle属性。

感谢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>

相关内容

  • 没有找到相关文章

最新更新