2011-01-05 24 views
7

Bir varsayılan özellikler dosyası ve bazı ayarları, varsayılan olarak dağıtım ortamına göre varsayılandan geçersiz kılan belirli özellik dosyalarına sahibim. Ant derleme betiğimin iki özellik dosyasını birleştirmesini (varsayılan değerlerin dağıtım özel değerleriyle üzerine yazılmasını) ve sonuçta ortaya çıkan özellikleri yeni bir dosyaya vermesini isterim. İki farklı özellik dosyasını birleştirmek için Ant'i kullanma

ben şöyle yapıyor denedim ama başarısız oldu:

<target depends="init" name="configure-target-environment"> 
    <filterset id="application-properties-filterset"> 
     <filtersfile file="${build.config.path}/${target.environment}/application.properties" /> 
    </filterset> 

    <copy todir="${web-inf.path}/conf" file="${build.config.path}/application.properties" overwrite="true" failonerror="true" > 
     <filterset refid="application-properties-filterset" /> 
    </copy> 
</target> 

cevap

2

Bunu çözdüm.

O zaman bu "şablon" dosyası belirtmek ... vb @ mail.server.host = @ mail.server.host: ekstra özellikler aşağıdaki biçimde her anahtar/değer ile, oluşturulan dosyası olması gerekir görevin "dosya" özniteliğine. Ayrıca, filtre kümesinde, en önce listelenen en az önemli olanı belirtin.

Yani şu şekilde görünecektir:

<copy todir="${web-inf.path}/conf" file="${build.config.path}/template.application.properties" overwrite="true" failonerror="true" > 
    <filterset refid="application-properties-filterset" /> 
</copy> 

+0

Mark kendi cevap olarak doğru ikna inmez, ayıklama düzeye onları değiştirmek isteyeceksiniz. –

0

Ben şahsen kullanmak bu:

<copy todir="${web-inf.path}/conf" filtering="true"> 
    <fileset dir="${build.config.path}" includes="*.properties" /> 
    <filterset> 
    <filtersfile file="application-properties-filterset" /> 
    </filterset> 
</copy> 
3

böyle yaptım:

<property prefix="app.properties" file="custom.application.properties" /> 
<property prefix="app.properties" file="default.application.properties" /> 
<echoproperties destfile="application.properties"> 
    <propertyset> 
     <propertyref prefix="app.properties"/> 
     <mapper type="glob" from="app.properties.*" to="*"/> 
    </propertyset> 
</echoproperties> 
+0

benim için en iyi cevap çünkü düzenli özellikler dosyaları ile çalışmak zorunda kalmadan @ tokens @ – Rhubarb

+0

Ancak, bu çeşitli özelliklerin değerleri için kaçış tokenları eklemek gibi görünüyor. Örneğin: aa = D: \ abcd. Bu aa = D \: \\ abcd'ye dönüştürüldü. Bundan kaçınmak için herhangi bir yol var mı? Karınca konsat görevini daha iyi çalıştı. – vanval

0

diğer cevaplar tamam, ama ben bu sınırlamalar olmadan birini gerekli:

  • tüm özelliklerini @ jeton @ (ilk yanıt)
  • Mülkiyet genişleme ile şablon olarak belirtilmesi gerekliliği - Örneğin Yükler ve echos özellikleri
  • EchoProperties'in (@ user2500146) herhangi bir çözümle genişletileceği prop2 = $ {prop1} özelliklerinin, URL özellikleri için rahatsız edici olan (Ant'in hatası değil, standart Java Properties'dir) karakterler gibi karakterlerden kaçmasını sağlar. izin hangi: = yerine) concat tabanlı çözümlerden
  • Tekrarlanan özellikleri (2 tanım yok sayılır, çünkü bu, çalışır, ancak ben başvurmak zorunda sonunda tekrarlar

istemediğini de Bir filtrede javascript için, ama benim temel özellikler dosyasında tanımlı değillerse ve eğer sadece ana özellikler dosyasında tanımlanmamışlarsa benim çözümüm varsayılan özellikleri getiriyor .. belirsiz bir önek, sonra hedefe kopyalayın ve sonra , filtrelemeyi yaparken varsayılan özellikleri uydurun, ilk adımda yüklenen herhangi bir varsayılan özellik.

Bu harfi harfine kullanabilirsiniz ama mükemmel çalışıyor muhtemelen, günlük ifadeleri çıkarmak veya

<!-- merge the main.properties.file with the default.properties.file 
    into the output.properties.file (make sure these are defined) --> 
<target name="merge"> 
    <!--Obscure enough prefix to ensure the right props are handled--> 
    <property name="prefix" value="__MY_PREFIX__"/> 
    <!--Load the main properties so we can tell if the default is needed--> 
    <property prefix="${prefix}" file="${main.properties.file}"/> 

    <!--Copy the main properties, then append the defaults selectively--> 
    <copy file="${main.properties.file}" tofile="${output.properties.file}" overwrite="true"/> 
    <concat destfile="${output.properties.file}" append="true"> 
     <fileset file="${default.properties.file}"/> 
     <filterchain> 
      <!--Filter out lines with properties that were already in the main properties --> 
      <scriptfilter language="javascript"> <![CDATA[ 
      var line = self.getToken(); 
      project.log("line: " + line); 
      var skipLine = false; 
      // lines that do not define properties are concatenated 
      if (line.indexOf("=") != -1) { 
       // get the property name from the line 
       var propName = line.substr(0, line.indexOf('=')); 
       project.log("line prop: " + propName); 
       var loadedPropName = "__MY_PREFIX__" + propName; 
       if (project.getProperty(loadedPropName) != null) { 
        project.log("prop has original: " + project.getProperty(loadedPropName)); 
        // skip this line, the property is defined 
        skipLine = true; 
       } 
      } 

      if (skipLine) { 
       project.log("skipping line: " + line); 
       self.setToken(null); 
      } 
      else { 
       // else leave the line in as it was 
       project.log("adding default line: " + line); 
       self.setToken(line); 
      } 

]]> </scriptfilter> 
     </filterchain> 
    </concat> 
</target> 
+0

Daha doğru olması için PREFIX özelliğini aynı olduğundan emin olmak için okuyabiliyordum, ancak bu ek maliyete değmiyor – Rhubarb

İlgili konular