Dodaj zasoby, pliki konfiguracyjne do swojego jar za pomocą gradle

91

Jak mogę dodać pliki konfiguracyjne lub inne zasoby do mojego jar za pomocą Gradle?

Struktura mojego projektu:

src / main / java / com / perseus / .. --- Pakiety Java (pliki źródłowe)

src / main / java / config / *. xml --- pliki konfiguracyjne Spring

Oczekiwana struktura słoika:

com / perseus / .. --- Pakiety Java (pliki klas)

config / *. xml --- pliki konfiguracyjne Spring

Pritesh Mhatre
źródło

Odpowiedzi:

81

Natknąłem się na ten post, szukając sposobu dodania dodatkowego katalogu dla zasobów. Znalazłem rozwiązanie, które może się komuś przydać. Oto moja ostateczna konfiguracja, aby to uzyskać:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}
Wellington Souza
źródło
5
To znacznie prostsze rozwiązanie niż przyjęta odpowiedź
Stewart
70

Przenieś pliki konfiguracyjne z src/main/javado src/main/resources.

Peter Niederwieser
źródło
1
U mnie działa, wygląda na to, że jest to najłatwiejszy i „najbardziej poprawny” sposób osiągnięcia tego celu.
EM-Creations
Ta odpowiedź sugeruje raczej obejście niż rozwiązanie, a Gradle zapewnia rozwiązanie.
Straszna Kijanka
@TerribleTadpole to jest poprawne rozwiązanie. Wszystkie inne to obejścia.
jannis
64

Dzięki chłopaki, migrowałem istniejący projekt do Gradle i nie podobał mi się pomysł zmiany struktury projektu.

Rozgryzłem to, pomyślałem, że ta informacja może być przydatna dla początkujących.

Oto przykładowe zadanie z mojego „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
źródło
34
Dokładniejsze jest ponowne skonfigurowanie zestawu źródłowego. Coś jak sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser
1
Dzięki @PeterNiederwieser !! Próbowałem włączyć mój plik log4j.xml do mojego pliku wykonywalnego jar, który budowałem za pomocą shadow. Ja też miałem do czynienia ze starszym projektem i nie mogłem łatwo zmienić struktury katalogów. Twoja sugestia była dokładnie tym, czego potrzebowałem! : D
Piko
@PeterNiederwieser - zauważyłem w dokumentacji wtyczki Java, że ​​zasoby są już zdefiniowane w celu wykluczenia * .java. „Zawiera tylko zasoby i wyklucza wszystkie pliki .java znalezione w katalogach źródeł zasobów”.
Joe Bowbeer
25

Domyślnie wszystkie dodane pliki src/main/resourceszostaną uwzględnione w słoiku.

Jeśli z jakiegoś powodu musisz zmienić to zachowanie, możesz to zrobić, konfigurując sourceSets.

Ta część dokumentacji zawiera wszystkie szczegóły

geoand
źródło
4
Czy wiesz, dlaczego tylko zawartość .../resources/jest uwzględniana zamiast katalogu zasobów z zawartością?
sargas
@sargas Prawdopodobnie powinieneś rozpocząć nowe pytanie, w którym z łatwością możesz uwzględnić cały kontekst. Trudno jest uzyskać wiele informacji w sekcji komentarzy :(
geo i
18

Napotkałem ten sam problem. Miałem plik PNG w pakiecie Java i nie został on wyeksportowany w ostatecznym pliku JAR wraz ze źródłami, co spowodowało awarię aplikacji podczas uruchamiania (nie znaleziono pliku).

Żadna z powyższych odpowiedzi nie rozwiązała mojego problemu, ale znalazłem rozwiązanie na forach Gradle. Dodałem do mojego build.gradlepliku:

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

Mówi Gradle, aby szukał zasobów w src folderze i poprosił go o uwzględnienie tylko plików PNG.

EDYCJA: Uważaj, jeśli używasz Eclipse, spowoduje to uszkodzenie konfiguracji uruchamiania i pojawi się main class not foundbłąd podczas próby uruchomienia programu. Aby to naprawić, jedynym rozwiązaniem, które znalazłem, jest na przykład przeniesienie obrazu (ów) do innego katalogu res/i ustawienie go jako srcDirszamiast src/.

flawyte
źródło
2
Użyłem +=operatora, aby dodać moje katalogi do istniejących: np.sourceSets.main.resources.srcDirs += [ "src/main/java" ]
TmTron
3

Należy pamiętać, że ścieżka w src / main / resources musi odpowiadać ścieżce pakietu plików .class, które chcą uzyskać dostęp do zasobu. Zobacz moją odpowiedź tutaj .

mike gryzoń
źródło