[英]ANT read existing MANIFEST version and append to it
我需要編寫一個腳本來編寫ant腳本,以從META-INF / manifest.mf文件中讀取現有版本並將其追加。
應該可以使用ANT 清單任務來進行更新,但是我在讀取現有版本時遇到了麻煩。
由於清單條目使用key : value而不是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.