Se você estiver usando o maven, normalmente coloca log4j.properties em java ou recursos?

128

Onde devo colocar o arquivo log4j.properties ao usar os diretórios convencionais do Maven?

user496949
fonte
6
src / test / resources - o consumidor do seu artefato definiria os níveis de log necessários para a implementação. No entanto, eu recomendaria o slf4j se você estiver fazendo isso para trabalhos comerciais. Isso oferece a opção de alternar as estruturas de log na implantação. slf4j.org
David Victor
2
BTW, se você quiser experimentar, é possível usar o log4j sem um arquivo de configuração properties / xml. Em ' logging.apache.org/log4j/1.2/manual.html - Configuração' "A chamada do método BasicConfigurator.configure cria uma configuração bastante simples para o log4j." Veja também: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/...
David Victor

Respostas:

141

src/main/resources é o "canal padrão" para isso.

Atualização: O item acima responde à pergunta, mas não é a melhor solução. Confira as outras respostas e os comentários sobre isso ... você provavelmente não enviaria suas próprias propriedades de log com o jar, mas deixaria para o cliente (por exemplo, servidor de aplicativos, ambiente de estágio etc.) para configurar o log desejado. Assim, colocá-lo src/test/resourcesé a minha solução preferida.

Observação: por deixar a configuração de log concreta para o cliente / usuário, considere substituir log4jpor slf4jno seu aplicativo.

Jan Galinski
fonte
Não encontrei nenhum recurso diretcory criado. Preciso fazer isso manualmente?
user496949
3
Sim. Crie manualmente resourcese log4j.propertiesna pasta mencionada na resposta.
Nishant 27/02
@ user496949: os arquivos abaixo src/main/resourcesserão copiados por padrão paratarget/classes
splash
17
A menos que você pretende exportar as configurações log4j como parte de seu artefato - é muito melhor para colocá-lo em src / test / recursos
David Victor
1
@FerasOdeh para excluí-lo dos artefatos gerados (jarros, guerras etc.) e ser usado apenas durante o teste "A menos que você pretenda exportar suas configurações do log4j como parte do seu artefato".
Ali Shakiba
60

Basta colocá-lo no src/main/resourcespacote dentro do artefato. Por exemplo, se seu artefato for um JAR, você terá o log4j.propertiesarquivo dentro dele, perdendo o ponto inicial de tornar o registro configurável.

Eu costumo colocá-lo src/main/resourcese configurá-lo como saída para o destino da seguinte forma:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Além disso, para que o log4j realmente o veja, você precisa adicionar o diretório de saída ao caminho da classe. Se o seu artefato for um JAR executável, você provavelmente utilizou o maven-assembly-plugin para criá-lo. Dentro desse plug-in, você pode adicionar a pasta atual do JAR ao caminho da classe adicionando uma Class-Pathentrada de manifesto da seguinte maneira:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Agora, o arquivo log4j.properties estará ao lado do seu arquivo JAR, configurável independentemente.

Para executar seu aplicativo diretamente do Eclipse, inclua o resourcesdiretório no caminho de classe na sua configuração de execução: Run->Run Configurations...->Java Application->Newselecione a Classpathguia, selecione Advancede navegue até seu src/resourcesdiretório.

Zoltán
fonte
2
outra opção pode ser colocá-lo em src / test / resources para que ele não seja agrupado.
Rogerdpack
Uau. Obrigado por isso. Era exatamente disso que eu precisava!
Blissfool 17/07/2015
@ Zoltán, acho difícil adicionar o diretório de saída ao caminho de classe, como você recomendou. Existe uma maneira de fazer isso manualmente, como entrar no arquivo .classpath do projeto em particular e adicionar esse diretório de saída log4j para que o log4j possa ver o arquivo .properties após o aplicativo ter sido empacotado em um arquivo .war. Além disso, a tag targetPath, o valor deve ser usado como está ${project.build.directory}ou deve ser editado para o caminho real que o projeto vive na minha unidade local?
Ireti 11/04
26

Algumas "minerações de dados" são responsáveis ​​por esse src/main/resourceslocal típico.

Resultados na Pesquisa de código do Google :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
respingo
fonte
4
Qual é a diferença dessa resposta em relação à que foi respondida 20 minutos atrás? Além disso, é resourcesnão resource, se bem me lembro.
Nishant 27/02
6
@ Nishant: não é diferente, porque quando abri a caixa de respostas deixei o PC. Depois de voltar e responder à pergunta, perdi que a pergunta já estava respondida. resourcefoi apenas um erro de digitação.
splash
1
Eu sugeriria fazer algumas leituras sobre o maven, o plug-in do compilador do maven, convenções para o layout de projetos do maven. Talvez veja o que está abaixo de 'target' quando seu artefato é construído. Então talvez você possa modificar sua resposta.
David Victor
4
A resposta correta é src / xxx / resources - não é uma convenção. Consulte: maven.apache.org/plugins/maven-resources-plugin/examples/… - aqui 'xxx' pode ser 'principal' ou 'teste'. A menos que você deseje fornecer níveis de log pré-configurados, geralmente é mais prudente configurar o log conforme necessário para o teste - via 'src / test / resources' - e permitir que o consumidor do seu artefato defina o nível de log.
David Victor
22
Resultados do Google para "Jump off a bridge": 18.200.000. Resultados do Google para "Não pule de uma ponte": 137.000
djjeck
9

Os recursos usados ​​para inicializar o projeto são preferencialmente colocados na pasta src / main / resources . Para ativar o carregamento desses recursos durante a construção, basta adicionar entradas no pom.xml no projeto maven como um recurso de construção

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

Outros arquivos .properties também podem ser mantidos nessa pasta usada para inicialização. A filtragem é configurada como true se você deseja ter algumas variáveis ​​nos arquivos de propriedades da pasta resources e preenchê-las nos arquivos de propriedades dos filtros de perfil, que são mantidos em src / main / filters, que é definido como perfis, mas é um caso de uso completamente diferente . Por enquanto, você pode ignorá-los.

Este é um ótimo plug-in de recursos , é útil, basta navegar por outras seções também.

devastador
fonte
Se você acabou de copiar e colar os maven acima trecho, por favor, note que é </ resources> </ build>
rdesilva
6

Quando colocar arquivos de recursos em outro local não é a melhor solução que você pode usar:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Por exemplo, quando os arquivos de recursos (por exemplo, jaxb.properties) vão fundo nos pacotes junto com as classes Java.

Ali Shakiba
fonte
1

Se o arquivo log4j.properties ou log4j.xml não for encontrado em src / main / resources, use este PropertyConfigurator.configure ("log4j.xml");

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
ethemsulan
fonte
0

Adicione o código abaixo das tags de recursos em seu pom.xml dentro das tags de compilação. portanto, as tags de recursos devem estar dentro das tags de compilação no seu pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Challa Purushotham
fonte