Agregue un archivo de propiedades a la ruta de clases de IntelliJ


122

Estoy ejecutando un programa Java simple desde IntelliJ IDE usando el menú Ejecutar-> Ejecutar. Funciona bien. Ahora quiero agregar el registro log4j.

Agregué una carpeta de recursos en la raíz de mi proyecto. Agregué un archivo log4j.properties en esa carpeta. Cambié el código para registrar algo.

¿Cuál es la forma correcta de decirle a IntelliJ que incluya la carpeta de recursos en la ruta de clase para que se vea el archivo de propiedades?

Con IntelliJ 8 podía adivinar como un mono borracho y, finalmente, hacer que funcionara. Ahora tengo 9 y no tengo éxito. Lo he intentado durante una hora. ¿Qué tal una opción "Agregar a classpath" en alguna parte? / fume / vent / despotricar


Ok, la situación está resuelta. Esta es una nueva instalación de IntelliJ - log4J NO está incluido por defecto. En mi código había importado el registrador de valores, no log4j. El registrador de valores admite métodos similares, por lo que no era obvio que estaba usando el registrador incorrecto. No es de extrañar por qué no estaba leyendo el archivo de propiedades de log4j o informando que necesitaba configurar log4j. ¡Qué patada en los dientes!
Tony Ennis

Encontré una buena descripción para un principiante de log4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Respuestas:


91

Prueba esto:

  • Vaya a Estructura del proyecto.
  • Seleccione su módulo.
  • Busque la carpeta en el árbol de la derecha y selecciónela.
  • Haga clic en el botón Fuentes encima de ese árbol (con la carpeta azul) para convertir esa carpeta en una carpeta de fuentes.

Lo he hecho unas 50 veces, simplemente lo hice de nuevo. Mi salida no cambia a pesar de que cambié el patrón de conversión de diseño a algo que hubiera sido obvio. Me pregunto si hay otro log4j.properties en mi classpath.
Tony Ennis

29
Verifique los patrones de recursos en la configuración del compilador. Compruebe que "? *. Properties" esté allí. Está ahí por defecto, pero esa es la única otra cosa que se me ocurre.
ColinD

3
Alternativa al botón Fuentes: haga clic con el botón derecho en cualquier directorio que haya creado y seleccione "Marcar directorio como": "Raíz de origen"
mschr

10
Tenga en cuenta que si creó su proyecto a partir de un POM de Maven, en lugar de una estructura de origen ad-hoc, esta solución no funcionará. En su lugar, debe agregar ese directorio como un recurso al POM. Vea la respuesta de Peter Thygesen.
lreeder

También se puede hacer mediante programación a través de PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D

47

En realidad, tiene al menos 2 formas de hacerlo, la primera forma la describe ColinD, simplemente configure la carpeta "recursos" como carpeta de fuentes en IDEA. Si los Patrones de recursos contienen la extensión de su recurso, entonces se copiará al directorio de salida cuando haga que el proyecto y el directorio de salida sea automáticamente una ruta de clase de su aplicación.

Otra forma común es agregar la carpeta "recursos" a la ruta de clases directamente. Ir a Estructura del proyecto | Módulos | Su módulo | Dependencias , haga clic en Agregar , Biblioteca de módulos de entrada única , especifique la ruta a la carpeta "recursos".

Otra solución más sería colocar el archivo log4j.properties directamente debajo de la raíz de origen de su proyecto (en el directorio de paquetes predeterminado). Es lo mismo que la primera forma, excepto que no necesita agregar otra raíz de origen en la configuración de Rutas de módulo , el archivo se copiará en el directorio de salida en Make.

Si desea probar con diferentes configuraciones de log4j, puede ser más fácil especificar un archivo de configuración personalizado directamente en la configuración Ejecutar / Depurar , los parámetros de VM presentados como:

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


He cumplido vuestro párrafo 2 y 3 sin ningún efecto. Estoy seguro de que las sugerencias funcionan , es solo que no tuvieron ningún efecto: se comporta como si hubiera otro archivo log4j.properties en la ruta de clase. Pero no puedo verlo por ningún lado. Si elimino mi archivo de propiedades log4j por completo, no obtengo la advertencia "debe configurar log4j" en la consola. Estoy usando IntelliJ gratuito (y la versión 9.x) por primera vez, así que tal vez tenga algo que ver con eso.
Tony Ennis

1
El uso del parámetro explícito -D VM tampoco tuvo ningún efecto. En este punto, solo puedo suponer que me caí de la cima del 'árbol estúpido' y golpeé todas las ramas en el camino. Creo que iré a buscar en JetBrains y preguntaré ...
Tony Ennis

¿Podría enviar el proyecto de muestra con los pasos exactos para reproducir el problema a support@jetbrains.com?
CrazyCoder

Estaba pasando -Dlog4j.configuration = file: / c: /log4j.properties en los argumentos del programa. Los parámetros de VM me sirvieron.
Ajak6

42

Tengo el mismo problema y me molesta tremendamente !!

Siempre pensé que se suponía que debía hacer la respuesta 2. Eso solía funcionar en Intellij 9 (ahora usando 10).

Sin embargo, descubrí que agregar estas líneas a mi archivo pom de maven ayuda:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>

Ese era el problema exacto que estaba teniendo, ahora los archivos de recursos se copian correctamente en la carpeta de salida.
artjomka

Esta respuesta realmente funciona. También he hecho lo que ColinD sugirió en sus comentarios. Gracias.

Gracias, esta es la única solución que funcionó para mí.
Minh Thiện

18

Pasé bastante tiempo averiguando cómo hacer esto en Intellij 13x. Al parecer, nunca agregué los archivos de propiedades a los artefactos que los requerían, lo cual es un paso separado en Intellij. La configuración a continuación también funciona cuando tiene un archivo de propiedades compartido por varios módulos.

  • Vaya a la configuración de su proyecto (CTRL + ALT + SHIFT + S)
  • En la lista, seleccione el módulo al que desea agregar uno o más archivos de propiedades.
  • A la derecha, seleccione la pestaña Dependencias.
  • Haga clic en el signo más verde y seleccione "Frascos o directorios".
  • Ahora seleccione la carpeta que contiene los archivos de propiedades. (No he intentado incluir un archivo individual)
  • Intellij ahora le preguntará cuál es la "categoría" del archivo seleccionado. Elija "clases" (aunque no lo sean).
  • Ahora debe agregar los archivos de propiedades al artefacto. Intellij le dará el atajo que se muestra a continuación. Mostrará errores en la parte roja en la parte inferior y una 'bombilla roja' que cuando se hace clic muestra una opción para agregar los archivos al artefacto. También puede ir a la sección 'artefactos' y agregar los archivos a los artefactos manualmente.

ingrese la descripción de la imagen aquí


14

Enfrenté un desafío similar al agregar archivos con extensiones .ini a la ruta de clases. Encontré esta respuesta , que es agregarla a Preferencias -> Compilador -> Patrones de recursos -> [...]; *. Ini


1
este era el problema exacto que estaba teniendo con los archivos .conf
James

Pensé ¿qué diablos está mal con mi código? Gracias por esta solución
Shoaib Chikate

5

Si alguna vez termina con el mismo problema con Scala y SBT:

  • Vaya a Estructura del proyecto. El atajo es (CTRL + ALT + MAYÚS + S)

  • En la lista del extremo izquierdo, elija Configuración del proyecto> Módulos

  • En la lista de módulos a la derecha, seleccione el módulo del nombre de su proyecto (sin la compilación) y elija la pestaña de fuentes

  • En el medio, expanda la carpeta que la raíz de su proyecto para mí es /home/<username>/IdeaProjects/<projectName>

  • Mire la sección Raíz de contenido en el lado derecho, las rutas rojas son directorios que no ha creado. Querrá poner el archivo de propiedades en un directorio de Recursos. Así que creé src/main/resourcesy puse log4j.properties en él. Creo que también puedes modificar Content Root para ponerlo donde quieras (yo no hice esto).

  • Ejecuté mi código con una configuración SBT y encontré mi archivo log4j.properties.

ingrese la descripción de la imagen aquí


2

Para aquellos de ustedes que migren de Eclipse a IntelliJ o al revés, aquí hay un consejo cuando trabajen con archivos de propiedades u otros archivos de recursos.

Es enloquecedor (me costó toda una noche averiguarlo) pero ambos IDE funcionan de manera bastante diferente cuando se trata de buscar archivos de recursos / propiedades cuando desea ejecutar localmente desde su IDE o durante la depuración. (El empaquetado en un .jar también es bastante diferente, pero eso está mejor documentado).

Suponga que tiene una referencia de ruta relativa como esta en su código:

new FileInputStream("xxxx.properties");

(lo cual es conveniente si trabaja con archivos .properties específicos de env que no desea empaquetar junto con su JAR)

INTELLIJ

(Yo uso 13.1, pero podría ser válido para más versiones)

El archivo xxxx.properties debe estar en el directorio PADRE del proyecto ROOT para poder ser recogido en tiempo de ejecución como este en IntelliJ. (El proyecto ROOT es donde reside la carpeta / src)

ECLIPSE

Eclipse está feliz cuando el archivo xxxx.properties está en el proyecto ROOT.

¡Entonces IntelliJ espera que el archivo .properties sea 1 nivel más alto que Eclipse cuando se hace referencia a él de esta manera!

Esto también afecta la forma en que tiene que ejecutar su código cuando tiene esta misma línea de código (nuevo FileInputStream ("xxxx.properties");) en su .jar exportado. Cuando quiera ser ágil y no quiera empaquetar el archivo .properties con su jar, tendrá que ejecutar el jar como se muestra a continuación para hacer referencia al archivo .properties correctamente desde la línea de comando:

TARRO EXPORTADO INTELLIJ

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

TARRO ECLIPSE EXPORTADO

java -jar some.jar

donde el archivo ejecutable exportado de Eclipse solo esperará que el archivo .properties al que se hace referencia esté en la misma ubicación que donde está el archivo .jar


Sí, logging.properties, a diferencia de log4j2.xml o log4j.properties, se debe encontrar en la raíz del módulo IntelliJ. Además, a diferencia de Log4j, que simplemente funciona, descubrí que todavía tenía que montar un jurado para ejecutar dentro de IntelliJ (Eclipse sería la misma historia, esto es culpa del registro de Java), consulte stackoverflow.com/questions/960099/… . Una alternativa sería arreglar la configuración de ejecución / depuración con -Djava.util.logging.config.file =, que encuentro bastante inconveniente ya que prefiero tener la configuración en el código o en un archivo de propiedades esperado.
Russ Bateman

1

Quizás esto esté un poco fuera de tema, ya que la pregunta ya ha sido respondida, pero he experimentado un problema similar. En mi caso, solo algunos de los recursos de prueba unitaria se copiaron en la carpeta de salida durante la compilación. Mi persistence.xml en la carpeta META-INF se copió pero nada más .

Al final, "resolví" el problema cambiando el nombre de los archivos problemáticos, reconstruyendo el proyecto y luego cambiando los nombres de los archivos por los originales. No me pregunten por qué funcionó, pero funcionó. Mi mejor suposición es que, de alguna manera, mi proyecto IntelliJ se había desincronizado un poco con el sistema de archivos y la operación de cambio de nombre provocó algún tipo de "reexploración de recursos" interna.


1

Este es uno de los errores tontos que he cometido. Pasé mucho tiempo tratando de solucionar este problema y probé todas las respuestas publicadas anteriormente, pero al final, fue uno de mis muchos errores tontos.

Estaba usando org.apache.logging.log4j.Logger(: fml :) mientras que debería haber usado org.apache.log4j.Logger. Usar este registrador correcto me salvó la noche.


0

Tuve un problema similar con un archivo log4j.xml para una prueba unitaria, hice todo lo anterior. Pero descubrí que era porque solo estaba volviendo a ejecutar una prueba fallida ... si vuelvo a ejecutar toda la clase de prueba, se recoge el archivo correcto. Esto está bajo Intelli-j 9.0.4

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.