Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle生成Eclipse项目EAR项目_Java_Eclipse_Gradle_Ear - Fatal编程技术网

Java Gradle生成Eclipse项目EAR项目

Java Gradle生成Eclipse项目EAR项目,java,eclipse,gradle,ear,Java,Eclipse,Gradle,Ear,我正在将一个遗留项目从ant迁移到gradle(以使用其依赖项管理和构建功能),并且在生成eclipse项目时遇到了一个问题。今天的大问题是,该项目有一些分为war和jar包的子项目要部署到单个ear中。这是由ant今天制作的。 为了使用gradle我将eclipse项目分为单独的jar和war项目。 因此,我有以下结构: ProjectRoot -lib -Project1.jar -Project1.war -Project2.jar -Project3.war 这是我的gradle文件:

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

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将其部署到服务器上(我想这样做是为了使用JBoss6的热部署特性)。由于
ant
构建,我们的团队在维护此应用程序时存在很大的生产力问题。测试一个功能几乎需要15分钟,因为他们无法使用热部署。。。
eclipse的问题在于:它在部署中没有生成单个
ear
。它单独部署包,服务器无法部署。
gradle
build的问题是:它正在生成正确的结构,但它正在每个jar项目中创建
application.xml
文件(因为ear插件)。我只使用根
应用程序.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'
    }
    }
}

我已经放置了ear插件,所以gradle生成了准备在eclipse中部署的项目。
ear.onlyIf{false}
使gradle不会在ear结构中生成工件。在此之后,我更改了eclipse首选项,将项目的方面设置为EJB,并更改了类路径条目,以将依赖项部署在ear lib目录中,而不是ear的根目录中。我现在的问题是gradle的构建。当我调用
gradleear
时,由于web容器库不在类路径中,它正在生成大量依赖项错误。。。所以我有很多classnotfound异常。如果我将项目中的所有类都作为依赖项放置,则会弄乱eclipse类路径(和部署)。问题是:有没有一种方法可以为gradle中的java项目提供依赖关系?有没有一种简单的方法可以从jboss提供所有这些JAR,而不是每个JAR?

我已经设法让所有JAR都能正常工作。使用问题编辑部分中的变通方法以及其中的一些要点。我要做的是:

configurations {
    provided
}

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

这使得我可以使用我所有项目的依赖项中提供的插件,并且它不会干扰eclipse项目。

您应该只将
ear
插件应用于生成ear的项目,而不应用于生成WAR/JAR的项目。这可以是它自己的子项目或根项目。在任何情况下,您都需要将
eclipse
eclipsewtp
插件应用于
allprojects{…}
。好的。但我如何使用生成的项目通过eclipse部署到服务器?我不确定其中有多少是自动设置的,以及您需要自己设置多少(手动或通过自定义项目生成)。我希望团队从subversion获得项目,称为gradle eclipse,将该项目添加到eclipse上的jboss,并点击runAnd gradle build生成一个可部署到生产环境的包