簡體   English   中英

ANT讀取現有的MANIFEST版本並附加到該版本

[英]ANT read existing MANIFEST version and append to it

我需要編寫一個腳本來編寫ant腳本,以從META-INF / manifest.mf文件中讀取現有版本並將其追加。

應該可以使用ANT 清單任務來進行更新,但是我在讀取現有版本時遇到了麻煩。

由於清單條目使用keyvalue而不是key = value,因此我無法使用ANT的loadproperties任務讀取它們。

有沒有人做過/有任何想法?

謝謝

您需要在清單上使用<loadproperties>時要小心:盡管它似乎適用於短值,但由於清單條目的換行方式奇怪,當<loadproperties>超過70個字符時,它將失敗。 結果值將被截斷。

我編寫了一個<scriptdef>來完成您的要求,盡管尚未經過全面測試。

<!--
    Loads entries from a manifest file.

    @jar     The jar from where to read
    @file    A manifest file to read
    @prefix  A prefix to prepend
    @section The name of the manifest section to load
-->
<scriptdef name="loadmf" language="javascript" loaderRef="sharedbuild-loaderRef">
    <attribute name="jar" />
    <attribute name="file" />
    <attribute name="prefix" />
    <attribute name="section" />
    <![CDATA[
        var jarname = attributes.get("jar");
        var filename = attributes.get("file");
        if (jarname != null && filename != null) {
            self.fail("Only one of jar or file is required");
        }
        var prefix = attributes.get("prefix");
        if (prefix == null) {
            prefix = "";
        }
        var section = attributes.get("section");

        var manifest;
        if (jarname != null) {
            var jarfile = new java.util.jar.JarFile(new java.io.File(jarname));
            manifest = jarfile.getManifest();
        } else if (filename != null) {
            manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename)));
        } else {
            self.fail("One of jar or file is required");
        }

        if (manifest == null) {
            self.log("No manifest in " + jar);
        } else {
            var attributes = (section == null) ? manifest.getMainAttributes() : manifest.getAttributes(section);
            if (attributes != null) {
                var iter = attributes.entrySet().iterator();
                while (iter.hasNext()) {
                    var entry = iter.next();
                    project.setProperty(prefix + entry.getKey(), entry.getValue());
                }
            }
        }
    ]]>
</scriptdef>

我確信JavaScript可以改進-我不是專家-但它似乎對我來說足夠好(運行AntUnit測試以確保正確創建我的OSGi清單)。 jar(或ear或war)文件或獨立清單文件。

要使用清單屬性從清單中grep鍵的值,請使用以下宏定義=

<macrodef name="mfgrep">
  <attribute name="jar"/>
  <attribute name="key"/>
  <attribute name="update"/>
    <sequential>
      <loadproperties>
        <zipentry zipfile="@{jar}" name="META-INF/MANIFEST.MF"/>
      </loadproperties>
      <echo>@{key} => ${@{key}}</echo>
      <jar jarfile="@{jar}">
        <manifest>
          <attribute name="@{key}" value="@{update}"/>
        </manifest>
      </jar>
    </sequential>
</macrodef> 

 <!-- Grep a key from Manifest and update its value -->
 <mfgrep 
   jar="/home/gilreb/temp/test.jar"
   key="Manifest-Version"
   update="2.0"
 />

(可選)您可以在loadproperties中使用嵌套的濾鏈

<manifest>任務應完全按照您的要求進行。 它將新的清單鍵=值對附加到現有清單中。 知道為什么您不能使用它嗎?

您可以將<concat>任務與各種過濾器閱讀器一起使用,然后使用<loadproperties>任務加載結果。 它需要一點彎頭潤滑脂,但是這可能是這樣一種方式來讀取損壞的 Manifest文件,獲取值,然后用這些舊值重寫新的Manifest文件。

我必須查看您現有清單的示例以及要添加到清單中的內容,以便准確確定所需的內容。

謝謝大家,

僅供參考,這是我的最終代碼,已通過測試

這會將修訂版本號(第4個元素)添加到沒有修訂的版本中,或將修訂版本替換為已有版本的版本。

<available file="META-INF/MANIFEST.MF" property="has.manifest" />

<target name="loadBundleVersion" if="has.manifest">
    <!-- load version, if no current build number -->
    <loadproperties srcfile="META-INF/MANIFEST.MF">
        <filterchain>
            <linecontainsregexp>
                <regexp pattern="^Bundle-Version: \d*.\d*.\d*\s*$" />
            </linecontainsregexp>
        </filterchain>
    </loadproperties>
</target>

<target name="loadBundleVersionRemoveBuild" unless="Bundle-Version" depends="loadBundleVersion">
    <!-- if version not set here we have a current build number so needs to be stripped -->
    <loadproperties srcfile="META-INF/MANIFEST.MF">
        <filterchain>
            <linecontains>
                <contains value="Bundle-Version" />
            </linecontains>
            <tokenfilter>
                <replaceregex pattern=".\d*$" replace="" />
            </tokenfilter>
        </filterchain>
    </loadproperties>
</target>

<target name="loadBundleDetails" depends="loadBundleVersionRemoveBuild">
    <loadproperties srcfile="META-INF/MANIFEST.MF">
        <filterchain>
            <linecontains>
                <contains value="Bundle-SymbolicName" />
            </linecontains>
        </filterchain>
    </loadproperties>
</target>

<target name="updateManifestVersion" if="has.manifest" depends="loadBundleDetails">
    <manifest file="META-INF/MANIFEST.MF" mode="update">
        <attribute name="Bundle-Version" value="${Bundle-Version}.${build.number}" />
    </manifest>
</target>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM