Agregue recursos, archivos de configuración a su jar usando gradle

91

¿Cómo agrego archivos de configuración o cualquier otro recurso en mi jar usando gradle?

Mi estructura de proyecto:

src / main / java / com / perseus / .. --- paquetes Java (archivos fuente)

src / main / java / config / *. xml --- Archivos de configuración de Spring

Estructura esperada del tarro:

com / perseus / .. --- paquetes Java (archivos de clase)

config / *. xml --- Archivos de configuración de Spring

Pritesh Mhatre
fuente

Respuestas:

81

Encontré esta publicación buscando cómo agregar un directorio adicional para recursos. Encontré una solución que puede ser útil para alguien. Aquí está mi configuración final para conseguirlo:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}
Wellington Souza
fuente
5
Esta es una solución mucho más simple que la respuesta aceptada
Stewart
70

Mueva los archivos de configuración de src/main/javaa src/main/resources.

Peter Niederwieser
fuente
1
Funciona para mí, parece la forma más fácil y "más correcta" de lograrlo.
EM-Creations
Esta respuesta sugiere una alternativa en lugar de una solución, y Gradle proporciona una solución.
Terrible Tadpole
@TerribleTadpole esta es la solución correcta. Todos los demás son soluciones alternativas.
Jannis
64

Gracias chicos, estaba migrando un proyecto existente a Gradle y no me gustó tanto la idea de cambiar la estructura del proyecto.

Lo he descubierto, pensé que esta información podría ser útil para los principiantes.

Aquí hay una tarea de muestra de mi '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
fuente
34
Es más preciso reconfigurar el conjunto de fuentes. Algo como sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser
1
Gracias @PeterNiederwieser !! He intentado que mi archivo log4j.xml se incluya en mi jar ejecutable que estaba construyendo usando shadow. Yo también estaba lidiando con un proyecto más antiguo y no podía cambiar fácilmente la estructura del directorio. ¡Tu sugerencia fue exactamente lo que necesitaba! : D
Piko
@PeterNiederwieser: noto en la documentación del complemento de Java que los recursos ya están definidos para excluir * .java. "Contiene solo recursos y excluye cualquier archivo .java que se encuentre en los directorios de origen de recursos".
Joe Bowbeer
25

De forma predeterminada, los archivos que agregue src/main/resourcesse incluirán en el jar.

Si necesita cambiar ese comportamiento por cualquier motivo, puede hacerlo configurando sourceSets.

Esta parte de la documentación tiene todos los detalles.

geo y
fuente
4
¿Sabría por qué solo .../resources/se incluye el contenido de en lugar del directorio de recursos con el contenido?
sargas
@sargas Probablemente debería comenzar una nueva pregunta en la que pueda incluir fácilmente todo el contexto. Es difícil obtener mucha información en la sección de comentarios :(
geo y
18

Tuve el mismo problema. Tenía un archivo PNG en un paquete de Java y no se exportó en el JAR final junto con las fuentes, lo que provocó que la aplicación fallara al iniciarse (archivo no encontrado).

Ninguna de las respuestas anteriores resolvió mi problema, pero encontré la solución en los foros de Gradle. Agregué lo siguiente a mi build.gradlearchivo:

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

Le dice a Gradle que busque recursos en la srccarpeta y le pide que incluya solo archivos PNG.

EDITAR: Tenga en cuenta que si está usando Eclipse, esto romperá sus configuraciones de ejecución y obtendrá un main class not founderror al intentar ejecutar su programa. Para solucionarlo, la única solución que he encontrado es mover las imágenes a otro directorio, res/por ejemplo, y configurarlas como en srcDirslugar de src/.

flawyte
fuente
2
+=sourceSets.main.resources.srcDirs += [ "src/main/java" ]
Usé
3

Tenga en cuenta que la ruta bajo src / main / resources debe coincidir con la ruta del paquete de sus archivos .class que desean acceder al recurso. Vea mi respuesta aquí .

mike roedor
fuente