Se usi Maven, di solito metti log4j.properties sotto java o risorse?


128

Dove devo inserire il file log4j.properties quando utilizzo le directory Maven convenzionali?


6
src / test / resources - il consumatore del tuo artefatto imposterà i livelli di registrazione richiesti per la distribuzione. Consiglierei comunque slf4j se lo stai facendo per lavoro commerciale. Ciò offre la possibilità di cambiare i framework di registrazione durante la distribuzione. slf4j.org
David Victor,

2
A proposito, se si desidera solo sperimentare è possibile utilizzare log4j senza un file di configurazione properties / xml. Da " logging.apache.org/log4j/1.2/manual.html - Configurazione" "L'invocazione del metodo BasicConfigurator.configure crea una configurazione log4j piuttosto semplice." Vedi anche: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/...
David Victor

Risposte:


141

src/main/resources è il "posizionamento standard" per questo.

Aggiornamento: quanto sopra risponde alla domanda, ma non è la soluzione migliore. Controlla le altre risposte e i commenti su questo ... probabilmente non spediresti le tue proprietà di registrazione con il jar ma invece le lasceresti al client (ad esempio app-server, ambiente di stage, ecc.) Per configurare la registrazione desiderata. Pertanto, inserirla src/test/resourcesè la mia soluzione preferita.

Nota: a proposito di lasciare la configurazione del registro concreto al client / utente, dovresti prendere in considerazione la sostituzione log4jcon slf4jnella tua app.


Non ho trovato nessuna directory diretta da creare. Devo farlo manualmente?
user496949,

3
Sì. Creare manualmente resourcese log4j.propertiesnella cartella indicata nella risposta.
Nishant,

@ user496949: i file sotto src/main/resourcesverranno copiati per impostazione predefinita intarget/classes
splash

17
A meno che tu non intenda esportare le tue impostazioni log4j come parte del tuo artefatto - è molto meglio metterlo sotto src / test / resources
David Victor,

1
@FerasOdeh per escluderlo dagli artefatti generati (vasetti, guerre, ecc.) Ed essere utilizzato solo durante il test, "A meno che tu non intenda esportare le tue impostazioni log4j come parte del tuo artefatto".
Ali Shakiba,

60

Basta metterlo dentro src/main/resourceslo impacchetterà all'interno del manufatto. Ad esempio, se il tuo artefatto è un JAR, avrai il log4j.propertiesfile al suo interno, perdendo il punto iniziale di rendere configurabile la registrazione.

Di solito lo inserisco src/main/resourcese lo imposto in modo che venga emesso come target in questo modo:

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

Inoltre, affinché log4j possa effettivamente vederlo, è necessario aggiungere la directory di output al percorso della classe. Se il tuo artefatto è un JAR eseguibile, probabilmente hai usato il plugin maven-assembly per crearlo. All'interno di quel plug-in, è possibile aggiungere la cartella corrente del JAR al percorso della classe aggiungendo una Class-Pathvoce manifest in questo modo:

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

Ora il file log4j.properties sarà proprio accanto al tuo file JAR, configurabile indipendentemente.

Per eseguire l'applicazione direttamente da Eclipse, aggiungi la resourcesdirectory al tuo percorso di classe nella configurazione della corsa: Run->Run Configurations...->Java Application->Newseleziona la Classpathscheda, seleziona Advancede naviga nella tua src/resourcesdirectory.


2
un'altra opzione potrebbe essere quella di metterlo in src / test / resources in modo che non venga raggruppato.
rogerdpack,

Wow. Grazie per quello Questo era proprio quello di cui avevo bisogno!
blissfool,

@ Zoltán, trovo difficile aggiungere la directory di output al percorso di classe come mi hai consigliato. C'è un modo in cui posso farlo manualmente, come andare nel file .classpath del particolare progetto e aggiungere lì questa directory di output log4j in modo che log4j possa vedere il file .properties dopo che l'app è stata raggruppata in un file .war. Inoltre, il tag targetPath, il valore deve essere usato così com'è ${project.build.directory}o deve essere modificato nel percorso effettivo del progetto nel mio disco locale?
Ireti,

26

Alcuni account di "data mining" rappresentano src/main/resourcesil luogo tipico.

Risultati su Ricerca codice Google :

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

4
in che modo questa risposta differisce sotto ogni aspetto rispetto a quella a cui ha risposto 20 minuti fa? Inoltre, non lo resourcesè resource, se ricordo bene.
Nishant,

6
@Nishant: non è diverso, perché quando ho aperto la casella di risposta ho lasciato il PC. Dopo essere tornato e aver risposto alla domanda, ho perso la risposta. resourceera solo un errore di battitura.
splash il

1
Suggerirei di leggere qualcosa su maven, il plugin del compilatore maven, le convenzioni per il layout dei progetti maven. Magari guarda cosa succede sotto 'target' quando il tuo artefatto viene costruito. Quindi forse potresti modificare la tua risposta.
David Victor,

4
La risposta corretta è src / xxx / resources - non è una convenzione. Vedi: maven.apache.org/plugins/maven-resources-plugin/examples/… - qui 'xxx' può essere 'main' o 'test'. A meno che non si desideri fornire livelli di registrazione preconfigurati, è generalmente più saggio configurare la registrazione come richiesto per i test - tramite 'src / test / risorse' - e consentire al consumatore del proprio artefatto di impostare il livello di registrazione.
David Victor,

22
Risultati di Google per "Saltare da un ponte": 18.200.000. Risultati di Google per "Non saltare da un ponte": 137.000
djjeck l'

9

Le risorse utilizzate per inizializzare il progetto sono preferibilmente inserite nella cartella src / main / resources . Per abilitare il caricamento di queste risorse durante la compilazione, è possibile semplicemente aggiungere voci nel progetto pom.xml nel progetto maven come risorsa di compilazione

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

Altri file .properties possono anche essere conservati in questa cartella utilizzata per l'inizializzazione. Il filtro è impostato su true se si desidera avere alcune variabili nei file delle proprietà della cartella delle risorse e popolarle dai file delle proprietà dei filtri del profilo, che sono mantenuti in src / main / filters che è impostato come profili ma è un caso d'uso completamente diverso . Per ora, puoi ignorarli.

Questo è un ottimo plugin per risorse maven , è utile, basta sfogliare anche altre sezioni.


Se hai appena copiato e incollato lo snippet sopra menzionato, tieni presente che è </resources> </build>
rdesilva,

6

Quando si inseriscono file di risorse in un'altra posizione non è la soluzione migliore che è possibile utilizzare:

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

Ad esempio, quando i file di risorse (ad esempio jaxb.properties) vanno in profondità all'interno dei pacchetti insieme alle classi Java.


1

Se il tuo file log4j.properties o log4j.xml non trovato in src / main / resources usa questo PropertyConfigurator.configure ("log4j.xml");

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

0

Aggiungi il codice seguente dai tag delle risorse nel tuo pom.xml all'interno dei tag build. quindi significa che i tag delle risorse devono trovarsi all'interno dei tag di compilazione in pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.