2013-06-24 12 views
7

Używam Gradle do zbudowania słoika zawierającego plik xml w META-INF. Ten plik ma wiersz taki jak:Jak rozszerzyć odwołania do właściwości w zasobach jar?

, aby umożliwić różne bazy danych SQL dla różnych środowisk. Chcę powiedzieć gradle, aby rozwinąć ${sqlDialect} z właściwości projektu.

Próbowałem to:

jar { 
    expand project.properties 
} 

ale nie z GroovyRuntimeException, który wydaje mi się zadaniem Jar próbuje rozwinąć w .class właściwości plików, jak również. Tak więc próbowałem, aby nie wyrzucać powyższego wyjątku, ale zamiast tego powoduje to skopiowanie wszystkich zasobów - raz z rozszerzeniem właściwości i raz bez. Udało mi się obejść z

jar { 
    eachFile { 
     if(it.relativePath.segments[0] in ['META-INF']) { 
      expand project.properties 
     } 
    } 
} 

który robi to, co chcę, ponieważ w moim przypadku użycia tylko trzeba poszerzyć właściwości plików w katalogu META-INF. Ale to wydaje się dość brzydkim hackem, czy jest lepszy sposób na zrobienie tego?

Odpowiedz

10

Natknąłem się na this post w wątku na temat innego, ale blisko związanego problemu. Okazuje się, chcesz skonfigurować zadanie processResources, a nie zadanie jar:

processResources { 
    expand project.properties 
} 

Z jakiegoś powodu jednak, że musiał clean kiedyś Gradle zauważył zmianę.

0

Podjąłem pierwszą próbę i utworzyłem projekt testowy. Umieściłem plik pom z wtyczki Jennkins w ./src/main/resources/META-INF/. Zakładam, że jest to wystarczająco dobry przykład xml. Wymieniłem linię artifactId aby wyglądać następująco:

<artifactId>${artifactId}</artifactId> 

Moja build.gradle:

apply plugin: 'java' 

jar { 
    expand project.properties 
} 

Kiedy wpadłem gradle jar po raz pierwszy eksplodował, bo zapomniał określić wartość nieruchomości . Moja druga próba zakończyła się następującą komendą:

gradle jar -PartifactId=WhoCares 

Do celów testowych właśnie zdefiniowałem właściwość za pomocą -P. Nie jestem pewien, jak próbujesz zdefiniować swoją nieruchomość, ale być może to brakujący element. Nie widząc stosu wyjątków, trudno o tym wiedzieć, ale powyższy przykład działa doskonale dla mnie i wydaje się, że rozwiązuje twój problem.

6

Oprócz @ emil-Lundberg doskonałym rozwiązaniem jest, bym ograniczenie przetwarzania zasobu do zaledwie żądanego pliku docelowego:

budować.Gradle

processResources { 
    filesMatching("**/applicationContext.xml") { 
     expand(project: project) 
    } 
} 

Dodatkowa uwaga: jeśli ${...} nawiasy są przyczyną „Nie można rozwiązać zastępczy” błędy, można alternatywnie użyć <%=...%>. N.B. przetestowany z plikiem *.properties, nie wiesz, jak to by działało dla pliku XML.

+2

Nie działa dla mnie. Zrobiłem difefrently: 'processResources { filesMatching ("**/application.properties") { poszerzyć (project.properties) }' } – gmaslowski

+0

Tak (przepraszam). Właśnie skopiowałem kod z mojego projektu ... gdzie przedrostkiem moich zmiennych był 'project. *' Np. ''. –

1

oto co pracował dla mnie (Gradle 4.0.1) w projekcie wielomodułowego:

w /webshared/build.gradle:

import org.apache.tools.ant.filters.* 

afterEvaluate { 
    configure(allProcessResourcesTasks()) { 
     filter(ReplaceTokens, 
       tokens: [myAppVersion: MY_APP_VERSION]) 
    } 
} 


def allProcessResourcesTasks() { 
    sourceSets*.processResourcesTaskName.collect { 
     tasks[it] 
    } 
} 

i moja zmienna MY_APP_VERSION jest zdefiniowana w top-level build.gradle pliku:

ext { 

    // application release version. 
    // it is used in the ZIP file name and is shown in "About" dialog. 
    MY_APP_VERSION = "1.0.0-SNAPSHOT" 
} 

i mój plik zasobów jest w /webshared/src/main/resources/version.properties:

# Do NOT set application version here, set it in "build.gradle" file 
# This file is transformed/populated during the Gradle build. 
[email protected]@ 
0

Miałem podobne problemy z migracji z maven do stopniowania kompilacji. I do tej pory najprostszym/Najprostszym rozwiązaniem było po prostu wykonać filtrowanie siebie, takich jak:

proccessResources { 
    def buildProps = new Properties() 
    buildProps.load(file('build.properties').newReader()) 

    filter { String line -> 
    line.findAll(/\$\{([a-z,A-Z,0-9,\.]+)\}/).each { 
     def key = it.replace("\${", "").replace("}", "") 
     if (buildProps[key] != null) 
     { 
      line = line.replace(it, buildProps[key]) 
     } 
    } 
    line 
    } 
} 

To będzie ładować wszystkie właściwości z pliku określone właściwości i filtrować cały „$ {some.property.here}” wpisz placeholders. W pełni obsługuje właściwości oddzielone kropkami w pliku * .properties.

Jako dodatkowy bonus nie koliduje z obiektami zastępczymi typu $ someVar takimi jak expand(). Ponadto, jeśli nie można dopasować symbolu zastępczego do właściwości, pozostaje on nietknięty, zmniejszając w ten sposób możliwość wystąpienia konfliktów właściwości z różnych źródeł.

Powiązane problemy