Gradle构建脚本创建一个带有一些罐子和一个内部战争的EAR文件。这一切都是在Maven之前完成的,现在是迁移到Gradle的主题。
...很简单:它到目前为止工作 - 耳塞创建了包含
所有模块文件的ear文件deploy project(:core)
在“dependencies”部分中,“core-0.0.1.jar”位于ear-root,并且已在application.xml中创建了一个模块条目。 现在我发现运行时库不包含在ear文件中。所以我改变了(根据文件记录)包含到
earlib project(:core)
并在ears目录中找到libs目录中的lib,如ear plugin配置中的“libDirName”属性所述。 但是现在application.xml中没有模块条目,“core-0.0.1.jar”在libs目录中。
我们希望core-0.0.1.jar作为ear根目录中的模块和libs目录中的所有运行时库 - 没有来自模块本身的jar! (core-0.0.1.jar不是战争!)就像这样......
[APP.EAR]
|--/libs
| |-- log4j.jar
| |-- commons.jar
| |>> app-core.0.0.1.jar <<== NOT !
|
|-app-core-0.0.1.jar <== OK!
|-app-xy-0.0.1.jar
|-app-abc-0.0.1.war
这是对我的EAR概念的基本缺乏理解,还是为什么Gradle本身不按照我们想要的方式行事? 或者这个简单的步骤可能需要更复杂的配置吗?
答案 0 :(得分:8)
我在尝试了许多其他帖子的“解决方案”后,自己找到了解决方案。 这就是我所做的,它是其他人的组合:
我创建了一个提供的配置 - 因此这些依赖项不会出现在编译配置中 - 并将其添加到项目的类路径中。所以它们在编译类路径中,但不在编译配置中!我为我的所有项目都这样做了。
// Libs need for compilation, but not to be published with EAR
configurations { provided }
dependencies {
provided 'javax:javaee-api:6.0'
provided 'org.slf4j:slf4j-api:1.7.7'
compile 'com.application:application-common:1.4.5-SNAPSHOT'
}
configurations.provided.each { logger.debug("PROVIDED::core: $it\n") }
// Include the PROVIDED libs into compile classpath
sourceSets {
main { compileClasspath += configurations.provided }
}
我必须为模块条目和根jar包含“deploy project ..”。 对于传递的lib,我使用了“earlib项目......,配置:'compile'”来确保只有编译配置中的文件(因此它们是运行jar的必需文件)被复制到耳中。
apply plugin: 'ear'
dependencies {
// INCLUDE AS A MODULE with entry in application.xml
deploy project(path: ':core')
// INCLUDE the TRANSITIVE LIBRARIES FOR RUNTIME not provided
earlib project(path: ':core', configuration: 'compile')
}
ear { ....
}
多数民众赞成!
为此我不得不说...... GRADLE ROCKS !!!!
答案 1 :(得分:2)
如果ear模块之间存在编译时依赖关系,则接受的解决方案将失败。这就是我在Gradle 2.14中解决它的方法。希望这有助于某人。
apply plugin: 'ear'
def deployedModules = [ 'projectA', 'projectB', 'projectC' ]
deployedModules.forEach {
def projectPath = ":${it}"
evaluationDependsOn(projectPath)
dependencies.add('deploy', dependencies.project(path: projectPath,
configuration: 'archives'))
findProject(projectPath).configurations.runtime.allDependencies.forEach {
boolean isEarModule = it instanceof ProjectDependency &&
(it as ProjectDependency).dependencyProject.name in deployedModules
if (!isEarModule) {
dependencies.add('earlib', it)
}
}
}