2011-03-15 1 views
0

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

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

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

У кого-нибудь это было/есть идеи?

Благодаря

+1

loadproperties for key-colon-value работает для меня с Ant 1.8.1. –

+0

Я могу подтвердить, что он работает с ant 1.7.1 также, мой плохой, проверка файла мешала ему полностью загружать –

ответ

1

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

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

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

+0

Спасибо Дэвиду, пропустив простой тест, это был мой чек, чтобы узнать, доступен ли файл манифеста, который препятствовал запуску loadproperty, поэтому я предположил, что он не работает , Loadproperty действительно работает с манифестом, а манифестная задача работает отлично :) –

2

Чтобы Grep значение ключа из манифеста loadproperties использования, вот macrodef, чтобы ты =

<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" 
/> 

необязательно вы можете использовать вложенные filterchains в loadproperties

8

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

+0

уверен, но длина строки> 70 символов вызывает проблемы и очень необычно – Rebse

+2

Я не уверен, почему вы думаете, что это вызывает проблемы, поскольку это стандартная часть спецификации фляги. Это не так редко, как вы думаете; OSGi, например, обычно создает очень длинные манифестные записи. –

+0

спасибо за подсказку - не подумал об этом, поэтому обычно работает loadproperties, но для специальных целей вам нужно использовать скриптовое решение или собственную задачу Ant. – Rebse

1

Спасибо Все,

FYI это мой последний код, испытанные работая

Это добавляет номер ревизии (четвёртая элемент) до версии без пересмотра или заменяет версию для версии, которая уже имеет один ,

<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> 
Смежные вопросы