【问题标题】:Gradle include transitive dependencies in directoryGradle 在目录中包含传递依赖项
【发布时间】:2020-02-12 05:35:16
【问题描述】:

我有一个 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>

我还有另一个项目,它在编译时依赖于这个先前构建的 jar:

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

我想创建一个任务来构建第二个项目并创建一个包含com.my.project:my-library:1.0.0 jar 及其传递依赖项(jar-1jar-2jar-3)的 zip 文件。

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 清单属性。

【问题讨论】:

    标签: java gradle jar dependencies transitive-dependency


    【解决方案1】:

    这是一个独立的 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 测试)。它在build/distributions/&lt;your_project_name&gt;.zip 下生成ZIP 文件。如果您的伪代码就是这样,请告诉我。

    【讨论】:

      【解决方案2】:
      task uberJar(type: Jar) {
         dependsOn classes
         from sourceSets.main.runtimeClasspath.collect { it.directory?fileTree(it):zipTree(it)}
         classifier = 'uber-jar'
      } 
      assemble.dependsOn uberJar
      

      【讨论】:

      • 我在sourceSets.main.runtimeClasspath 中找不到那些传递依赖。然而,它们存在于sourceSets.main.compileClasspath。是否有可能以编程方式获取一个依赖项的传递依赖项列表?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      相关资源
      最近更新 更多