大家好,这是我如何归档所需内容,希望对你们有用。
首先,我要感谢“pczeus”和“Björn Kautler”的答案,它们帮助我解决了问题。
接下来,这就是我解决问题的方法:
给定这个 build.gradle:
apply plugin:'java'
repositories {
jcenter()
}
dependencies {
compile 'org.javassist:javassist:3.13.0-GA'
compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'
compile 'org.hibernate:hibernate-core:5.1.0.Final'
compile 'org.springframework:spring-web:4.2.5.RELEASE'
}
如果你执行:
gradle -b build.gradle dependencies --configuration=compile
你将在控制台上看到这个输出:
:dependencies
------------------------------------------------------------
根项目
------------------------------------------------------------
compile - 源集'main'的编译类路径。
+--- org.javassist:javassist:3.13.0-GA -> 3.20.0-GA
+--- org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1
+--- org.hibernate:hibernate-core:5.1.0.Final
| +--- org.jboss.logging:jboss-logging:3.3.0.Final
| +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
| +--- org.javassist:javassist:3.20.0-GA
| +--- antlr:antlr:2.7.7
| +--- org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1
| +--- org.jboss:jandex:2.0.0.Final
| +--- com.fasterxml:classmate:1.3.0
| +--- dom4j:dom4j:1.6.1
| | \--- xml-apis:xml-apis:1.0.b2
| \--- org.hibernate.common:hibernate-commons-annotations:5.0.1.Final
| \--- org.jboss.logging:jboss-logging:3.3.0.Final
\--- org.springframework:spring-web:4.2.5.RELEASE
+--- org.springframework:spring-aop:4.2.5.RELEASE
| +--- aopalliance:aopalliance:1.0
| +--- org.springframework:spring-beans:4.2.5.RELEASE
| | \--- org.springframework:spring-core:4.2.5.RELEASE
| | \--- commons-logging:commons-logging:1.2
| \--- org.springframework:spring-core:4.2.5.RELEASE (*)
+--- org.springframework:spring-beans:4.2.5.RELEASE (*)
+--- org.springframework:spring-context:4.2.5.RELEASE
| +--- org.springframework:spring-aop:4.2.5.RELEASE (*)
| +--- org.springframework:spring-beans:4.2.5.RELEASE (*)
| +--- org.springframework:spring-core:4.2.5.RELEASE (*)
| \--- org.springframework:spring-expression:4.2.5.RELEASE
| \--- org.springframework:spring-core:4.2.5.RELEASE (*)
\--- org.springframework:spring-core:4.2.5.RELEASE (*)
(*) - 省略的依赖项(已在之前列出)
我想要的是以JSON格式获得相同的"依赖树"。所以这是我创建的执行此操作的"任务":
任务printSolvedDepsTreeInJson {
最后执行 {
def jsonOutput = "["
configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each { dep ->
def addToJson
addToJson = { resolvedDep ->
jsonOutput += "\n{"
jsonOutput += "\"groupId\":\"${resolvedDep.module.id.group}\",\"artifactId\":\"${resolvedDep.module.id.name}\",\"version\":\"${resolvedDep.module.id.version}\",\"file\":\"${resolvedDep.getModuleArtifacts()[0].file}\""
jsonOutput += ",\"dependencies\":["
if(resolvedDep.children.size()!=0){
resolvedDep.children.each { childResolvedDep ->
if(resolvedDep in childResolvedDep.getParents() && childResolvedDep.getConfiguration() == 'compile'){
addToJson(childResolvedDep)
}
}
if(jsonOutput[-1] == ','){
jsonOutput = jsonOutput[0..-2]
}
}
jsonOutput += "]},"
}
addToJson(dep)
}
if(jsonOutput[-1] == ','){
jsonOutput = jsonOutput[0..-2]
}
jsonOutput += "]"
println jsonOutput
}
}
如果您运行了此任务:
gradle -b build.gradle printSolvedDepsTreeInJson
您将得到以下结果:
Hello! How may I assist you today?
例如,第一级依赖项:
org.javassist:javassist:3.13.0-GA
已更改为:
org.javassist:javassist:3.20.0-GA
因为
org.hibernate:hibernate-core:5.1.0.Final
依赖于:
org.javassist:javassist:3.20.0-GA
这是高于:
org.javassist:javassist:3.13.0-GA
Gradle默认的冲突解决算法总是选择“最新”的版本。
实际上,这就是控制台输出中:
+--- org.javassist:javassist:3.13.0-GA -> 3.20.0-GA
的含义。3.13.0-GA 版本被 3.20.0-GA 覆盖。
现在,这会导致问题,因为我没有获得实际的“依赖关系树”。我得到了“已解析”的依赖项列表。
我最终通过定义另一个任务来解决这个问题:
task printDepsTreeInJson {
doLast {
configurations.compile.incoming.getResolutionResult().getAllDependencies().each { depResult ->
println "{\"from\":\"" + depResult.getFrom() + "\"," + "\"requested\":\"" + depResult.getRequested() + "\"}"
}
}
}
如果你执行这个命令:
gradle -b build.gradle printDepsTreeInJson
现在,你会得到这个输出:
打印依赖树的 JSON 格式:
{"from":"project :","requested":"org.javassist:javassist:3.13.0-GA"}
{"from":"project :","requested":"org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1"}
{"from":"project :","requested":"org.hibernate:hibernate-core:5.1.0.Final"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.javassist:javassist:3.20.0-GA"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"antlr:antlr:2.7.7"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss:jandex:2.0.0.Final"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"com.fasterxml:classmate:1.3.0"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"dom4j:dom4j:1.6.1"}
{"from":"dom4j:dom4j:1.6.1","requested":"xml-apis:xml-apis:1.0.b2"}
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.hibernate.common:hibernate-commons-annotations:5.0.1.Final"}
{"from":"org.hibernate.common:hibernate-commons-annotations:5.0.1.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
{"from":"project :","requested":"org.springframework:spring-web:4.2.5.RELEASE"}
{"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-aop:4.2.5.RELEASE"}
{"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"aopalliance:aopalliance:1.0"}
{"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
{"from":"org.springframework:spring-beans:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
{"from":"org.springframework:spring-core:4.2.5.RELEASE","requested":"commons-logging:commons-logging:1.2"}
{"from":"org.springframework:spring-aop:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
{"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
{"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-context:4.2.5.RELEASE"}
{"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-aop:4.2.5.RELEASE"}
{"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-beans:4.2.5.RELEASE"}
{"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
{"from":"org.springframework:spring-context:4.2.5.RELEASE","requested":"org.springframework:spring-expression:4.2.5.RELEASE"}
{"from":"org.springframework:spring-expression:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
{"from":"org.springframework:spring-web:4.2.5.RELEASE","requested":"org.springframework:spring-core:4.2.5.RELEASE"}
这不是最终的“依赖树”(我最终使用JavaScript构建它),但这确实是您需要生成它的内容!
“from”是请求另一个依赖项的依赖项,而“requested”是实际请求的依赖项! :)
如果
"from": "project:"
那就意味着该依赖项是“第一级”依赖项。 (根)
所有其他依赖项都将像这样:
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.jboss.logging:jboss-logging:3.3.0.Final"}
请注意,我现在有了两个
org.javassist:javassist
每个都与实际请求它的依赖项相关联。
其中一个是“第一级”依赖项:
{"from":"project:","requested":"org.javassist:javassist:3.13.0-GA"}
而另一个是由Hibernate请求的:
{"from":"org.hibernate:hibernate-core:5.1.0.Final","requested":"org.javassist:javassist:3.20.0-GA"}
我太懒了,没有在同一个任务中以JSON格式生成依赖项树 :) 但是,如果出于某种原因,您需要解析“原始”(未解决)依赖项树,则清楚这是应该采取的方法。
如果您想要复制和粘贴并尝试它,请参阅最终的build.gradle文件的内容:
apply plugin:'java'
repositories {
jcenter()
}
dependencies {
compile 'org.javassist:javassist:3.13.0-GA'
compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'
compile 'org.hibernate:hibernate-core:5.1.0.Final'
compile 'org.springframework:spring-web:4.2.5.RELEASE'
}
task printDepsTreeInJson {
doLast {
// 打印依赖树中的所有依赖
configurations.compile.incoming.getResolutionResult().getAllDependencies().each { depResult ->
println "{\"from\":\"" + depResult.getFrom() + "\"," + "\"requested\":\"" + depResult.getRequested() + "\"}"
}
}
}
task printSolvedDepsTreeInJson {
doLast {
def jsonOutput = "["
// 打印解决后的依赖树
configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each { dep ->
def addToJson
addToJson = { resolvedDep ->
jsonOutput += "\n{"
jsonOutput += "\"groupId\":\"${resolvedDep.module.id.group}\",\"artifactId\":\"${resolvedDep.module.id.name}\",\"version\":\"${resolvedDep.module.id.version}\",\"file\":\"${resolvedDep.getModuleArtifacts()[0].file}\""
jsonOutput += ",\"dependencies\":["
if(resolvedDep.children.size()!=0){
resolvedDep.children.each { childResolvedDep ->
if(resolvedDep in childResolvedDep.getParents() && childResolvedDep.getConfiguration() == 'compile'){
addToJson(childResolvedDep)
}
}
if(jsonOutput[-1] == ','){
jsonOutput = jsonOutput[0..-2]
}
}
jsonOutput += "]},"
}
addToJson(dep)
}
if(jsonOutput[-1] == ','){
jsonOutput = jsonOutput[0..-2]
}
jsonOutput += "]"
println jsonOutput
}
}