我正在将遗留项目从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将它部署到服务器(我想这样做是为了使用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?
答案 0 :(得分:0)
我设法完成所有工作。使用问题的编辑部分中的变通办法以及此article的一些要点。这就是我要做的事情:
configurations {
provided
}
sourceSets {
main {
compileClasspath += configurations.provided
compileClasspath += configurations.compile
compileClasspath += configurations.runtime
java {
srcDir 'src/main/application'
}
}
}
这使得我可以在所有项目的依赖项中使用它,并且它不会破坏eclipse项目。