2013-06-24 2 views
7

Я использую Gradle для сборки фляги, содержащей xml-файл в META-INF. Этот файл имеет строку, такую ​​какКак расширить ссылки на ресурсы в jar-ресурсах?

<property name="databasePlatform" value="${sqlDialect}" /> 

, позволяющий использовать различные базы данных SQL для разных сред. Я хочу сказать gradle, чтобы развернуть ${sqlDialect} из свойств проекта.

Я попытался это:

jar { 
    expand project.properties 
} 

но она не с GroovyRuntimeException, что мне кажется, как задача Jar пытается расширить свойства в .class файлов, а также. Затем я попытался

jar { 
    from(sourceSets.main.resources) { 
     expand project.properties 
    } 
} 

, не забросить выше исключение, но вместо этого приводит все ресурсы копируются дважды - один раз с расширением собственности и один раз без него. Мне удалось обойти это с

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

, который делает то, что я хочу, так как в моем случае использования нужно только расширить свойства файлов в каталоге META-INF. Но это похоже на довольно уродливый взлом, есть ли лучший способ сделать это?

ответ

10

Я наткнулся на this post в теме о другой, но тесно связанной проблеме. Оказывается, вы хотите настроить processResources задачи, не jar задачи:

processResources { 
    expand project.properties 
} 

По некоторым причинам, хотя, я должен clean однажды Gradle заметил изменения.

0

Я предпринял вашу первую попытку и создал тестовый проект. Я поместил файл pom из плагина jenkins в ./src/main/resources/META-INF/. Я предполагаю, что это достаточно хороший пример xml. Я заменил строку артефакта, чтобы выглядеть следующим образом:

<artifactId>${artifactId}</artifactId> 

Мой build.gradle:

apply plugin: 'java' 

jar { 
    expand project.properties 
} 

Когда я побежал gradle jar в первый раз она взорвалась, потому что я забыл, чтобы определить значение для свойства , Моей второй попытке удалось выполнить следующую командную строку:

gradle jar -PartifactId=WhoCares 

Для целей тестирования я просто определил свойство, используя -P. Я не уверен, как вы пытаетесь определить свою собственность, но, возможно, это недостающая часть. Не видя stacktrace вашего исключения, это трудно понять наверняка, но приведенный выше пример отлично работал для меня и, похоже, решил вашу проблему.

6

В дополнение к @ Emil-Lundberg отличное решение «s, я бы ограничить обработку ресурсов для всего желаемого целевого файла:

сборки.Gradle

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

Дополнительное примечание: если ${...} скобки вызывают «Не удалось разрешить заполнитель» ошибки, вы можете использовать в качестве альтернативы <%=...%>. N.B. проверен с файлом *.properties, не уверен, как это будет работать для XML-файла.

+2

Не работал для меня. Я сделал difefrently: 'processResources { filesMatching ("**/application.properties") { расширения (project.properties) }' } – gmaslowski

+0

Да (извините). Я просто скопировал код из моего проекта ... где я префикс моих переменных с помощью 'project. *', Например. ''. –

1

вот что работает для меня (Gradle 4.0.1) в проекте мульти-модуль:

в /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] 
    } 
} 

и моя MY_APP_VERSION переменная определена в верхнего уровня build.gradle файла:

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

и мой файл ресурсов в /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

У меня были проблемы с переходом от maven к конструкции градации. И до сих пор самое простое/простое решение было просто сделать фильтрование себя такие, как:

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

Это загрузит все свойства из файла заданных свойств и фильтровать все «$ {some.property.here}» тип заполнителей. Полностью поддерживает свойства, разделенные точками, в файле * .properties.

В качестве дополнительного бонуса он не сталкивается с заполнителями типа $ someVar типа expand(). Кроме того, если местозаполнитель не может быть сопоставлен с имуществом, он остается нетронутым, что уменьшает вероятность столкновения собственности из разных источников.

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