Как упаковать библиотечные банки, кроме модуля jar в gradle?

#gradle

Вопрос:

Как попросить gradle упаковать только банки зависимостей в zip-файл без банки модулей, содержащей классы модулей?

Я использую DSL Kotlin Gradle, но также приветствуются отличные решения. Я сам могу перевести их на Котлин.

Ответ №1:

Вы можете настроить Zip задачу следующим образом:

 tasks.register('packageDeps', Zip) {
    from configurations.runtimeClasspath
}
 

Это зависит от того, какой у вас проект, из какой конфигурации вам нужно скопировать. В примере это проект Java, и мы копируем зависимости из пути к классу среды выполнения (т. е. runtimeClasspath Конфигурации). Вы можете запустить ./gradlew dependencies , чтобы узнать, какие конфигурации существуют в вашем проекте; вы можете использовать только те конфигурации, которые должны быть разрешены, т. е. те, в описании которых их нет (n) .

Примерный Проект

Вот автономный проект, с которым я это протестировал (не показаны файлы обертки Gradle 7.2):

 ├── build.gradle
├── settings.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── MyClass.java
 

При запуске ./gradlew packageDeps этого проекта создается ZIP-файл, build/distributions/my-deps.zip который содержит только файлы зависимостей (вкл. переходные), а не MyClass.class файл или соответствующий JAR.

build.gradle

 plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.guava:guava:28.2-jre'
}

tasks.register('packageDeps', Zip) {
    from configurations.runtimeClasspath
    archiveFileName = 'my-deps.zip'
}
 

settings.gradle

(пусто)

src/main/java/com/example/MyClass.java

 package com.example;

public class MyClass {

    public static void main(String... args) {
        System.out.println("Hello world!");
    }
}