Gradle включает транзитивные зависимости в каталоге - PullRequest
3 голосов
/ 15 октября 2019

У меня есть проект Java, у которого есть пара зависимостей, например:

dependencies {
    compile("com.whatever.jar:jar-1:1.2.3")
    compile("com.whatever.jar:jar-2:4.5.6")
    compile("com.whatever.jar:jar-3:7.8.9")
} 

Я упаковываю его как библиотеку jar и публикую его в хранилище вместе с файлом POM, который описывает эти зависимости:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.my.project</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.whatever.jar</groupId>
            <artifactId>jar-1</artifactId>
            <version>1.2.3</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.whatever.jar</groupId>
            <artifactId>jar-2</artifactId>
            <version>4.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.whatever.jar</groupId>
            <artifactId>jar-3</artifactId>
            <version>7.8.9</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

У меня также есть еще один проект, который зависит от этого ранее построенного фляги во время компиляции:

dependencies {
    compileOnly("com.my.project:my-library:1.0.0")
}

Я хотел бы создать задачу, которая собирает второйпроект и создает zip-файл, содержащий как com.my.project:my-library:1.0.0 jar, так и его транзитивные зависимости (jar-1, jar-2 и jar-3).

task createZip << {
    into('lib') {
        // here I would like to do something like (it's a horrible pseudo-code):
        from configurations.(com.my.project:my-library:1.0.0).jar.transitiveDependencies.files
    }
}

Как мне этого добиться?

Редактировать: Я также хотел бы получить программный доступ к списку транзитивных зависимостей my-library (и именно к ним, а не к каким-либо другим зависимостям в проекте), чтобы создать атрибут манифеста Loader-Path с их использованием.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вот автономный скрипт build.gradle, который демонстрирует, как может быть создана ваша задача createZip (которая добавляет только определенные зависимости в ZIP-архив):

/* make the "compileOnly" configuration available */
plugins {
    id 'java'
}

/* add some demo dependencies to the project */
repositories {
    jcenter()
}
dependencies {
    compileOnly 'junit:junit:4.12'
    compileOnly 'org.slf4j:slf4j-simple:1.7.28'
}

task createZip(type: Zip) {
    // the "lib" directory in the ZIP file will only have all those dependency
    // files of the "compileOnly" configuration which belong to the
    // "junit:junit:4.12" module:
    def depOfInterest = dependencies.create('junit:junit:4.12')
    into('lib') {
        from configurations.compileOnly.resolvedConfiguration.getFiles({dep ->
            dep == depOfInterest
        })
    }

    // the "justForDemonstration" directory in the ZIP file will have all
    // dependency files of the "compileOnly" configuration, incl. SLF4J:
    into('justForDemonstration') {
        from configurations.compileOnly
    }
}

Это можно запустить с помощью ./gradlew createZip (протестировано с Gradle 5.6.2). Создает ZIP-файл под build/distributions/<your_project_name>.zip. Дайте мне знать, если это то, что вы имели в виду со своим псевдокодом.

1 голос
/ 17 октября 2019
task uberJar(type: Jar) {
   dependsOn classes
   from sourceSets.main.runtimeClasspath.collect { it.directory?fileTree(it):zipTree(it)}
   classifier = 'uber-jar'
} 
assemble.dependsOn uberJar
...