2014-05-29 9 views
2

Я пытаюсь разработать мультив макрода, который получает значения, разделенные запятой Require-Bundle, в файле манифеста, переданном как параметр. То, что я хочу, чтобы получить что-то вроде этого:Получить файл манифеста с ant

Require-Bundle=org.eclipse.ui,org.eclipse.ui.ide,org.eclipse.ui.views ...

Проблемы я столкнулся в моем коде является то, что он не принимает во внимание, если свойство имеет несколько значений в нескольких строках, здесь мой код:

<macrodef name="getDependencies"> 
    <attribute name="file" /> 
    <attribute name="prefix" default="ant-mf." /> 
    <sequential> 
     <loadproperties> 
      <file file="@{file}" /> 
      <filterchain> 
       <linecontains> 
        <contains value="Require-Bundle" /> 
       </linecontains> 
       <prefixlines prefix="@{prefix}" /> 
      </filterchain> 
     </loadproperties> 
    </sequential> 
</macrodef> 

Но это то, что я получаю:

[echoproperties] ant-mf.Require-Bundle=org.eclipse.ui,

Любая помощь будет appre лем, связанных.

ответ

0

Благодаря Chad Nouis я изменил подход macrodef к scriptdef. Я отлаживал и адаптировал сценарий Richard Steele для удовлетворения моих потребностей:

<!-- 
    Loads entries from a manifest file. 
    @manifest A manifest file to read 
    @entry  The name of the manifest entry to load (optional) 
    @prefix  A prefix to prepend (optional) 
--> 
<scriptdef name="getDependencies" language="javascript" description="Gets all entries or a specified one of a manifest file"> 
    <attribute name="manifest" /> 
    <attribute name="entry" /> 
    <attribute name="prefix" /> 
    <![CDATA[ 
     var filename = attributes.get("manifest"); 
     var entry = attributes.get("entry"); 
     if (entry == null) { 
      entry = ""; 
     } 
     var prefix = attributes.get("prefix"); 
     if (prefix == null) { 
      prefix = ""; 
     } 

     var manifest; 
     if (filename != null) { 
      manifest = new java.util.jar.Manifest(new java.io.FileInputStream(new java.io.File(filename))); 
     } else { 
      self.fail("File is required"); 
     } 

     if (manifest == null) { 
      self.log("Problem loading the Manifest"); 
     } else { 
      var attributes = manifest.getMainAttributes(); 
      if (attributes != null) { 
       if (entry != "") { 
        project.setProperty(prefix + entry, attributes.getValue(entry)); 
       } else { 
        var it = attributes.keySet().iterator(); 
        while (it.hasNext()) { 
         var key = it.next(); 
         project.setProperty(prefix + key, attributes.getValue(key)); 
        } 
       } 
      } 
     } 
    ]]> 
</scriptdef> 
1

Скорее всего, ваш файл манифеста выглядит следующим образом:

Require-Bundle: org.eclipse.ui, 
org.eclipse.ui.ide, 
org.eclipse.ui.views, 
... 

К сожалению, Java манифеста файлы не совсем Java Файлы свойств. Файлы манифеста могут иметь атрибуты, которые охватывают несколько строк, тогда как файлы свойств не могут иметь многострочные значения. Задача <loadproperties> не может обрабатывать многострочные атрибуты.

Вместо этого вам понадобится задача Ant, которая знает о файлах манифеста. В другом вопросе Richard Steele provides Ant script, который загружает файл манифеста из файла Jar. Вы можете адаптировать этот пример, чтобы получить только атрибут Require-Bundle.

Смежные вопросы