从单个项目或源生成不同的gradle工件

时间:2016-03-15 22:21:05

标签: java gradle

我有一个巨大的传统EAR项目。当前的构建过程使用Ant,我正在尝试转换为gradle。

旧的Ant构建使用单个源文件夹,一切都在那里(EJB和WAR代码一起);然后Ant使用不同的任务来构建EJB-JAR和WAR工件,这些工件按照感兴趣的包进行过滤(WAR的my.web.* 和EJB的my.ejb.*

不言而喻,EJB和WAR相互引用很多,我猜这就是为什么即使生成单独的工件也会将它们编译在一起。

我尝试创建一个父EAR项目,然后将一个EJB子项目中的my.ejb.* 与WAR子项目中的my.web.* 分开,但gradle立即抱怨循环依赖项,我还没有找到方法周围。

如果无法实现上述目标,那么我正在寻找有关如何在完全编译的相同代码库中生成EJB-JAR和WAR工件的建议,然后将它们作为“部署”依赖项包含在EAR文件中。 / p>

我已经用Google搜索了,但我在gradle(显然)时并不是很聪明。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为你正陷入我们许多人第一次尝试将现有的蚂蚁项目转换为Gradle时所遇到的陷阱 - 你正在考虑同样的事情。

相反,让Gradle为您完成工作,它将更容易,并且生成的build.gradle文件更小,更简洁。

关于拥有父母项目和单独的战争项目的思考是好的思考。但是,您应该利用Gradle提供的插件来简化构建档案的任务。

使用'耳塞': https://docs.gradle.org/current/userguide/war_plugin.html

例如:

    apply plugin: 'ear'
    apply plugin: 'java'

    repositories { mavenCentral() }

    dependencies {
        // The following dependencies will be the ear modules and
        // will be placed in the ear root
        deploy project(':war')

        // The following dependencies will become ear libs and will
        // be placed in a dir configured via the libDirName property
        earlib group: 'log4j', name: 'log4j', version: '1.2.15', ext: 'jar'
    }

    ear {
        appDirName 'src/main/app'  // use application metadata found in this folder
        // put dependent libraries into APP-INF/lib inside the generated EAR
        libDirName 'APP-INF/lib'
        deploymentDescriptor {  // custom entries for application.xml:
    //      fileName = "application.xml"  // same as the default value
    //      version = "6"  // same as the default value
            applicationName = "customear"
            initializeInOrder = true
            displayName = "Custom Ear"  // defaults to project.name
            // defaults to project.description if not set
            description = "My customized EAR for the Gradle documentation"
    //      libraryDirectory = "APP-INF/lib"  // not needed, above libDirName setting does this
    //      module("my.jar", "java")  // won't deploy as my.jar isn't deploy dependency
    //      webModule("my.war", "/")  // won't deploy as my.war isn't deploy dependency
            securityRole "admin"
            securityRole "superadmin"
            withXml { provider -> // add a custom node to the XML
                provider.asNode().appendNode("data-source", "my/data/source")
            }
        }
    }

然后为你的战争,使用'战争插件'。您可以将战争创建为单独的项目:

    configurations {
       moreLibs
    }

    repositories {
       flatDir { dirs "lib" }
       mavenCentral()
    }

    dependencies {
        compile module(":compile:1.0") {
            dependency ":compile-transitive-1.0@jar"
            dependency ":providedCompile-transitive:1.0@jar"
        }
        providedCompile "javax.servlet:servlet-api:2.5"
        providedCompile module(":providedCompile:1.0") {
            dependency ":providedCompile-transitive:1.0@jar"
        }
        runtime ":runtime:1.0"
        providedRuntime ":providedRuntime:1.0@jar"
        testCompile "junit:junit:4.12"
        moreLibs ":otherLib:1.0"
    }

    war {
        from 'src/rootContent' // adds a file-set to the root of the archive
        webInf { from 'src/additionalWebInf' } // adds a file-set to the WEB-INF dir.
        classpath fileTree('additionalLibs') // adds a file-set to the WEB-INF/lib dir.
        classpath configurations.moreLibs // adds a configuration to the WEB-INF/lib dir.
        webXml = file('src/someWeb.xml') // copies a file to WEB-INF/web.xml
    }  

关于将它们创建为单个项目还有另一个有用的帖子,但这肯定有点'冒险': https://discuss.gradle.org/t/single-project-with-jar-ejb-war-and-ear/5874