Si usa maven, ¿generalmente coloca log4j.properties en java o resources?


128

¿Dónde debo colocar el archivo log4j.properties cuando utilizo los directorios convencionales de Maven?


66
src / test / resources: el consumidor de su artefacto establecería los niveles de registro necesarios para la implementación. Sin embargo, recomendaría slf4j si está haciendo esto para trabajo comercial. Esto ofrece la opción de cambiar los marcos de registro en la implementación. slf4j.org
David Victor

2
Por cierto, si solo desea experimentar, es posible usar log4j sin un archivo de configuración de propiedades / xml. De ' logging.apache.org/log4j/1.2/manual.html - Configuración' "La invocación del método BasicConfigurator.configure crea una configuración de log4j bastante simple". Ver también: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… maven.apache.org/plugins/maven-resources-plugin/examples/…
David Victor

Respuestas:


141

src/main/resources es la "colocación estándar" para esto.

Actualización: lo anterior responde a la pregunta, pero no es la mejor solución. Vea las otras respuestas y los comentarios sobre esto ... probablemente no enviaría sus propias propiedades de registro con el jar, sino que lo dejaría al cliente (por ejemplo, servidor de aplicaciones, entorno de escenario, etc.) para configurar el registro deseado. Por lo tanto, ponerlo src/test/resourceses mi solución preferida.

Nota: Hablando de salir de la configuración de registro concreto para el cliente / usuario, debe considerar sustituir log4jcon slf4jen su aplicación.


No encontré ningún directorio de recursos creado. ¿Necesito hacerlo manualmente?
user496949

3
Sí. Crear manualmente resourcesy log4j.propertiesen la carpeta mencionada en la respuesta.
Nishant

@ user496949: los archivos debajo src/main/resourcesse copiarán por defecto atarget/classes
splash

17
A menos que tenga la intención de exportar su configuración de log4j como parte de su artefacto, es mucho mejor ponerla bajo src / test / resources
David Victor

1
@FerasOdeh para excluirlo de los artefactos generados (frascos, guerras, etc.) y solo se utilizará durante las pruebas, "A menos que tenga la intención de exportar la configuración de log4j como parte de su artefacto".
Ali Shakiba

60

Solo ponerlo lo src/main/resourcesagrupará dentro del artefacto. Por ejemplo, si su artefacto es un JAR, tendrá el log4j.propertiesarchivo dentro, perdiendo su punto inicial de hacer que el registro sea configurable.

Por lo general, lo pongo src/main/resourcesy lo configuro para que se envíe al destino de la siguiente manera:

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

Además, para que log4j lo vea realmente, debe agregar el directorio de salida a la ruta de clase. Si su artefacto es un JAR ejecutable, probablemente haya utilizado el complemento maven-assembly para crearlo. Dentro de ese complemento, puede agregar la carpeta actual del JAR a la ruta de clase agregando una Class-Pathentrada de manifiesto de esta manera:

<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>

Ahora el archivo log4j.properties estará justo al lado de su archivo JAR, configurable independientemente.

Para ejecutar su aplicación directamente desde Eclipse, agregue el resourcesdirectorio a su classpath en su configuración de ejecución: Run->Run Configurations...->Java Application->Newseleccione la Classpathpestaña, seleccione Advancedy busque su src/resourcesdirectorio.


2
Otra opción podría ser ponerlo bajo src / test / resources para que no se agrupe.
rogerdpack

Guau. Gracias por eso. ¡Esto era justo lo que necesitaba!
blissfool

@ Zoltán, me resulta difícil agregar el directorio de salida al classpath, como me ha aconsejado. ¿Hay alguna manera de que pueda hacerlo manualmente? Además, la etiqueta targetPath, ¿debería usarse el valor tal cual ${project.build.directory}o debería editarse en la ruta real en la que vive el proyecto en mi disco local?
Ireti

26

Algunas cuentas de "minería de datos" src/main/resourcesson el lugar típico.

Resultados en la búsqueda de código de Google :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215

44
¿Cómo difiere esta respuesta en algún aspecto de la que respondió hace 20 minutos? Además, es resourcesno resource, si no recuerdo mal.
Nishant

66
@Nishant: no es diferente, porque cuando abrí el cuadro de respuesta dejé la PC. Después de regresar y responder la pregunta, me perdí que la pregunta ya estaba respondida. resourcefue solo un error tipográfico.
splash

1
Sugeriría leer un poco sobre maven, el complemento compilador de maven, convenciones para el diseño de proyectos de maven. Tal vez mire lo que va debajo del 'objetivo' cuando se construye su artefacto. Entonces quizás puedas modificar tu respuesta.
David Victor

44
La respuesta correcta es src / xxx / resources; no es una convención. Ver: maven.apache.org/plugins/maven-resources-plugin/examples/… - aquí 'xxx' puede ser 'main' o 'test'. A menos que desee proporcionar niveles de registro preconfigurados, generalmente es más inteligente configurar el registro según sea necesario para las pruebas, a través de 'src / test / resources', y permitir que el consumidor de su artefacto establezca el nivel de registro.
David Victor

22
Resultados de Google para "Jump from a bridge": 18.200.000. Resultados de Google para "No saltar de un puente": 137.000
djjeck

9

Los recursos utilizados para inicializar el proyecto se colocan preferiblemente en la carpeta src / main / resources . Para permitir la carga de estos recursos durante la compilación, uno simplemente puede agregar entradas en el proyecto pom.xml en maven como recurso de compilación

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

Otros archivos .properties también se pueden guardar en esta carpeta utilizada para la inicialización. El filtrado se establece como verdadero si desea tener algunas variables en los archivos de propiedades de la carpeta de recursos y llenarlas desde los archivos de propiedades de filtros de perfil, que se guardan en src / main / filters que se configura como perfiles pero es un caso de uso completamente diferente . Por ahora, puedes ignorarlos.

Este es un gran recurso de complementos de recursos de Maven , es útil, solo navega a través de otras secciones también.


Si solo copia y pega el fragmento Maven anterior, tenga en cuenta que es </resources> </build>
rdesilva

6

Cuando colocar archivos de recursos en otra ubicación no es la mejor solución que puede usar:

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

Por ejemplo, cuando los archivos de recursos (por ejemplo, jaxb.properties) profundizan en los paquetes junto con las clases Java.


1

Si su archivo log4j.properties o log4j.xml no se encuentra en src / main / resources, use este PropertyConfigurator.configure ("log4j.xml");

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

0

Agregue el siguiente código de las etiquetas de recursos en su pom.xml dentro de las etiquetas de compilación. significa que las etiquetas de recursos deben estar dentro de las etiquetas de compilación en su pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.