Adicionar um arquivo de propriedades ao caminho de classe do IntelliJ

122

Estou executando um programa Java simples a partir do IntelliJ IDE usando o menu Executar-> Executar. Funciona bem. Agora eu quero adicionar o log44.

Eu adicionei uma pasta de recursos na raiz do meu projeto. Adicionei um arquivo log4j.properties nessa pasta. Mudei o código para registrar algo.

Qual é a maneira correta de dizer ao IntelliJ para incluir a pasta resources no caminho de classe para que o arquivo de propriedades seja visto?

Com o IntelliJ 8, eu poderia adivinhar como um macaco bêbado e, eventualmente, fazê-lo funcionar. Tenho 9 agora e não tenho sucesso. Estou tentando há uma hora. Que tal uma opção "Adicionar ao caminho de classe" em algum lugar? / fumaça / ventilação / discurso retórico

Tony Ennis
fonte
Ok, a situação está resolvida. Esta é uma nova instalação do IntelliJ - log4J NÃO é incluída por padrão. No meu código, eu havia importado o registrador de ações, não o log4j. O registrador de estoque suporta métodos semelhantes, portanto não era óbvio que eu estava usando o registrador errado! Não surpreende por que não estava lendo o arquivo de propriedades log4j ou relatando que eu precisava configurar o log4j. Que chute nos dentes!
Tony Ennis
Encontrado uma boa descrição para um iniciante para log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Respostas:

91

Tente o seguinte:

  • Vá para Estrutura do Projeto.
  • Selecione seu módulo.
  • Encontre a pasta na árvore à direita e selecione-a.
  • Clique no botão Origens acima dessa árvore (com a pasta azul) para tornar essa pasta uma pasta de origens.
ColinD
fonte
Eu fiz isso cerca de 50 vezes, apenas fiz novamente. Minha saída não está mudando, embora eu tenha alterado o padrão de conversão de layout para algo que seria óbvio. Gostaria de saber se outro log4j.properties está no meu caminho de classe.
Tony Ennis
29
Verifique os padrões de recursos nas configurações do compilador. Verifique se "? *. Properties" está lá. Está lá por padrão, mas é a única outra coisa que consigo pensar em cima da minha cabeça.
ColinD
3
Alternativa para Sourcesbutton - clique direito qualquer diretório VOCÊ criado e selecione "Mark Directory como": "Source Root"
mschr
10
Observe que, se você criou seu projeto a partir de um Maven POM, em vez de uma estrutura de origem ad-hoc, esta solução não funcionará. Em vez disso, você precisa adicionar esse diretório como um recurso ao POM. Veja a resposta de Peter Thygesen.
Lreeder 25/08
Também pode ser feito através de programação via PropertyConfigurator.configure ( "../ conf / log4j.properties")
Jason D
47

Na verdade, você tem pelo menos duas maneiras de fazer isso, a primeira maneira é descrita pelo ColinD, basta configurar a pasta "resources" como pasta Sources no IDEA. Se os Padrões de Recursos contiverem a extensão de seu recurso, ele será copiado para o diretório de saída quando você Criar o diretório de projeto e saída for automaticamente um caminho de classe do seu aplicativo.

Outra maneira comum é adicionar a pasta "recursos" diretamente ao caminho da classe. Vá para Estrutura do Projeto | Módulos Seu módulo | Dependências , clique em Adicionar , Biblioteca de módulos de entrada única , especifique o caminho para a pasta "recursos".

Outra solução seria colocar o arquivo log4j.properties diretamente na raiz de origem do seu projeto (no diretório do pacote padrão). É o mesmo da primeira maneira, exceto que você não precisa adicionar outra raiz de origem nas configurações dos Caminhos do módulo , o arquivo será copiado para o diretório de saída no Make.

Se você deseja testar com diferentes configurações do log4j, pode ser mais fácil especificar um arquivo de configuração personalizado diretamente na configuração Executar / Depurar , os parâmetros da VM arquivados como:

-Dlog4j.configuration=file:/c:/log4j.properties.

CrazyCoder
fonte
Eu fiz seus parágrafos 2 e 3 sem efeito. Tenho certeza de que as sugestões funcionam , mas elas não tiveram efeito - ele se comporta como se houvesse outro arquivo log4j.properties no caminho de classe. Mas não consigo vê-lo em lugar nenhum. Se eu remover completamente o arquivo de propriedades do log4j, não recebo o aviso "você deve configurar o log4j" no console. Estou usando o IntelliJ gratuito (e a versão 9.x) pela primeira vez, então talvez tenha algo a ver com isso.
Tony Ennis
1
O uso do parâmetro -D VM explícito também não teve efeito. Neste ponto, só posso supor que caí do topo da "árvore estúpida" e atingi todos os galhos no caminho! Eu acho que vou de arrasto em torno de JetBrains e pedir ao redor ...
Tony Ennis
Você poderia enviar o projeto de amostra com as etapas exatas para reproduzir o problema para [email protected]?
CrazyCoder
Eu estava passando -Dlog4j.configuration = file: / c: /log4j.properties nos argumentos do programa. Os parâmetros da VM fizeram o truque para mim.
Ajak6
42

Eu tenho o mesmo problema e isso me irrita tremendamente !!

Eu sempre pensei que deveria fazer a resposta 2. Isso costumava funcionar no Intellij 9 (agora usando 10).

No entanto, descobri que adicionar essas linhas ao meu arquivo maven pom ajuda:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>
Peter Thygesen
fonte
Esse era exatamente o problema que eu estava tendo, agora os arquivos de recursos são copiados para a pasta de saída com êxito.
Artjomka # 03
Esta resposta realmente funciona. Eu fiz o que o colinD sugeriu em seus comentários também. Obrigado.
Obrigado, esta é a única solução que funcionou para mim.
Minh Thiện
18

Passei bastante tempo descobrindo como fazer isso no Intellij 13x. Aparentemente, nunca adicionei os arquivos de propriedades aos artefatos que os exigiam, o que é uma etapa separada no Intellij. A configuração abaixo também funciona quando você possui um arquivo de propriedades que é compartilhado por vários módulos.

  • Vá para a configuração do seu projeto (CTRL + ALT + SHIFT + S)
  • Na lista, selecione o módulo ao qual você deseja adicionar um ou mais arquivos de propriedades.
  • À direita, selecione a guia Dependências.
  • Clique no sinal de mais verde e selecione "Frascos ou diretórios".
  • Agora selecione a pasta que contém os arquivos de propriedades. (Não tentei incluir um arquivo individual)
  • O Intellij agora perguntará qual é a "categoria" do arquivo selecionado. Escolha "classes" (mesmo que não sejam).
  • Agora você deve adicionar os arquivos de propriedades ao artefato. O Intellij fornecerá o atalho mostrado abaixo. Ele mostrará erros na parte vermelha na parte inferior e uma 'lâmpada vermelha' que, quando clicada, mostra uma opção para adicionar os arquivos ao artefato. Você também pode ir para a seção 'artefatos' e adicionar os arquivos aos artefatos manualmente.

insira a descrição da imagem aqui

Julius
fonte
14

Enfrentou um desafio semelhante ao adicionar arquivos com extensões .ini ao caminho de classe. Encontrei esta resposta , que é adicioná-la a Preferências -> Compilador -> Padrões de recursos -> [...]; *. Ini

protótipo
fonte
1
este era o problema exato que eu estava tendo com arquivos .conf
James
Eu pensei que o que há de errado com o meu código? Obrigado por esta solução #
Shoaib Chikate
5

Se você acabar com o mesmo problema com o Scala e o SBT:

  • Vá para Estrutura do Projeto. O atalho é (CTRL + ALT + SHIFT + S)

  • Na lista da extrema esquerda, escolha Configurações do projeto> Módulos

  • Na lista de módulos, selecione o módulo com o nome do seu projeto (sem a compilação) e escolha a guia fontes

  • No meio, expanda a pasta que a raiz do seu projeto para mim é /home/<username>/IdeaProjects/<projectName>

  • Veja a seção Raiz de conteúdo, no lado direito, os caminhos vermelhos são diretórios que você não criou. Você deseja colocar o arquivo de propriedades em um diretório de Recursos. Então eu criei src/main/resourcese coloquei log4j.properties nele. Acredito que você também pode modificar a raiz do conteúdo para colocá-la onde quiser (não fiz isso).

  • Eu executei meu código com uma configuração do SBT e ele encontrou meu arquivo log4j.properties.

insira a descrição da imagem aqui

user2361174
fonte
2

Para quem migra do Eclipse para o IntelliJ ou o contrário, é uma dica ao trabalhar com arquivos de propriedades ou outros arquivos de recursos.

É enlouquecedor (custa uma noite inteira para descobrir), mas o trabalho do IDE é bem diferente quando se trata de procurar arquivos de recursos / propriedades quando você deseja executar localmente a partir do IDE ou durante a depuração. (Empacotar em um .jar também é bem diferente, mas isso é melhor documentado.)

Suponha que você tenha uma referência de caminho relativa como esta em seu código:

new FileInputStream("xxxx.properties");

(o que é conveniente se você trabalha com arquivos .properties específicos da env que não deseja empacotar junto com seu JAR)

INTELLIJ

(Eu uso 13.1, mas poderia ser válido para mais versões)

O arquivo xxxx.properties precisa estar no diretório PARENT do projeto ROOT para ser coletado em tempo de execução como este no IntelliJ. (O projeto ROOT é o local onde a pasta / src reside)

ECLIPSE

O Eclipse fica feliz quando o arquivo xxxx.properties está no próprio projeto ROOT.

Portanto, o IntelliJ espera que o arquivo .properties seja 1 nível mais alto que o Eclipse quando for referenciado dessa maneira !!

Isso também afeta a maneira como você deve executar seu código quando possui a mesma linha de código (novo FileInputStream ("xxxx.properties");) em seu .jar exportado. Quando você quer ser ágil e não deseja empacotar o arquivo .properties com seu jar, será necessário executá-lo como abaixo para fazer referência ao arquivo .properties corretamente na linha de comando:

JAR EXPORTADO INTELLIJ

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

JARRO EXPORTADO ECLIPSE

java -jar some.jar

em que o jar executável exportado pelo Eclipse apenas espera que o arquivo .properties referenciado esteja no mesmo local em que o arquivo .jar está

DataHacker
fonte
Sim, logging.properties, diferente de log4j2.xml ou log4j.properties, deve ser encontrado na raiz do módulo IntelliJ. Também ao contrário do Log4j, que simplesmente funciona, eu descobri que ainda precisava fazer o júri para rodar no IntelliJ (o Eclipse seria a mesma história, a culpa é do Java logging), consulte stackoverflow.com/questions/960099/… . Uma alternativa seria consertar a configuração de execução / depuração com -Djava.util.logging.config.file =, que eu acho bastante inconveniente, pois eu prefiro ter uma configuração no código ou em um arquivo de propriedades esperado.
Russ Bateman
1

Talvez isso seja um pouco fora de tópico, visto que a pergunta já foi respondida, mas experimentei um problema semelhante. No meu caso, apenas alguns dos recursos de teste de unidade foram copiados para a pasta de saída após a compilação. Meu persistence.xml na pasta META-INF foi copiado, mas nada mais .

No final, "resolvi" o problema renomeando os arquivos problemáticos, reconstruindo o projeto e depois alterando os nomes dos arquivos para os originais. Não me pergunte por que isso funcionou, mas funcionou. Meu melhor palpite é que, de alguma forma, meu projeto IntelliJ ficou um pouco fora de sincronia com o sistema de arquivos e a operação de renomeação acionou algum tipo de "nova verificação de recursos" interna.

user1426162
fonte
1

Este é um dos erros estúpidos que cometi. Passei muito tempo tentando depurar esse problema e tentei todas as respostas postadas acima, mas no final, esse foi um dos meus muitos erros estúpidos.

Eu estava usando org.apache.logging.log4j.Logger(: fml :) enquanto eu deveria ter usado org.apache.log4j.Logger. O uso desse registrador correto salvou minha noite.

avp
fonte
0

Eu tive um problema semelhante com um arquivo log4j.xml para um teste de unidade, fiz tudo isso acima. Mas descobri que era porque eu estava apenas re-executando um teste que falhou ... se eu re-executar toda a classe de teste, o arquivo correto será coletado. Isso está no Intelli-j 9.0.4

James B
fonte