2011-01-05 12 views
7

Mam domyślny plik właściwości i niektóre pliki właściwości specyficzne dla wdrożenia, które zastępują niektóre ustawienia z domyślnych, w oparciu o środowisko wdrażania. Chciałbym, aby mój skrypt budujący Ant scalił dwa pliki właściwości (nadpisując wartości domyślne z wartościami dotyczącymi wdrożenia), a następnie wyprowadziłby uzyskane właściwości do nowego pliku.Używanie narzędzia Ant do scalania dwóch różnych plików właściwości

Próbowałem robić to tak jak ja, ale nie powiodła się:

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

Odpowiedz

2

Wymyśliłem to. Musi być utworzony dodatkowy plik właściwości, z każdym kluczem/wartością w następującym formacie: mail.server.host = @ mail.server.host @ itd ...

Następnie określ ten "szablon" pliku do atrybutu "plik" zadania. Również w zestawie filtru należy podać wiele z najmniej ważnym z wymienionych na pierwszym miejscu.

Tak to będzie wyglądać następująco:

<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 swoją odpowiedź jako poprawne, jak to działa doskonale. –

0

Osobiście korzystam z tego:

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

zrobiłem to tak:

<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

wydaje mi się najlepszą odpowiedzią, ponieważ powinna działać z normalnymi plikami właściwości, a nie wymagać @ tokens @ – Rhubarb

+0

Jednak wydaje się, że dodaje tokeny ucieczki dla wartości różnych właściwości. Np .: Miałem aa = D: \ abcd. Zostało to przekonwertowane na aa = D \: \\ abcd. Czy istnieje sposób, aby tego uniknąć? Znalezione zadanie ant concat działa lepiej. – vanval

0

innych odpowiedzi są w porządku, ale ja potrzebowałem jednego bez tych ograniczeń:

  • Potrzeba wszystkie właściwości, które zostaną określone jako szablony z @ tokenów @ (pierwsza odpowiedź) rozszerzających
  • nieruchomości - np Mam właściwości zdefiniowane jako prop2 = $ {prop1}, które zostaną rozwinięte przez dowolne rozwiązanie, które ładuje i echa właściwości
  • EchoProperties (@ user2500146) wymyka się znakom takim jak dwukropki, co jest denerwujące dla właściwości URL (nie jest to błąd Anta, to standardowe właściwości Java , które umożliwiają: zamiast =)
  • Powtarzające właściwości z rozwiązań opartych concat (to działa, bo 2nd definicja jest ignorowany, ale nie chciałem Powtarzanie

w końcu musiałem uciekać do javascript w filtrze, ale moje rozwiązanie wprowadza właściwości domyślne wtedy i tylko wtedy, gdy nie są zdefiniowane w głównym pliku właściwości. Działa poprzez ładowanie głównych właściwości th niejasny prefiks, a następnie skopiowanie go do miejsca docelowego, a następnie dołączenie domyślnych właściwości, podczas gdy odfiltrowuje wszelkie domyślne właściwości, które zostały załadowane w pierwszym kroku.

Możesz użyć tego verbatim ale prawdopodobnie będą chcieli wykupić sprawozdań dziennika lub zmienić je na poziomie debugowania, gdy jesteś przekonany

<!-- 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

Aby być bardziej poprawnym, mogłem przeczytać właściwość PREFIX, aby upewnić się, że jest taka sama, ale nie jest warta dodatkowych kosztów – Rhubarb

Powiązane problemy