ANT прочитать существующую версию MANIFEST и добавить к ней - PullRequest
0 голосов
/ 15 марта 2011

Мне нужно написать скрипт сборки ant, который читает существующую версию из файла META-INF / manifest.mf и добавляет к нему.

Обновление должно быть возможно с использованием ANT manifest задача, однако у меня возникли проблемы с чтением существующей версии.

Поскольку записи манифеста используют ключ : значение вместо ключ = значение Я не могу прочитать их с помощью ANT loadproperties задача.

Кто-нибудь сделал это / есть какие-нибудь идеи?

Спасибо

Ответы [ 4 ]

8 голосов
/ 17 марта 2011

Вы должны быть осторожны, используя <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)или автономный файл манифеста.

2 голосов
/ 16 марта 2011

Чтобы получить значение ключа из манифеста, используйте loadproperties, вот макроопределение, которое поможет вам =

<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

1 голос
/ 20 марта 2011

Спасибо всем,

К вашему сведению, это мой окончательный код, проверено работает

Это добавляет номер версии (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>
1 голос
/ 16 марта 2011

Задача <manifest> должна делать именно то, что вы хотите.Он добавит новые пары ключ = значение манифеста в существующий манифест.Есть идеи, почему вы не можете его использовать?

Вы можете использовать задачу <concat> с различными программами чтения фильтров, а затем загрузить результат с задачей <loadproperties>.Это займет немного локоть смазки, но это может быть способ прочитать в вашем поврежденном файле манифеста таким образом, получить значения, а затем переписать новый файл манифеста с этими старыми значениями.

Мне нужно посмотреть образец вашего существующего манифеста и что вы хотите добавить к нему, чтобы точно выяснить, что вам нужно.

...