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生成一个可部署到生产环境的包