Gradle中获取Gradle依赖项缓存中jar文件路径的最干净方法
我正在使用Gradle帮助自动化Hadoop任务。调用Hadoop时,我需要能够将路径传递给我的代码所依赖的一些JAR,以便Hadoop可以在map/reduce阶段发送依赖关系 我已经想出了一些可行的方法,但感觉很混乱,我想知道是否有一个功能我在某处遗漏了 这是我的gradle脚本的简化版本,它依赖于solr 3.5.0 jar,还有一个Gradle中获取Gradle依赖项缓存中jar文件路径的最干净方法,jar,hadoop,dependencies,gradle,Jar,Hadoop,Dependencies,Gradle,我正在使用Gradle帮助自动化Hadoop任务。调用Hadoop时,我需要能够将路径传递给我的代码所依赖的一些JAR,以便Hadoop可以在map/reduce阶段发送依赖关系 我已经想出了一些可行的方法,但感觉很混乱,我想知道是否有一个功能我在某处遗漏了 这是我的gradle脚本的简化版本,它依赖于solr 3.5.0 jar,还有一个findSolrJar任务,它迭代配置中的所有jar文件以找到正确的jar文件: apply plugin: 'groovy' repositories {
findSolrJar
任务,它迭代配置中的所有jar文件以找到正确的jar文件:
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.solr:solr-solrj:3.5.0'
}
task findSolrJar() {
println project.configurations.compile*.toURI().find { URI uri -> new File(uri).name == 'solr-solrj-3.5.0.jar'}
}
运行此命令可以得到如下输出:
gradle findSolrJar
file:/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.apache.solr/solr-solrj/3.5.0/jar/74cd28347239b64fcfc8c67c540d7a7179c926de/solr-solrj-3.5.0.jar
:findSolrJar UP-TO-DATE
BUILD SUCCESSFUL
Total time: 2.248 secs
val patchModule = listOf(
"--patch-module", "commons.logging=" +
spec2File["org.slf4j:jcl-over-slf4j"].toString(),
"--patch-module", "org.apache.commons.logging=" +
spec2File["org.slf4j:jcl-over-slf4j"].toString()
)
patchModule.forEach({it -> println(it)})
tasks {
withType<JavaCompile> {
doFirst {
options.compilerArgs.addAll(listOf(
"--release", "11",
"--module-path", classpath.asPath
) + patchModule)
// println("Args for for ${name} are ${options.allCompilerArgs}")
}
}
}
有更好的方法吗?您的代码可以简化一点,例如
project.configurations.compile.find{it.name.startsWith(“solr solrj-”)}
您还可以为工件创建一个专用配置,以保持其整洁;如果它可能返回多个位置这一事实对您的用例很有效(如果它在多个位置解析同一个jar,则会发生这种情况),则使用asPath
:
为了避免复制粘贴,如果您还需要compile
配置中的jar,您可以将此专用配置添加到compile
配置中,如下所示:
dependencies {
solr 'org.apache.solr:solr-solrj:3.5.0'
compile configurations.solr.dependencies
}
我是这样做的:
project.buildscript.configurations.classpath.each {
String jarName = it.getName();
print jarName + ":"
}
我需要lombok.jar作为gwt构建的java构建标志,这非常有效
configurations {
lombok
}
dependencies {
lombok 'org.projectlombok:lombok+'
}
ext {
lombok = configurations.lombok.asPath
}
compileGwt {
jvmArgs "-javaagent:${lombok}=ECJ"
}
我感到惊讶的是,该解决方案在配置阶段足够早地发挥作用,但它确实发挥了作用。我最近也遇到了这个问题。如果您正在构建一个java应用程序,当前的问题通常是希望将
group:module
(groupId:artifactId
)映射到jar的路径(即版本不是搜索标准,因为在一个应用程序中,每个特定jar通常只有一个版本)
在我的gradle 5.1.1(基于kotlin)gradle构建中,我通过以下方法解决了这个问题:
var spec2File: Map<String, File> = emptyMap()
configurations.compileClasspath {
val s2f: MutableMap<ResolvedModuleVersion, File> = mutableMapOf()
// https://discuss.gradle.org/t/map-dependency-instances-to-file-s-when-iterating-through-a-configuration/7158
resolvedConfiguration.resolvedArtifacts.forEach({ ra: ResolvedArtifact ->
s2f.put(ra.moduleVersion, ra.file)
})
spec2File = s2f.mapKeys({"${it.key.id.group}:${it.key.id.name}"})
spec2File.keys.sorted().forEach({ it -> println(it.toString() + " -> " + spec2File.get(it))})
}
在此之后,您可以使用此地图
执行一些有用的操作。在我的例子中,我向Java 11构建添加了一些--path module
选项,如下所示:
gradle findSolrJar
file:/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.apache.solr/solr-solrj/3.5.0/jar/74cd28347239b64fcfc8c67c540d7a7179c926de/solr-solrj-3.5.0.jar
:findSolrJar UP-TO-DATE
BUILD SUCCESSFUL
Total time: 2.248 secs
val patchModule = listOf(
"--patch-module", "commons.logging=" +
spec2File["org.slf4j:jcl-over-slf4j"].toString(),
"--patch-module", "org.apache.commons.logging=" +
spec2File["org.slf4j:jcl-over-slf4j"].toString()
)
patchModule.forEach({it -> println(it)})
tasks {
withType<JavaCompile> {
doFirst {
options.compilerArgs.addAll(listOf(
"--release", "11",
"--module-path", classpath.asPath
) + patchModule)
// println("Args for for ${name} are ${options.allCompilerArgs}")
}
}
}
val patchModule=listOf(
--修补程序模块,“commons.logging=”+
spec2File[“org.slf4j:jcl-over-slf4j”].toString(),
“--修补程序模块”,“org.apache.commons.logging=”+
spec2File[“org.slf4j:jcl-over-slf4j”].toString()
)
patchModule.forEach({it->println(it)})
任务{
withType{
首先{
options.compilerArgs.addAll(列表)(
“--释放”、“11”,
“--模块路径”,classpath.asPath
)+配线架(模块)
//println(“用于${name}的参数是${options.allCompilerArgs}”)
}
}
}
顺便说一下,“:”在Windows上不起作用。使用File.pathSeparator
可以解决这个问题。