2011-02-02 15 views
88

Mam kompilację wielu rzutowań i umieszczam zadanie do zbudowania słoika w jednym z podprojektów. Stworzyłem zadanie podobne do zadania described in the cookbook.Używanie programu Gradle do budowania słoika z zależnościami

jar { 
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
    manifest { attributes 'Main-Class': 'com.benmccann.gradle.test.WebServer' } 
} 

Running to wyniki w następujący błąd:

Cause: You can't change a configuration which is not in unresolved state!

Nie jestem pewien, co oznacza ten błąd. I also reported this on the Gradle JIRA in case it is a bug.

Odpowiedz

133

Zamieściłem a solution w JIRA przed Gradle:

// Include dependent libraries in archive. 
mainClassName = "com.company.application.Main" 

jar { 
    manifest { 
    attributes "Main-Class": "$mainClassName" 
    } 

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

musiałem zmodyfikować to configurations.runtime.collect dla mojego projektu, jak mam zależności wykonawcze, jak również. – vextorspace

+0

Musiałem dodać 'def mainClassName', aby kod działał ... Otrzymałem Nie można ustawić nieznanej właściwości" mainClassName "dla projektu głównego – hanskoff

+1

Jak radzić sobie z kolizjami nazw plików? Pliki znajdujące się na tej samej ścieżce w różnych plikach JAR zostaną nadpisane. – waste

52

Jeśli chcesz zadanie jar zachowywać się normalnie i additinal fatJar zadanie, należy użyć następujących:

task fatJar(type: Jar) { 
    baseName = project.name + '-all' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 

Ważną częścią jest with jar . Bez tego klasy tego projektu nie są uwzględnione.

+1

Zobacz także następujący problem, jeśli używasz podpisanych słoików do uwzględnienia i napotkasz problem z podpisami: http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-runa-a- jar –

+0

To działa dobrze, z tym wyjątkiem, że jeśli spróbuję zmodyfikować plik manifestu, otrzymam dwa pliki manifestu. – Sundae

+0

Warto zauważyć (tak jak to zapisałem w moim opisie [tutaj] (http://stackoverflow.com/a/25095068/1040915)), że jeśli chcesz tylko zadanie fatJar, możesz po prostu ustawić 'from files ({ konfiguracje ... zipTree (it)}}, sourceSets.main.java) '- lub odpowiednio. – scubbo

6

To działa dobrze dla mnie.

Główny klasa:

package com.curso.online.gradle; 

import org.apache.commons.lang3.StringUtils; 
import org.apache.log4j.Logger; 

public class Main { 

    public static void main(String[] args) { 
     Logger logger = Logger.getLogger(Main.class); 
     logger.debug("Starting demo"); 

     String s = "Some Value"; 

     if (!StringUtils.isEmpty(s)) { 
      System.out.println("Welcome "); 
     } 

     logger.debug("End of demo"); 
    } 

} 

I to jest zawartość mojego pliku build.gradle:

apply plugin: 'java' 

apply plugin: 'eclipse' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2' 
    testCompile group: 'junit', name: 'junit', version: '4.+' 
    compile 'org.apache.commons:commons-lang3:3.0' 
    compile 'log4j:log4j:1.2.16' 
} 

task fatJar(type: Jar) { 
    manifest { 
     attributes 'Main-Class': 'com.curso.online.gradle.Main' 
    } 
    baseName = project.name + '-all' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 

I napisać następujących w moim konsoli:

java -jar ProyectoEclipseTest-all.jar 

I wyjście jest świetne:

log4j:WARN No appenders could be found for logger (com.curso.online.gradle.Main) 
. 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more in 
fo. 
Welcome 
2

Proste sulution

jar { 
    manifest { 
     attributes 'Main-Class': 'cova2.Main' 
    } 
    doFirst { 
     from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } } 
    } 
} 
-1

Jeśli jesteś przyzwyczajony do mrówek to można spróbować to samo z Gradle TOO:

task bundlemyjava{ 
    ant.jar(destfile: "build/cookmyjar.jar"){ 
     fileset(dir:"path to your source", includes:'**/*.class,*.class', excludes:'if any') 
     } 
} 
37

Odpowiedź przez @felix prawie przyniósł mi tam. Miałem dwie kwestie:

  1. Z Gradle 1.5, manifest tag nie został rozpoznany wewnątrz zadania fatJar, więc atrybut Main-Class nie mógł bezpośrednio być ustawiony
  2. słoik miał sprzecznych zewnętrzne pliki META-INF.

Poniższa konfiguracja rozwiązuje ten

jar { 
    manifest { 
    attributes(
     'Main-Class': 'my.project.main', 
    ) 
    } 
} 

task fatJar(type: Jar) { 
    manifest.from jar.manifest 
    classifier = 'all' 
    from { 
    configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } 
    } { 
     exclude "META-INF/*.SF" 
     exclude "META-INF/*.DSA" 
     exclude "META-INF/*.RSA" 
    } 
    with jar 
} 

Aby dodać do standardu montażu lub zbudować zadanie, dodać:

artifacts { 
    archives fatJar 
} 
+3

Naprawiono również problem, który miałem jeden z moich słoików zależności został podpisany, pliki sygnatur zostały umieszczone w META-INF mojego słoja, ale podpis nie pasował już do zawartości – Flavin

+0

Specjalne podziękowania za "artefakty": dokładnie to, czego szukałem – AlexR

+0

Po uruchomieniu 'gradle fatJar' wydaje się, że zależności środowiska wykonawczego nie zostały skompilowane, więc nie można ich skopiować. – mjaggard

5

Aby wygenerować JAR tłuszczu z głównej klasy wykonywalnego, unikając problemy z podpisanymi JARami, sugeruję gradle-one-jar plugin. Prosta wtyczka korzystająca z One-JAR project.

Łatwy w użyciu:

apply plugin: 'gradle-one-jar' 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.github.rholder:gradle-one-jar:1.0.4' 
    } 
} 

task myjar(type: OneJar) { 
    mainClass = 'com.benmccann.gradle.test.WebServer' 
} 
Powiązane problemy