2010-08-10 2 views

ответ

34

Отменен дословно: 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.

EDIT: только выбрать банки вам нужно

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

configurations { 
    releaseJars 
} 

Добавить банки, которые вы хотите к конфигурации

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

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

+1

Я на 0.9rc1. поэтому попробовал свое первое предложение. Вытащил всевозможные вещи, которых я не хотел ..... –

+0

ближе Я думаю ... проблема в том, что мне нужны банки в каталоге lib. Это тянет классы из банок. Я хочу Lib/почту и Библиотека/enttoolkit в выходной банке –

+0

это работает ... вроде: sourceSets { главный { ява { SRCDIR "$ wepTrunk/OSGi/mycompany.osgi.server/ЦСИ" } ресурсов { SRCDIR "/Users/phil/dev/trunk/osgi/mycompany.osgi.server/lib" }} } это ставит банки из моего/пользователей// DEV Фила/соединительном/OSGi /mycompany.osgi.server/lib в моей выходной баночке, но не в каталоге «lib». Любые идеи, как их получить в каталоге lib? –

6

Мне нужно было то же самое, что вы просили, и использовали этот метод. вам может не понадобиться специальное объявление конфигурации, но мне нужно было отделить локально используемые файлы 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) 
28

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

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

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

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 
    } 
} 
+1

Если вы хотите все зависимости вы также можете скопировать из 'configurations.runtime', который дает вам зависимости' compile', что избавляет вас от необходимости создавать собственную конфигурацию 'extraLibs'. – Thunderforge

+0

Ошибка: Не удалось найти метод jar() для аргументов [build_bndovev91pu8trwrdngc8qh7i $ _run_closure5 @ 3be2321e] в проекте ': app' типа org.gradle.api.Project. – naXa

7

мне нужно сделать что-то подобное и не вполне в состоянии получить то, что предложили работать Гус и stigkj, но получили достаточно близко, чтобы с их помощью получить эту работу (Гус "пример взорвал на 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 файл, чтобы иметь заводные, а также все банки, что это зависит от внутри «жировой банки»:

% 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 
+0

Хорошо, я сделал то, что описано здесь, но я все еще получаю «Исключение в потоке» main «java.lang.NoClassDefFoundError: com/rabbitmq/client/ConnectionFactory'. Должен ли я каким-то образом настроить classpath? – omikron

17

прост:

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 
+6

Это копирует библиотеки в выходной каталог, но не в файл JAR - это был вопрос. – TheOperator

6

Ниже кода может быть судим.Это зависит от поставленной задачи банку и Типа 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" 
    } 
} 

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

+0

Работает отлично – nikhil

0

В моем случае мне нужно было включить содержимое корневого проекта 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 
} 
-1
task <taskname>(type: Jar) { 
    archiveName 'nameofjar.jar' 
    doFirst { 
    manifest { 
      attributes 'Class-Path': configurations.compile.files.collect{ project.uri(it) }.join(' ') 
     } 
    } 
} 
+1

Немного о том, что этот код может помочь объяснить некоторые из конкретных бит? – Tom

Смежные вопросы