在Gradle中,是否有“正确的方式”来产生瘦弱的战争和耳钉

|| 我想使用Gradle(显然是Java)来进行一场瘦小的战争(战争中没有依赖罐),并将所有依赖项包含在ear文件中。我已经进行了一些挖掘,但是找不到Gradle的任何明显的“瘦身战争”教程。 在Maven 2.2.1中(是的,我们陷在2.2.1中,不要问我为什么),这是通过创建一个单独的ear项目并在耳朵中重复我所有与子项目的依赖关系来实现的。 我可以想象如何在Gradle中复制相同的hack,但是我希望有一种更聪明的方式来做到这一点。有没有人有任何想法/示例/建议?     
已邀请:
        gradle的最新1.0-M4快照包含新的Ear插件。您可以更新包装器配置,也可以直接从下载快照 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下载此快照的完整发行版,其中包含一个示例文件夹,其中包含两个示例用法新推出的耳塞。 看一下samples / ear / earWithWar中的示例此示例定义了带有战争的耳朵。 要进行一场枯燥的战争,您必须修改war项目的build.gradle。要在没有第三方库的情况下进行战争,您必须将以下代码段添加到sample / ear / earWithWar / war / build.gradle:
war{
    classpath = []
}
为了在您的耳朵的lib /子文件夹中获得第三方库,您还必须将war插件使用的库也添加到根项目的earlib配置中。该示例对log4j库执行此操作。 现在,在示例项目上运行\“ gradle ear \”,创建了一场枯燥的战争,并且第三方libs存储在ear的lib /子文件夹中。 完整的快照在docs /子文件夹中包含有关耳插件的更多文档     
        Rene建议您将ѭ1设置为1可以防止所有内容被包含-最终存档中甚至不包含
WEB-INF/classes
。我知道从war文件的
WEB-INF/lib
目录中排除依赖项,但仍包括
WEB-INF/classes
的唯一方法是使用providerCompile和/或providerRuntime配置。例如
dependencies {
    providedCompile fileTree(dir: \'lib\', include: \'**/*.jar\')
}
    
        我将尝试着手进行快照构建,但是为了完整起见,这是自昨天以来我如何一起砍弄东西。请随时改善我的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
    }
}
(请注意,所有的罐子都是故意放在耳朵根部的。不要问我为什么,但是有些人显然喜欢这种方式。)     

要回复问题请先登录注册