Gradle在Ear中的JAR上设置清单类路径 设置

Gradle在Ear中的JAR上设置清单类路径 设置,gradle,classpath,ear,Gradle,Classpath,Ear,我正在使用Gradle,并使用JavaEE和IBMWebSphereApplicationServer进行多项目构建。项目目录结构如下所示: --/build.gradle --/defaults.gradle --/settings.gradle --/common-ejb --/common-ejb/build.gradle --/logging --/logging/build.gradle --/project1 --/project1/build.gradle --/project1-

我正在使用Gradle,并使用JavaEE和IBMWebSphereApplicationServer进行多项目构建。项目目录结构如下所示:

--/build.gradle
--/defaults.gradle
--/settings.gradle
--/common-ejb
--/common-ejb/build.gradle
--/logging
--/logging/build.gradle
--/project1
--/project1/build.gradle
--/project1-ejb
--/project1-ejb/build.gradle
--/project2
--/project2/build.gradle
--/project2-ejb
--/project2-ejb/build.gradle
project1和project2是单独部署的EAR。它们都重用来自公共ejb的大量ejb,并共享一些与此问题无关的其他库依赖项

执行build:project1.ear后,如下所示:

--/lib/log4j.jar
--/lib/logging.jar
--/META-INF/application.xml
--/META-INF/MANIFEST.MF
--/common-ejb.jar
--/project1-ejb.jar
Gradle正确地创建application.xml以从两个项目加载EJB。不幸的是,由于对common-ejb.jar的依赖,project1-ejb.jar将无法加载。project1-ejb.jar/META-INF/MANIFEST.MF需要使用common-ejb.jar设置类路径,因为它不在lib/目录中

我可以通过显式地定义它来设置它,如下所示。Gradle知道类路径的依赖关系,因此它应该能够自动完成这项工作。有没有办法设置这个

格雷德尔档案 不包括project2,但您可以猜它是什么样子

-/格雷德尔先生

-/格雷德尔先生

-/格雷德尔酒店

-/logging/build.gradle

-/公共ejb/build.gradle

-/project1 ejb/build.gradle

-/project1/build.gradle


使用来自Gradle论坛的一些信息和修改来自Gradle论坛的代码

本质上,您希望获取EAR的部署依赖项,并查看是否有任何部署依赖项相互依赖。如果有,则将类路径设置为包含引用的JAR

从Project1EJB和Project2EJB中删除清单行。将以下内容添加到defaults.gradle中:

def GetAllDependentProject项目{ if!project.configurations.hasPropertyruntime{ 返回[] } def projectDependencies=project.configurations.runtime.getAllDependencies.withTypeProjectDependency def dependentProjects=projectDependencies*.dependentProjects 如果dependentProjects.size>0{ dependentProjects.each{dependentProjects+=getAllDependentProjectsit} } 返回dependentProjects.unique } gradle.项目评估{ 如果plugins.hasPlugin'ear'{ def deployProjectDependencies=configurations.deploy.getAllDependencies.withTypeProjectDependency*.dependencyProject deployProjectDependencies.each{ def cur=它 def cur_deps=GetAllDependentProjectsUr def depJars=[] deployProjectDependencies.each{ def search=it 如果当前部门包含搜索{ depJars+=search.jar.archiveName } } depJars=depJars.unique 如果depJars.size>0{ 部署依赖项+cur.name+:+depJars的logger.infoMETA-INF依赖项 cur.jar.manifest.attributes “类路径”:depJars.join“” } } } } 这将产生预期的效果。在配置步骤之后和构建之前,EAR项目将直接重新评估它们的依赖关系,以查看是否存在交叉引用。也许有一种更有效的方法,但这可以完成工作。

中也提出了同样的问题
apply from: 'defaults.gradle'
defaultTasks 'clean', 'build'
defaultTasks 'build'
repositories {
    mavenCentral()
}
include 'common-ejb'
include 'project1'
include 'project1-ejb'
include 'logging'
apply from: '../defaults.gradle'

apply plugin: 'java'

dependencies {
    compile 'log4j:log4j:1.2.+'
}
apply from: '../defaults.gradle'

apply plugin: 'java'

dependencies {
    compile 'javax:javaee-api:6.0'

    compile project(':logging')
}
apply from: '../defaults.gradle'

apply plugin: 'java'

dependencies {
    compile 'javax:javaee-api:6.0'

    compile project(':common-ejb')
    compile project(':logging')
}
// THIS IS THE WORKAROUND, I don't want to explicitly modify the Class-Path for each EJB based on the EAR the EJB is going to be included in.
jar {
    manifest {
        attributes("Class-Path": project(':common-ejb').jar.archiveName)
    }
}
apply from: '../defaults.gradle'

apply plugin: 'ear'
apply plugin: 'java'

dependencies {
    deploy project(':project1-ejb')
    deploy project(':common-ejb')

    earlib project(':logging')
}