我有一个巨大的传统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(显然)时并不是很聪明。任何帮助将不胜感激。
答案 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