Gradle生成Eclipse项目EAR项目

时间:2014-11-14 20:21:36

标签: java eclipse gradle ear

我正在将遗留项目从ant迁移到gradle(使用其依赖关系管理和构建功能),并且在生成eclipse项目时遇到问题。今天的一个大问题是因为该项目有一些子项目被分成war和jar包以部署到单个ear。这是由ant今天做出的。 要使用gradle,我会将eclipse项目拆分为单独的jarwar项目。 所以我有以下结构:

ProjectRoot
-lib
-Project1.jar
-Project1.war
-Project2.jar
-Project3.war

这是我的gradle文件

apply plugin: 'ear'
def jboss_home = '/home/augusto/Development/servers/jboss6X' 
def deploy_name = 'default'

allprojects {
    repositories {
        mavenCentral()
    }
    apply plugin: 'eclipse'
    apply plugin: 'eclipse-wtp'
}

dependencies {
    deploy project(path: 'Project1.jar', configuration: 'archives')
    deploy project(path: 'Project1.war', configuration: 'archives')
    deploy project(path: 'Project2.jar', configuration: 'archives')
    deploy project(path: 'Project2.war', configuration: 'archives')
    earlib fileTree(dir: 'lib', include: '*.jar')
}

ear {
    libDirName = "lib"
    deploymentDescriptor {
        applicationName = "MyApp"
        initializeInOrder = true
        displayName = "MyApp"
        module("Project1.jar", "java")
        module("Project2.jar", "java")
        webModule("Project1.war", "/Project1")
        webModule("Project2.war", "/Project2")
    }
}

project('MyJarLib') {
    apply plugin: 'java'
    dependencies {
        compile files('../lib/ajar.jar')
        compile fileTree(dir: jboss_home + '/common/lib', include: '*.jar')
        compile fileTree(dir: jboss_home + '/client', include: '*.jar')
        compile fileTree(dir: jboss_home + '/lib', include: '*.jar')
        compile fileTree(dir: jboss_home + '/server/' + deploy_name + '/lib', include: '*.jar')
    }
}

project('Project1.jar') {
    apply plugin: 'java'
    dependencies {
        compile 'org.apache.poi:poi:3.2-FINAL', 'jdom:jdom:1.1'
        compile project(':MyJarLib.jar')
    }
}

project('Project1.war') {
    apply plugin: 'war'
}

project('Project2.jar') {
    apply plugin: 'java'
    dependencies {
        compile 'net.sf.jasperreports:jasperreports:3.7.0', 'jdom:jdom:1.1'
        compile project(':MyJarLib.jar')
    }
}

project('Project2.war') {
    apply plugin: 'war'
}

我已将ear插件放在子项目中,使用eclipse将其部署到服务器。如果我只是让jar,我不能使用eclipse将它部署到服务器(我想这样做是为了使用jboss 6的热部署功能)。由于ant构建,我们的团队在维护此应用程序方面存在很大的生产力问题。测试功能需要将近15分钟,因为他们无法使用热部署... eclipse的问题:它在部署中不生成单个ear。它单独部署软件包,服务器无法部署。 gradle构建的问题:它正在生成正确的结构,但它在每个jar项目中创建application.xml个文件(因为ear插件)。我只使用根application.xml。你能帮我解决这两个问题吗?感谢。

修改

我已经设法使用评论中的提示使eclipse正确部署我的项目。在所有java项目中,我都使用了这个配置:

apply plugin: 'ear'
ear.onlyIf { false }
ear {
    //appDirName 'src/main/java'
    libDirName '../lib'
}

sourceSets {
    main {
    java {
        srcDir 'src/main/application'
    }
    }
}
eclipse.wtp.facet {
    facet name: 'jst.ejb', version: '3.1'
    facet name: 'java', version: '1.6'
}
eclipse.classpath.file{
    withXml {
    def nodes = it.asNode().children().findAll{it.@kind == 'lib'}
    nodes.each {
        if(it.attributes[0] == null)
            it.appendNode('attributes').appendNode('attribute', [name:'org.eclipse.jst.component.dependency', value: '../lib'])
        else
            it.attributes[0].attribute[0].@value = '../lib'
    }
    }
}

我已经把耳塞,所以gradle生成了准备在eclipse中部署的项目。 ear.onlyIf { false }使得gradle不会在耳结构中生成工件。在此之后,我更改了eclipse首选项,将项目的方面设置为EJB,并更改了类路径条目,以将依赖项部署到ear lib目录而不是ear的根目录。我现在的问题是从gradle构建。当我调用gradle ear时,由于Web容器库不在类路径中,因此产生了大量的依赖性错误...所以我有很多类别的异常。如果我将所有类作为我的项目的依赖项,它将与eclipse类路径(和部署)混乱。问题是:有没有办法在gradle中为java项目提供一个提供的依赖项,是否有一种简单的方法可以从jboss而不是每个jars提供所有这些jar?

1 个答案:

答案 0 :(得分:0)

我设法完成所有工作。使用问题的编辑部分中的变通办法以及此article的一些要点。这就是我要做的事情:

configurations {
    provided
}

sourceSets {
    main {
    compileClasspath += configurations.provided
    compileClasspath += configurations.compile
    compileClasspath += configurations.runtime
    java {
        srcDir 'src/main/application'
    }
    }
}

这使得我可以在所有项目的依赖项中使用它,并且它不会破坏eclipse项目。