Fügen Sie mit jarle Ressourcen und Konfigurationsdateien zu Ihrem Glas hinzu

89

Wie füge ich mit gradle Konfigurationsdateien oder andere Ressourcen zu meinem JAR hinzu?

Meine Projektstruktur:

src / main / java / com / perseus / .. --- Java-Pakete (Quelldateien)

src / main / java / config / *. xml --- Spring-Konfigurationsdateien

Erwartete Glasstruktur:

com / perseus / .. --- Java-Pakete (Klassendateien)

config / *. xml --- Spring-Konfigurationsdateien

Pritesh Mhatre
quelle

Antworten:

79

Ich bin auf diesen Beitrag gestoßen, als ich nach einem zusätzlichen Verzeichnis für Ressourcen gesucht habe. Ich habe eine Lösung gefunden, die für jemanden nützlich sein kann. Hier ist meine endgültige Konfiguration, um das zu bekommen:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}
Wellington Souza
quelle
5
Dies ist eine viel einfachere Lösung als die akzeptierte Antwort
Stewart
69

Verschieben Sie die Konfigurationsdateien von src/main/javanach src/main/resources.

Peter Niederwieser
quelle
Funktioniert für mich, scheint der einfachste und "korrekteste" Weg zu sein, um dies zu erreichen.
EM-Creations
Diese Antwort schlägt eher eine Umgehung als eine Lösung vor, und Gradle bietet eine Lösung.
Schreckliche Kaulquappe
63

Vielen Dank, ich habe ein bestehendes Projekt nach Gradle migriert und die Idee, die Projektstruktur zu ändern, hat mir nicht so gut gefallen.

Ich habe es herausgefunden und dachte, diese Informationen könnten für Anfänger nützlich sein.

Hier ist eine Beispielaufgabe aus meinem 'build.gradle':

version = '1.0.0'

jar {
   baseName = 'analytics'
   from('src/main/java') {
      include 'config/**/*.xml'
   }

   manifest {
       attributes 'Implementation-Title': 'Analytics Library', 'Implementation-Version': version
   }
}
Pritesh Mhatre
quelle
33
Es ist genauer, den Quellensatz neu zu konfigurieren. So etwas wie sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser
1
Danke @PeterNiederwieser !! Ich habe versucht, meine log4j.xml-Datei in meine ausführbare JAR-Datei aufzunehmen, die ich mit Shadow erstellt habe. Auch ich hatte es mit einem älteren Projekt zu tun und konnte die Verzeichnisstruktur nicht ohne weiteres ändern. Ihr Vorschlag war genau das, was ich brauchte !! : D
Piko
@PeterNiederwieser - Ich stelle in der Java-Plugin-Dokumentation fest, dass Ressourcen bereits so definiert sind, dass sie * .java ausschließen. "Enthält nur Ressourcen und schließt alle in den Ressourcenquellenverzeichnissen gefundenen Java-Dateien aus."
Joe Bowbeer
25

Standardmäßig werden alle Dateien, die Sie hinzufügen, src/main/resourcesin das JAR aufgenommen.

Wenn Sie dieses Verhalten aus irgendeinem Grund ändern müssen, können Sie dies durch Konfigurieren tun sourceSets.

Dieser Teil der Dokumentation enthält alle Details

geoand
quelle
4
Möchten Sie wissen, warum nur den Inhalt der .../resources/anstelle des enthaltenen Ressourcen - Verzeichnis mit dem Inhalt?
Sargas
@sargas Du solltest wahrscheinlich eine neue Frage stellen, in der du leicht den gesamten Kontext einschließen kannst. Es ist schwer, viele Informationen im Kommentarbereich zu bekommen :(
geoand
18

Ich bin auf das gleiche Problem gestoßen. Ich hatte eine PNG-Datei in einem Java-Paket und sie wurde nicht zusammen mit den Quellen in die endgültige JAR exportiert, was dazu führte, dass die App beim Start abstürzte (Datei nicht gefunden).

Keine der obigen Antworten hat mein Problem gelöst, aber ich habe die Lösung in den Gradle-Foren gefunden. Ich habe meiner build.gradleDatei Folgendes hinzugefügt :

sourceSets.main.resources.srcDirs = [ "src/" ]
sourceSets.main.resources.includes = [ "**/*.png" ]

Gradle wird angewiesen, nach Ressourcen im srcOrdner zu suchen und nur PNG-Dateien einzuschließen.

BEARBEITEN: Beachten Sie, dass bei Verwendung von Eclipse Ihre Ausführungskonfigurationen beschädigt werden und main class not foundbeim Versuch, Ihr Programm auszuführen , eine Fehlermeldung angezeigt wird. Um dies zu beheben, habe ich nur die Lösung gefunden, die Bilder res/beispielsweise in ein anderes Verzeichnis zu verschieben und als srcDirsstatt festzulegen src/.

fehlerhaft
quelle
2
Ich habe den +=Operator verwendet, um meine Verzeichnisse zu den vorhandenen Verzeichnissen hinzuzufügen: zBsourceSets.main.resources.srcDirs += [ "src/main/java" ]
TmTron
3

Beachten Sie, dass der Pfad unter src / main / resources mit dem Paketpfad Ihrer .class-Dateien übereinstimmen muss, die auf die Ressource zugreifen möchten. Siehe meine Antwort hier .

Mike Nagetier
quelle