Ответ 1
Ваш код можно упростить, например project.configurations.compile.find { it.name.startsWith("solr-solrj-") }
.
Я использую Gradle, чтобы помочь автоматизировать задачи Hadoop. При вызове Hadoop мне нужно пройти путь к некоторым банкам, от которых зависит мой код, чтобы Hadoop мог отправлять эту зависимость во время фазы карты/уменьшения.
Я разобрался с чем-то, что работает, но он чувствует себя грязным, и мне интересно, есть ли какая-то функция, которую я где-то не хватает.
Это упрощенная версия моего Gradle script, которая имеет зависимость от jar solr 3.5.0 и задачи findSolrJar
, которая выполняет итерацию через все файлы 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'}
}
running this дает мне вывод следующим образом:
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
Есть ли лучший способ сделать это?
Ваш код можно упростить, например project.configurations.compile.find { it.name.startsWith("solr-solrj-") }
.
Вы также можете создать выделенную конфигурацию для артефакта, чтобы он был чистым; и используйте asPath
, если тот факт, что он потенциально может вернуть несколько мест, хорошо работает для вашего случая использования (происходит, если он разрешает одну и ту же банку в нескольких местах):
configurations {
solr
}
dependencies {
solr 'org.apache.solr:solr-solrj:3.5.0'
}
task findSolrJars() {
println configurations.solr.asPath
}
Чтобы избежать копирования-вставки, если вам нужна эта банка в конфигурации compile
, вы можете добавить эту выделенную конфигурацию в compile
one, например:
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 как флаг сборки java для gwt builds, это сработало отлично!
configurations {
lombok
}
dependencies {
lombok 'org.projectlombok:lombok+'
}
ext {
lombok = configurations.lombok.asPath
}
compileGwt {
jvmArgs "-javaagent:${lombok}=ECJ"
}
Я был удивлен, что резолюция работала достаточно рано в фазе конфигурации, но это происходит.
У меня недавно была и эта проблема. Если вы создаете Java-приложение, проблема обычно заключается в том, что вы хотите получить groupId:artifactId
group:module
(groupId:artifactId
) в путь к jar- groupId:artifactId
(т. groupId:artifactId
Версия не является критерием поиска, поскольку в одном приложении она обычно есть). только одна версия каждой конкретной банки).
В моей сборке Gradle 5.1.1 (на основе kotlin) я решил эту проблему с помощью:
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))})
}
Вывод будет примерно таким:
:jing -> /home/tpasch/scm/db-toolchain/submodules/jing-trang/build/jing.jar
:prince -> /home/tpasch/scm/db-toolchain/lib/prince-java/lib/prince.jar
com.github.jnr:jffi -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jffi/1.2.18/fb54851e631ff91651762587bc3c61a407d328df/jffi-1.2.18-native.jar
com.github.jnr:jnr-constants -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jnr-constants/0.9.12/cb3bcb39040951bc78a540a019573eaedfc8fb81/jnr-constants-0.9.12.jar
com.github.jnr:jnr-enxio -> /home/tpasch/.gradle/caches/modules-2/files-2.1/com.github.jnr/jnr-enxio/0.19/c7664aa74f424748b513619d71141a249fb74e3e/jnr-enxio-0.19.jar
После этого вам остается сделать что-то полезное с этой Map
. В моем случае я добавляю некоторые --path-module
в мою сборку Java 11 следующим образом:
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}")
}
}
}