gradle - как мне создать банку с каталогом lib с другими банками в нем?

В gradle - как я могу встроить jar-файлы в мой выходной jar-файл сборки в каталоге lib (в частности, lib / enttoolkit.jar и lib / mail.jar)?


person phil swenson    schedule 10.08.2010    source источник
comment
stackoverflow.com/ questions / 4871656 /   -  person jcsahnwaldt Reinstate Monica    schedule 23.01.2018


Ответы (10)


Дословно снято с: http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar

Gradle 0.9:

jar {
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

Gradle 0.8:

jar.doFirst {
    for(file in configurations.compile) {
        jar.merge(file)
    }
}

Приведенные выше фрагменты будут включать только зависимости компиляции для этого проекта, а не какие-либо транзитивные зависимости времени выполнения. Если вы также хотите объединить их, замените configurations.compile на configurations.runtime.

РЕДАКТИРОВАТЬ: выбирайте только те банки, которые вам нужны

Сделайте новую конфигурацию, возможно, releaseJars

configurations {
    releaseJars
}

Добавьте нужные банки в эту конфигурацию

dependencies {
    releaseJars group: 'javax.mail', name: 'mail', version: '1.4'
    //etc
}

затем используйте эту конфигурацию в описанной выше задаче jar.

person lucas    schedule 10.08.2010
comment
Я на 0.9rc1. поэтому попробовал ваше первое предложение. Притаскивал всякую ерунду, которую я не хотел ... - person phil swenson; 11.08.2010
comment
ближе я думаю ... проблема в том, что мне нужны банки в каталоге lib. Это вытягивает классы из банок. Мне нужны lib / mail и lib / enttoolkit в выходной банке - person phil swenson; 12.08.2010
comment
это работает ... вроде: sourceSets {main {java {srcDir $ wepTrunk / osgi / mycompany.osgi.server / src} resources {srcDir /Users/phil/dev/trunk/osgi/mycompany.osgi.server/lib} }} он помещает jar-файлы из моего /users/phil/dev/trunk/osgi/mycompany.osgi.server/lib в мой выходной jar, но не в каталог lib. Есть идеи, как получить их в каталоге lib? - person phil swenson; 12.08.2010
comment
Я знаю, что это не ответ на вопрос, но замечательный замечательный совет. Спасибо, Лукас. - person Basil Musa; 06.06.2011
comment
Отличный совет, но полностью упускает из виду довольно конкретный вопрос. - person Sebastian Ganslandt; 12.08.2013
comment
Ссылка недоступна, так как Все услуги Codehaus прекращены - person naXa; 07.10.2016
comment
пожалуйста, обновите ответ, поскольку from требует фигурных скобок: см. stackoverflow.com/a/4894308/907576 - person radistao; 23.10.2016

Если у вас есть все банки внутри каталога (назовем его libs) в вашем проекте, вам понадобится только это:

jar {
    into('lib') {
        from 'libs'
    }
}

Думаю, более вероятно, что эти jar-файлы являются своего рода зависимостями. Тогда вы могли бы сделать это так:

configurations {
    // configuration that holds jars to copy into lib
    extraLibs
}
dependencies {
    extraLibs 'org.something:something-dep1:version'
    extraLibs 'org.something:something-dep2:version'
}

jar {
    into('lib') {
        from configurations.extraLibs
    }
}
person stigkj    schedule 20.02.2012
comment
Если вам нужны все зависимости, вы также можете скопировать из configurations.runtime, что дает вам compile зависимости по умолчанию, избавляя вас от необходимости создавать свою собственную extraLibs конфигурацию. - person Thunderforge; 26.06.2016
comment
Ошибка: не удалось найти метод jar () для аргументов [build_bndovev91pu8trwrdngc8qh7i $ _run_closure5 @ 3be2321e] в проекте ': app' типа org.gradle.api.Project. - person naXa; 07.10.2016
comment
@Thunderforge Чтобы получить все зависимости, мне пришлось копировать из configurations.runtimeClasspath, а не из configurations.runtime, избегая при этом необходимости в определении extraLibs. - person Steve Pitchers; 25.01.2019
comment
Нам просто нужно добавить ресурс после srcDirs processResources{ from(zipTree("src/main/resources/lib/local-jar-name.jar")) } - person Lokesh Singal; 14.04.2020

просто:

task copyToLib( type: Copy ) {
    into "$buildDir/libs/lib"
    from configurations.runtime
}

jar { dependsOn copyToLib }

запустить его:

$ gradle jar
...
$ tree build/libs

build/libs
├── your-project-0.0.1.BUILD-SNAPSHOT.jar
└── lib
    ├── akka-actor-2.0.jar
    ├── akka-camel-2.0.jar
    ├── ... ... ...
    ├── spring-expression-3.1.0.RELEASE.jar
    └── zmq-2.1.9.jar

1 directory, 46 files
person tolitius    schedule 19.03.2012
comment
Это копирует библиотеки в выходной каталог, но не в сам файл JAR, о чем был вопрос. - person TheOperator; 04.05.2016

Мне также нужно было сделать что-то подобное, и я не смог понять то, что предлагали Гус и Стигкдж, но подошел достаточно близко с их помощью, чтобы это работало (пример Гуса взорвался на закрытии dependencies { compile { extendsFrom myLibs }} для меня.

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

configurations {
    // custom config of files we want to include in our fat jar that we send to hadoop
    includeInJar
}

dependencies {
    includeInJar 'org.codehaus.groovy:groovy:1.8.6'

    configurations.compile.extendsFrom(configurations.includeInJar)
}

jar {
    into('lib') {
        println "includeInJar: " + configurations.includeInJar.collect { File file -> file }
        from configurations.includeInJar
    }

}

Затем запуск gradle jar и проверка созданного jar дает мне этот результат, показывающий, что я получил файл jar, чтобы он имел Groovy, а также все jar-файлы, от которых он зависит, внутри "fat jar":

%  gradle jar                                                                                                                         
includeInJar: [/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.codehaus.groovy/groovy/1.8.6/jar/553ca93e0407c94c89b058c482a404427ac7fc72/groovy-1.8.6.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/antlr/antlr/2.7.7/jar/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm/3.2/jar/9bc1511dec6adf302991ced13303e4140fdf9ab7/asm-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-tree/3.2/jar/cd792e29c79d170c5d0bdd05adf5807cf6875c90/asm-tree-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-commons/3.2/jar/e7a19b8c60589499e35f5d2068d09013030b8891/asm-commons-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-util/3.2/jar/37ebfdad34d5f1f45109981465f311bbfbe82dcf/asm-util-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-analysis/3.2/jar/c624956db93975b7197699dcd7de6145ca7cf2c8/asm-analysis-3.2.jar]
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar

BUILD SUCCESSFUL

Total time: 3.387 secs

%  jar tvf build/libs/gradletest.jar                                                                                                  
     0 Mon Mar 12 11:40:00 CDT 2012 META-INF/
    25 Mon Mar 12 11:40:00 CDT 2012 META-INF/MANIFEST.MF
     0 Mon Mar 12 11:40:00 CDT 2012 lib/
5546084 Mon Mar 05 13:13:32 CST 2012 lib/groovy-1.8.6.jar
445288 Mon Mar 05 13:13:38 CST 2012 lib/antlr-2.7.7.jar
 43398 Mon Mar 05 13:13:40 CST 2012 lib/asm-3.2.jar
 21878 Mon Mar 05 13:13:40 CST 2012 lib/asm-tree-3.2.jar
 33094 Mon Mar 05 13:13:40 CST 2012 lib/asm-commons-3.2.jar
 36551 Mon Mar 05 13:13:40 CST 2012 lib/asm-util-3.2.jar
 17985 Mon Mar 05 13:13:40 CST 2012 lib/asm-analysis-3.2.jar
person Ted Naleid    schedule 12.03.2012
comment
Хорошо, я сделал то, что описано здесь, но все еще получаю Exception in thread "main" java.lang.NoClassDefFoundError: com/rabbitmq/client/ConnectionFactory. Должен ли я как-то настроить путь к классам? - person omikron; 04.05.2017

Ниже код можно попробовать. Это зависит от задачи jar и имеет тип Jar

task createJobJar(dependsOn:jar,type:Jar) {
    manifest {
        attributes(
                "Implementation-Title": 'Job '
                ,"Implementation-Version": version
        )
    }
    classifier 'job'
    destinationDir new File("$buildDir")
    into('libs'){
         from configurations.compile
    }
    into('classes'){
        from "$buildDir/classes"
    }
    into('resources'){
        from "$projectDir/src/main/resources"
    }
    into('scripts'){
        from "$projectDir/src/main/scripts"
    }
}

Приведенный выше код будет упаковывать разный контент в разные каталоги. Протестировано на Gradle 2.2

person aloksahoo    schedule 18.12.2014

Мне нужно было то же самое, что вы просили, и я использовал этот метод. вам может не потребоваться объявление пользовательской конфигурации, но мне нужно было отделить локально используемые файлы jar от файлов, объявленных в файле супер-сборки.

configurations{
    //declare custom config if necessary, otherwise just use compile
    myLibs
}
dependencies {
    //add lib/*.jar files to myLibs
    myLibs fileTree(dir: 'lib', include: '*.jar')
    compile {
        //set compile configuration to extend from myLibs
        extendsFrom myLibs
    }
}
// task to copy libs to output/lib dir
task copyToLib(type: Copy) {
    into "$buildDir/output/lib"
    from configurations.myLibs
}

jar {
    //include contents of output dir
    from "$buildDir/output"
    manifest {
        //...
    }
}

//set build task to depend on copyToLib
build.dependsOn(copyToLib)
person Greg Schueler    schedule 24.05.2011

У меня такая же проблема. Я решил это так:

Скопируйте файлы в папку lib с помощью copyToLib и укажите зависимость с помощью Class-Path.

ext.mainClass = 'test.main'

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.google.code.gson:gson:2.8.2'
    //....
}

jar {
    from "$buildDir/libs/lib"
    manifest {
        attributes 'Main-Class': 'test.main',
        'Class-Path': configurations.compile.collect { 'lib/'+it.getName() }.join(' ')
    }
}

task copyToLib(type: Copy) {
    into "$buildDir/libs/lib"
    from configurations.compile
}

build.dependsOn(copyToLib)
person Felipe Martins    schedule 05.03.2019

В моем случае мне нужно было включить содержимое корневого проекта Jar в подпроект Jar. Итак, чтобы он заработал, можно использовать этот шаблон:

jar{
  manifest{
    attributes 'Main-Class':'<main class>'
  }
  def conf= configurations.find {it.name.equals('compile') }
  File jar= conf.files.find {it.name.contains('<name or part of the name of produced Jar>')}

  FileTree fileTree=zipTree(jar)
  from fileTree
}

Мой пример:

jar{
   manifest{
       attributes 'Main-Class':'alexiy.jace.Jace'
   }
   description='Make a runnable API Jar'
   def conf= configurations.find {it.name.equals('compile') }
   File tools= conf.files.find {it.name.contains('Tools')}

   FileTree fileTree=zipTree(tools)
   from fileTree
}
person Alexiy    schedule 12.04.2017

Вот как мне удалось добиться этой настройки сборки с помощью Gradle. Это создаст ваше приложение в Jar, скопирует сгенерированные библиотеки jar-файлов в каталог libs в build / libs, а также настроит путь к классам для включения jar-файлов в созданный каталог build / libs / libs.

 plugins {
    id 'application'
 }

 group 'org.pkg'
 version '1.0-SNAPSHOT'

 ext.mainClass = 'org.pkg.MainClass'

 repositories {
    mavenCentral()
    mavenLocal()
 }

 dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile group: 'junit', name: 'junit', version: '4.12'

    implementation group: 'com.mchange', name: 'c3p0', version: '0.9.5.5'
 }
 
 task copyToLib(type: Copy) {
    into "$buildDir/libs/libs"
    // configurations.runtimeClasspath includes maven jars
    from configurations.runtimeClasspath 
 }

 def archiveVersion = "1.0.0"

 task uberJar(type: Jar) {
    archiveClassifier = 'uber'

    from sourceSets.main.output
    // include the copy task
    dependsOn(copyToLib)

    // use onfigurations.runtimeClasspath to collect all the jars
    manifest {
      attributes(
            'Class-Path': configurations.runtimeClasspath.collect { 'libs/' + it.getName() }.join(' '),
            'Main-Class': 'org.pkg.MainClass',
            "Implementation-Title": "Gradle",
            "Implementation-Version": archiveVersion
      )
    }
 }
person Zuko    schedule 01.07.2020

person    schedule
comment
Небольшое объяснение того, что делает этот код, могло бы помочь объяснить некоторые из конкретных битов? - person Tom; 27.06.2017