Adicionar recursos e arquivos de configuração ao seu jar usando o Gradle

91

Como adiciono arquivos de configuração ou quaisquer outros recursos ao meu jar usando o Gradle?

Estrutura do meu projeto:

src / main / java / com / perseus / .. --- Pacotes Java (arquivos de origem)

src / main / java / config / *. xml --- Arquivos de configuração do Spring

Estrutura esperada do jar:

com / perseus / .. --- pacotes Java (arquivos de classe)

config / *. xml --- Arquivos de configuração do Spring

Pritesh Mhatre
fonte

Respostas:

80

Me deparei com este post procurando como adicionar um diretório extra para recursos. Encontrei uma solução que pode ser útil para alguém. Aqui está minha configuração final para conseguir isso:

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources", "src/main/configs"
        }
    }
}
Wellington Souza
fonte
5
Esta é uma solução muito mais simples do que a resposta aceita
Stewart,
70

Mova os arquivos de configuração de src/main/javapara src/main/resources.

Peter Niederwieser
fonte
1
Funciona para mim, parece a maneira mais fácil e "mais correta" de fazer isso.
EM-Creations
Essa resposta sugere uma solução alternativa em vez de uma solução, e o Gradle oferece uma solução.
Terrível Tadpole
@TerribleTadpole esta é a solução correta. Todos os outros são soluções alternativas.
jannis
63

Obrigado pessoal, estava migrando um projeto existente para o Gradle e não gostei muito da ideia de mudar a estrutura do projeto.

Eu descobri, pensei que esta informação poderia ser útil para iniciantes.

Aqui está um exemplo de tarefa do meu '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
fonte
34
É mais preciso reconfigurar o conjunto de origem. Algo parecido sourceSets.main.resources { srcDirs = ["src/main/java"]; exclude "**/*.java" }.
Peter Niederwieser
1
Obrigado @PeterNiederwieser !! Tenho tentado fazer com que meu arquivo log4j.xml seja incluído no meu jar executável que eu estava construindo usando o shadow. Eu também estava lidando com um projeto antigo e não pude alterar prontamente a estrutura do diretório. Sua sugestão foi exatamente o que eu precisava !! : D
Piko
@PeterNiederwieser - Percebo na documentação do plug-in Java que os recursos já estão definidos para excluir * .java. "Contém apenas recursos e exclui quaisquer arquivos .java encontrados nos diretórios de origem do recurso."
Joe Bowbeer
25

Por padrão, todos os arquivos adicionados src/main/resourcesserão incluídos no jar.

Se você precisar alterar esse comportamento por qualquer motivo, poderá fazer isso configurando sourceSets.

Esta parte da documentação contém todos os detalhes

geoand
fonte
4
Você saberia por que apenas o conteúdo de .../resources/está incluído em vez do diretório de recursos com o conteúdo?
sargas
@sargas Você provavelmente deve começar uma nova pergunta na qual possa incluir facilmente todo o contexto. É difícil obter muitas informações na seção de comentários :(
geoand
18

Eu tive o mesmo problema. Eu tinha um arquivo PNG em um pacote Java e ele não foi exportado no JAR final junto com as fontes, o que fez o aplicativo travar ao iniciar (arquivo não encontrado).

Nenhuma das respostas acima resolveu meu problema, mas encontrei a solução nos fóruns do Gradle. Eu adicionei o seguinte ao meu build.gradlearquivo:

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

Diz ao Gradle para procurar recursos no src pasta e pede que inclua apenas arquivos PNG.

EDIT: Cuidado que se você estiver usando o Eclipse, isso irá interromper suas configurações de execução e você receberá um main class not founderro ao tentar executar seu programa. Para corrigir isso, a única solução que encontrei é mover a (s) imagem (ns) para outro diretório, res/por exemplo, e defini-la como em srcDirsvez de src/.

imperfeito
fonte
2
Usei o +=operador para adicionar meus diretórios aos diretórios existentes: por exemplo,sourceSets.main.resources.srcDirs += [ "src/main/java" ]
TmTron
3

Esteja ciente de que o caminho sob src / main / resources deve corresponder ao caminho do pacote de seus arquivos .class que desejam acessar o recurso. Veja minha resposta aqui .

roedor de microfone
fonte