2015-01-12 5 views
5

Ich benutze Gradle und ich möchte eine .jar mit Quelldateien erstellen, wenn Sie eine publishToMavenLocal tun. Ich habe das bekam leicht zu arbeiten:Gradle Publishing Jar mit Quelldateien und Abhängigkeiten in POM

task jarWithSources(type: Jar) { 
    from sourceSets.main.output 
    if (gradle.startParameter.taskNames.any{it == "publishToMavenLocal"}) { 
     from sourceSets.main.allJava 
    } 
} 

publishing { 
    publications { 
     // publish the data_deposit jar as a standalone artifact 
     mavenJar(MavenPublication) { 
      artifact jarWithSources 
      artifactId "${jar.baseName}_jar" 
      version project.version 
     } 
    } 
    repositories { 
     maven { ... } 
    } 
} 

jedoch die pom.xml wird die Abhängigkeiten fehlen.

Wenn ich dies:

publishing { 
    publications { 
     // publish the data_deposit jar as a standalone artifact 
     mavenJar(MavenPublication) { 
      // artifact jarWithSources // Stopped using this 
      from components.java   // Have added this 
      artifactId "${jar.baseName}_jar" 
      version project.version 
     } 
    } 
    repositories { 
     maven { ... } 
    } 
} 

Wo dies nur ist, dass eine Änderung in der MavenPublication, dann bekomme ich die volle pom.xml aber keine Quelle natürlich. Ich kann keinen Weg finden, sowohl artifact jarWithSources als auch from components.java einzuschließen. Der Fehler ist:

Invalid publication 'mavenJar': multiple artifacts with the identical extension and classifier ('jar', 'null'). 

Was bedeutet, dass from components.java auch von type: Jar ist.

Kann jemand beraten, wie ich all das zur Arbeit bekommen kann?

Nun, um diese Frage zu beenden, muss ich sagen, dass Gradle eine sehr sehr sehr steile Lernkurve hat. Es ist eine Computersprache (DSL), also muss deterministisch sein, obwohl ich mich manchmal frage. Ich habe nicht das Wissen zu verstehen, wie (zum Beispiel) from components.java funktioniert (# 1). Für so viel Dokumentation wie es gibt (wie http://www.gradle.org/docs/current/userguide/publishing_maven.html und das DSL-Handbuch), ist es nicht sehr klar. Ich denke, die Dokumentation könnte viel reicher sein. Und es muss ein Kapitel über "es bekommen" geben. Es gibt einen Paradigmenwechsel, den man zu verstehen scheint!

# 1 - so gut ich verstehe das gibt Ihnen, was bei http://www.gradle.org/docs/nightly/userguide/java_plugin.html#sec:java_plugin_and_dependency_management ist, aber wie funktioniert das mit einem from und im Zusammenhang mit einem MavenPublication?

+1

"eine sehr sehr sehr steile Lernkurve" würde ich ein paar sehr selbst hinzufügen.Zu viel Magie und schlechte Benennung – mhstnsc

+0

haben das gleiche Problem über verschleierte Gläser – mhstnsc

Antwort

3

Here können Sie Arbeitsbeispiel finden, es ist genug gradle clean publishToMavenLocal aufzurufen Artefakte zu haben bauen und veröffentlicht lokalen Maven Repo Maven (Artefakt wird von Ordnername Versionsnummer genommen werden soll nicht spezifiziert).

Es scheint, dass build.gradle Datei leicht verändert werden sollte. Wird das Projekt veröffentlicht, darf ich es versuchen?

Am Anfang scheint Gradle tatsächlich schwierig zu sein, aber nach dem Konfigurieren von ersten Projekten werden Sie es schnell fangen.

EDIT (nach Diskussion in den Kommentaren)

beiden Quellen zu schließen und kompilierten Klassen in einem einzigen Glas fügen Sie die folgenden Code zu build.gradle:

jar { 
    from sourceSets.main.output 
    from sourceSets.main.allJava 
} 

Und entfernen Aufgabe sourceJar und artifact Abschnitt von publications. Es funktioniert aber einschließlich Quellen und kompilierten Klassen ist ungewöhnlich und nicht eine gute Idee.

Abhängigkeiten werden automatisch installiert pom.xml hinzugefügt - siehe für guice. Ich habe das Projekt auf GitHub aktualisiert.

+1

Ja, das ist gut - lesen Sie den Fehler und sehen Sie, es gibt einen Klassifikator Konflikt. Wählen Sie also einen anderen Klassifikator. Ich möchte jedoch, dass die Quellen im selben Jar sind, um beim Debuggen zu helfen. Ich habe das nicht ausprobiert, aber ich stelle mir vor, wenn Sie auf die Quellen jar angewiesen sind, dann würde der gleiche Debugging-Vorteil erzielt werden. Obwohl dies funktionieren würde, muss die Abhängigkeit nur für die Entwicklung hinzugefügt werden. Ich schätze, du könntest es nur während der Entwicklung bewachen, aber dann wird es hässlich, besonders wenn du viele davon hast. So wollen - Quellen im selben Glas und haben die Abhängigkeiten in der Pom. – HankCa

+0

Ok, werde das morgen versuchen. – Opal

+0

Danke. Ich lese meinen Kommentar noch einmal und es klingt ein bisschen unhöflich. Ich wollte sagen, dass ich die Fehlermeldung näher gelesen hätte, um zu erkennen, dass es sich um einen Klassifikator handelt. Also danke, dass du darauf hinweist. Aber ja, ich brauche ein anderes Ergebnis! – HankCa