2013-03-02 16 views
6

Buduję potok wdrażania dla kilku projektów, które zależą od siebie. Każda kompilacja tworzy nową kompilację wydania z unikalnym numerem wersji, który jest wdrażany w repozytorium Maven. Projekty znajdujące się dalej w potoku są następnie uruchamiane z tą nową wersją jako zależność i wbudowane w podobny sposób.Zmienianie wartości Maven pom.xml <properties> wartości fizycznych

Potrzebuję zmienić wartość właściwości w pom.xml (lub wszystkich poms w projekcie wielomodułowym) przed zbudowaniem projektu. Na przykład w poniższym kodzie "0.1.200" zostanie zmienione na "0.1.345" (lub jakikolwiek jest numer najnowszej wersji). Używanie właściwości systemu nie jest opcją, ponieważ zaktualizowany pom zostanie wdrożony w repozytorium Maven, więc zmiana musi być stała.

<properties> 
    <foo.version>0.1.200</foo.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>foo</artifactId> 
     <version>${foo.version}</version> 
    </dependency> 
</dependencies> 

Czy jest jakiś plugin Maven w ten sposób z jednej instrukcji wiersza poleceń? W przeciwnym razie będę musiał napisać krótki skrypt (np. W języku Ruby), który analizuje i zmienia wszystkie pliki pom.xml w projekcie.

Odpowiedz

1

Czy próbowałeś tego?

Version Maven Plugin

+2

Ta wtyczka ma operacje automatycznego aktualizowania zależności do ich najnowszych wersji, ale nie zauważyłem sposobu na aktualizację pojedynczej właściwości do określonej wartości. –

+2

[Wersja-maven-plugin] (http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html) jest w stanie obsłużyć takie właściwości. Zajrzyj do dokumentów. – khmarbaise

+2

Problem z wersjami: update-properties polega na tym, że automatycznie próbuje wykryć, jaka jest najnowsza wersja. W potoku wdrażania, który nie jest dobry, ponieważ może przypadkowo spowodować, że Maven znajdzie zbyt stare lub nowe wersje. Aby uniknąć niepowtarzalnych kompilacji, wymagam jednoznacznej wersji. –

3

Tak, istnieje maven-replacer-plugin która jest do tego zdolna.

Ale jeśli używasz jakiegoś narzędzia CI (które najwyraźniej jesteś), możesz równie dobrze trzymać się niestandardowego skryptu do tego celu.

2

Dostępne wtyczek Maven nie pasował mój cel, więc skończyło się na piśmie następujący skrypt Ruby, który robi dokładnie to, czego potrzebuję:

#!/usr/bin/env ruby 
require 'rexml/document' 

def change_property(pom, key, value) 
    property = pom.elements["/project/properties/#{key}"] 
    if property != nil 
    puts " #{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

unless ARGV.length == 2 
    puts "Usage: #{$0} KEY VALUE" 
    exit 1 
end 
KEY = ARGV.shift 
VALUE = ARGV.shift 

Dir.glob("**/pom.xml") { |pom_path| 
    puts pom_path 

    pom = REXML::Document.new(File.new(pom_path)) 
    pom.context[:attribute_quote] = :quote 
    change_property(pom, KEY, VALUE) 

    File.open(pom_path, 'wb') { |file| 
    pom.write(file) 
    } 
    puts 
} 
1

Miałem podobny wymóg. Poza aktualizowaniem właściwości w węźle/project/properties, potrzebuję również zaktualizować właściwość pod węzłem/project/profiles/properties, więc modyfikuję skrypt Esko, aby obsługiwał aktualizowanie obu przypadków. W międzyczasie obsługuje również aktualizowanie wielu właściwości w jednym poleceniu, więc nie trzeba go uruchamiać wielokrotnie, jeśli trzeba zaktualizować wiele właściwości w tym samym pliku pom.xml.

#!/usr/bin/env ruby 
require 'rexml/document' 

def change_profile_property(pom, profile_id, key, value) 
    property = pom.elements["/project/profiles/profile[id='#{profile_id}']/properties/#{key}"] 
    if property != nil 
    puts " #{profile_id}-#{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

def change_property(pom, key, value) 
    property = pom.elements["/project/properties/#{key}"] 
    if property != nil 
    puts " #{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

if ARGV.length == 0 
    puts "Usage: #{$0} KEY=VALUE [-profile <profile id>] KEY=VALUE" 
    exit 1 
end 

# parse the command line argument to get the key/value 
global_properties = Array.new 
profile_properties= Array.new 

profile = nil 
loop { case ARGV[0] 
    when '-profile' then ARGV.shift; profile=ARGV.shift 
    when nil then break 
    else 
    kv_str = ARGV.shift 
    if profile == nil 
     global_properties.push(kv_str) 
    else 
     profile_properties.push(kv_str) 
    end 
    end; 
} 

Dir.glob("**/pom.xml") { |pom_path| 
    puts pom_path 

    pom = REXML::Document.new(File.new(pom_path)) 
    pom.context[:attribute_quote] = :quote 

    # updating the global properties 
    if global_properties.length != 0 
    for kv in global_properties 
     kv_array = kv.split('=') 
     if kv_array.length == 2 
      change_property(pom, kv_array[0], kv_array[1]) 
     end 
    end 
    end 

    # updating the properties in profile 
    if profile_properties.length != 0 
    for kv in profile_properties 
     kv_array = kv.split('=') 
     if kv_array.length == 2 
     if profile != nil 
      change_profile_property(pom, profile, kv_array[0], kv_array[1]) 
     end 
    end 
    end 
    end 

    File.open(pom_path, 'wb') { |file| 
    pom.write(file) 
    } 
    puts 
} 
0

Flatten Maven Plugin może być użyty do aktualizacji zmiennych. Pozwól mi wyjaśnić na przykładzie.

<groupId>groupid</groupId> 
<artifactId>artifactid</artifactId> 
<version>${ServiceVersion}</version> 
<packaging>pom</packaging> 

<properties> 
    <foo.version>${ServiceVersion}</foo.version> 
</properties> 

W pom.xml używam "ServiceVersion", aby uzyskać wartość podczas kompilacji. Zmienna foo.version będzie również aktualizowana podczas kompilacji. Teraz zmienna foo.version może być używana w dowolnej zależności.

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>foo</artifactId> 
     <version>${foo.version}</version> 
    </dependency> 
</dependencies> 

Więc wreszcie zawierać Spłaszcz Maven Plugin w pom.xml

<plugin> 
<groupId>org.codehaus.mojo</groupId> 
<artifactId>flatten-maven-plugin</artifactId> 
<version>1.0.0</version> 
<configuration> 
    <updatePomFile>true</updatePomFile> 
</configuration> 
<executions> 
    <execution> 
     <id>flatten</id> 
     <phase>process-resources</phase> 
     <goals> 
      <goal>flatten</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>flatten.clean</id> 
     <phase>clean</phase> 
     <goals> 
     <goal>clean</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

teraz zapewnić wersję serwisu.

clean install -DServiceVersion=0.1.345 
Powiązane problemy