Есть ли «правильный путь» для создания тощих войн и файлов с ушами в Gradle? - PullRequest
4 голосов
/ 14 июня 2011

Используя Gradle (и Java, очевидно), я хотел бы создать скину войны (без банок зависимостей в войне) и включить все зависимости в файл ear. Я немного покопался, но не могу найти никаких очевидных учебников по "тощей войне" для Gradle.

В Maven 2.2.1 (да, мы застряли в 2.2.1, не спрашивайте меня, почему), это было достигнуто путем создания отдельного проекта для ушей и повторения всех моих зависимостей от моего подчиненного проекты на слух .

Я могу представить, как бы я продублировал этот же хак в Gradle, но я надеюсь, что есть более разумный способ сделать это. У кого-нибудь есть идеи / примеры / предложения?

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

последний снимок Gradle 1.0-M4 содержит новый плагин для ушей.Вы можете обновить конфигурацию оболочки или загрузить снимок напрямую с

http://repo.gradle.org/gradle/distributions/gradle-snapshots/gradle-1.0-milestone-4-20110610162713+0200-bin.zip

Полный дистрибутив этого снимка, который можно загрузить по адресу http://repo.gradle.org/gradle/distributions/gradle-snapshots/gradle-1.0-milestone-4-20110610162713+0200-all.zip, содержит папку примеров с двумя примерами использованиянедавно введенного плагина ear.

Посмотрите на пример в samples / ear / earWithWar. В этом примере определяется ухо с войной.

Чтобы получить тощую войну, вы должны изменить build.gradle проекта войны.Чтобы получить войну без сторонних либов, вы должны добавить следующий фрагмент к сэмплам / ear / earWithWar / war / build.gradle:

war{
    classpath = []
}

Чтобы получить сторонних либов в подпапке lib / вашего ухаВы также должны добавить библиотеку, используемую плагином war, в конфигурацию earlib в корневом проекте.Пример делает это для библиотеки log4j.

Теперь запуск «gradle ear» в примере проекта создает ухо со скупой войной и сторонними библиотеками, хранящимися в подпапке lib / ear.

Полный снимок содержит дополнительную документацию вдокументы / подпапка о плагине уха

1 голос
/ 30 сентября 2015

Установка war { classpath = [] }, как предлагает Рене, запрещает включение всего - в конечном архиве даже нет WEB-INF/classes.Единственный известный мне способ исключить зависимости из файла WEB-INF/lib dir военного файла, но включив в него WEB-INF/classes, - это использовать конфигурации saidCompile и / или saidRuntime .Например

dependencies { providedCompile fileTree(dir: 'lib', include: '**/*.jar') }

0 голосов
/ 15 июня 2011

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

//Make sure the war and jars get built first
task ('ear', type:Jar, dependsOn: ":myWarProject:assemble" ){
    //This needs to be in the config block, or Gradle skips the task, assuming the file list for the jar/ear is empty...
    from{ "ear/src/main/application" }
}

ear.doFirst{
    //Set up the ear file name
    baseName = "myapp-" + rootVersion
    extension = "ear"

    //Gather up the jars required by all of the subprojects
    def allSubprojectDependencies = getAllProjectDependencies([
        "subproject1",
        "subproject2",
        "subproject3",
        "subproject4",
        "subproject5"
    ])
    from { allSubprojectDependencies }

    //grab the assembled war file
    from {
        subprojects.find{ it.name=="myWarFile" }.war.archivePath
    }

    //Other stuff required for our ear, such as security or eventing EJBs
    //Make sure you apply your "repositories" block to your root/ear project or "allProjects" if you do this...
    from { configurations.earConfig.files }

    //Create the classpath manifest
    manifestClassPath = allSubprojectDependencies.collect { it.name }.sort().join(' ')
    manifest { attributes( "Class-Path": manifestClassPath ) }
}

def getAllProjectDependencies (def projectNames){
    def allDependencies = []as Set
    projectNames.each{ projectName ->
        def subProject = subprojects.find{ subProject ->
            subProject.name.equals(projectName)
        }
        def subProjectDependencies = subProject.configurations.compile.files
        allDependencies.addAll subProjectDependencies
    }
    return allDependencies.unique{ a,b->
        if (a.equals(b)){
            return 0
        }
        return -1
    }
}

(Обратите внимание, что все банки специально находятся в корне уха. Не спрашивайте меня, почему, но некоторым людям явноэто так.)

...