在ANT脚本中从另一个Manifest复制后,更改Manifest中的Attribute值

时间:2018-06-15 21:14:02

标签: java ant

我有一个清单文件位于" .. plugins / xyz.abc.e.tool.sa.app / META-INF / MANIFEST.MF"

我想复制Build-version:3.15.0.vqualifier并将其放在另一个位置的新Manifest文件中作为Build-version:3.15.0。有人可以帮助我完成我需要在ANT脚本中进行的更改吗?

<target name="create_sacode_jar">       
    <loadproperties srcFile="${buildDirectory}/plugins/xyz.abc.e.tool.sa.rcp/META-INF/MANIFEST.MF">
        <filterchain>
            <linecontains>
                <contains value="Bundle-Version" />
            </linecontains>
        </filterchain>
    </loadproperties>
    <jar destfile="${buildDirectory}/../bin/SACode.jar" filesetmanifest="mergewithoutmain">
        <manifest>
            <attribute name="Built-By" value="${user.name}" />
            <attribute name="Bundle-Version" value="${Bundle-Version}" />
            <attribute name="Class-Path" value="." />
        </manifest>
        <fileset dir="${buildDirectory}/plugins/xyz.abc.e.tool.sa.Generator/@dot" />
        <fileset dir="${buildDirectory}/plugins/xyz.abc.e.tool.sa.SAcode/@dot" />
    </jar>
</target>

1 个答案:

答案 0 :(得分:0)

jar清单不是属性文件。它们看起来很相似,但是使用的格式不同。

Here是属性文件的格式。

Here是jar清单的格式。

其中的区别是:

  • 清单行有长度限制。
  • 据我所知,清单不允许转义序列。
  • 在清单中,属性名称只需要与节相同。
  • 续行不同。

据我所知,没有标准的Ant任务可以读取单个清单条目。但是,您可以“作弊”并使用script

<script language="javascript">
    var Manifest = Java.type("java.util.jar.Manifest");
    var Files = Java.type("java.nio.file.Files");
    var Paths = Java.type("java.nio.file.Paths");
    var BufferedInputStream = Java.type("java.io.BufferedInputStream");

    var path = Paths.get(
        project.getProperty("buildDirectory"),
        "plugins/xyz.abc.e.tool.sa.rcp/META-INF/MANIFEST.MF");

    var stream = new BufferedInputStream(Files.newInputStream(path));
    var manifest = new Manifest(stream);
    stream.close();

    var version = manifest.getMainAttributes().getValue("Bundle-Version");
    project.setProperty("Bundle-Version", version);
</script>