Gradle fatjar из каталога

У меня есть папка ("$buildDir/some/lib"), в которой много jar-файлов. Я хочу создать банку, в которой есть все эти банки, но они разархивированы. Я перепробовал множество вещей, но все они потерпели неудачу, включая следующую:

task fatJar(type: Jar, dependsOn: 'someTask') {
    manifest {
        attributes 'Main-Class': 'some.Main'
    }
    baseName = project.name + '-all'
    from ("$buildDir/some/lib") {
        eachFile { it.isDirectory() ? it : zipTree(it)  } }

    with jar
}

В этом случае ошибка:

Не удается преобразовать предоставленную запись в файл или URI: файл '/path/to/the/buidDir/above/someJar.jar'.

Любая помощь?

РЕДАКТИРОВАТЬ: Я изменил это на это, но он все еще не работает.. банки копируются, но они не распакованы... помогите! Почему это так сложно?

task fatJar(....) {
    manifest {
        .....
    }
    baseName = project.name + '-all'
    FileCollection collection = files("$buildDir/some/lib")
    from collection.collect { it.isDirectory() ? it : zipTree(it) }

    with jar
}

1 ответ

Вы можете сделать следующее:

task fatJar(type: Jar) {
    manifest {
        attributes 'Main-Class': 'some.Main'
    }
    baseName = project.name + '-all'
    project.fileTree("$buildDir/some/lib").forEach { jarFile ->
        from zipTree(jarFile )
    }
    with jar
}

Заметка

В первом решении вы получите сообщение об ошибке "Не удалось преобразовать предоставленную запись в файл или URI...", потому что в eachFile закрытие (см. CopySpec.eachFile(), которым вы манипулируете FileCopyDetails объекты, в то время как zipTree Метод ожидает Zip Path. Одним из решений будет использование getPath() метод: eachFile { it.isDirectory() ? it : zipTree(it.getPath()) } }

Другие вопросы по тегам