Как включить банки из папки libs в другую банку?

У меня есть проект Gradle JAR (Main). У меня есть другие jar-файлы commons-io (зависимые), которые я хотел бы упаковать с основным JAR-файлом. Я пробовал ниже, но когда я декомпилирую основной JAR, я вижу все зависимые JARS внутри папки libs с расширением .jar.

jar {
    from("$projectDir") {
        include 'libs/**'
    }
}

Я хочу, чтобы файлы классов из всех зависимых JAR-файлов попали в основной JAR-файл. Я делаю это, потому что основной JAR будет использоваться несколькими проектами. Таким образом, мне не нужно включать все зависимые JAR-файлы.

Спасибо


person Arjun Patel    schedule 04.04.2014    source источник


Ответы (2)


Насколько я знаю, вы не можете просто так упаковать другие банки в одну банку. Что вам нужно сделать, так это извлечь все банки и упаковать содержимое в один файл.

Следующий фрагмент кода подготавливает такой jar для объявленных зависимостей

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.guava:guava:16.0.1'
    compile 'com.google.inject:guice:3.0'
}

task fatJar(type: Jar, dependsOn: jar) {
  baseName = project.name + '-fat'
  deps = configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
  from(deps) { 
    exclude 'META-INF/MANIFEST.MF'
  }
}
person Opal    schedule 05.04.2014
comment
Ваше решение именно то, что я сделал. Как я уже упоминал, переупакованный JAR содержит все зависимые JAR в папке «lib». Я не хочу этого, потому что я хочу, чтобы пользователь моего JAR мог использовать классы из зависимых JAR. - person Arjun Patel; 10.04.2014
comment
Хм.. Насколько я вижу, артефакт fat.jar, подготовленный с помощью этого скрипта, даже не имеет папки lib. Он содержит все переупакованные зависимости. - person Opal; 10.04.2014

использовать это.

into(libForderName){
        from {
            configurations.compile.collect {
                it.isDirectory() ? it : it.getAbsoluteFile()
            }
        }
    }
person SJY    schedule 09.06.2017