Eclipse: riferimento a log4j.dtd in log4j.xml


117

Uso log4j da un po 'di tempo ormai e di solito lo uso all'inizio di log4j.xml (probabilmente proprio come molti altri e secondo Google questo è il modo per farlo):

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

Ovviamente questo funziona, tuttavia Eclipse non fornisce la sua guida sensibile al contesto per la scrittura dell'XML e tutto il resto. Inoltre, mostra sempre un avviso che non trova il file log4j.dtd. Ora sono curioso di sapere come risolvere questo problema.

Ho provato alcune cose e queste funzionano:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:/path/.m2/repository/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

Come puoi vedere dall'alto stiamo usando Maven. Pertanto, ho provato questo, ma non riesce:

<!DOCTYPE log4j:configuration SYSTEM "jar:file:${M2_REPO}/log4j/log4j/1.2.14/log4j-1.2.14.jar!/org/apache/log4j/xml/log4j.dtd">

Eclipse di solito sa come gestire le variabili classpath, ma perché non funziona? So che il riferimento non funzionerà durante il runtime, ma nemmeno un semplice log4j.dtd(se non sbaglio), quindi non dovrebbe essere un problema.

Qualcuno può far luce su questo?

Risposte:


176

So che questa domanda ha avuto risposta, ma vorrei fornire la mia alternativa leggermente diversa:

<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

È simile alla risposta di @ FrVaBe , ma il lato positivo non richiede alcuna ulteriore configurazione di Eclipse (cioè, se condividi il tuo progetto con altri o hai un team numeroso, è una cosa in meno di cui preoccuparsi).

Il lato negativo, però, è che credo significhi che avrai bisogno di una connessione Internet (almeno a un certo punto durante lo sviluppo, anche se è solo una volta).


questo approccio è migliore della risposta accettata, poiché non devi occuparti della posizione fisica del file dtd. Questo aiuta quando condividi il tuo progetto con altri sviluppatori.
assi.

1
Interessante. Ora devo trovare il dtd per log4j 2.0 - che dolore - qual è la mia configurazione del file delle proprietà!
Martin

8
qualche tempo recentemente questo ha smesso di funzionare. Se vai in un browser a logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… vedrai che ora c'è un errore xml
Kip

@Kip hai ragione, il link non funziona. Hai qualche collegamento aggiornato con qualcuno qui?
presidiato entro il

Ho controllato il collegamento con curl e ha restituito un DTD completo. Se ho provato a guardarlo in un browser, restituisce errori. Suggerirei di controllarlo con uno strumento come curl.
John Yeary,

41

Prova ad aggiungere log4j.dtd come voce di catalogo XML URI specifica dell'utente in "Preferenze -> XML -> Catalogo XML". Come so, questo è il luogo in cui eclipse gestisce i riferimenti ai file di definizione / convalida (come xsd). Se possono essere trovati qui, eclipse non necessita di accesso a Internet per accedervi nella loro posizione nativa (web).

L'ho fatto in questo modo (per test) ed eclipse non si lamenta:

Entry element:    URI
Location:         C:\Users\me\Desktop\log4j.dtd
URI:              file:///C:/Users/me/Desktop/log4j.dtd
Key type:         URI
Key:              http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd

Forse funziona anche $ {M2_REPO} - non l'ho controllato.

Successivamente, utilizza l'URL nativo nel tuo log4j.xml

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

MODIFICARE

Vorrei andare con la soluzione di cui sopra, ma per tornare alla tua domanda, penso che le variabili del percorso di classe "possano essere utilizzate in un percorso di build Java" . Perché dovrebbero lavorare all'interno di una definizione di DOCTYPE? "Convalida" (menu contestuale di eclipse) il file log4j.xml e riceverai un avviso che il percorso non può essere risolto.

Speravo classpath:org/apache/log4j/xml/log4j.dtdpotesse fare il trucco, ma anche quel protocollo non è supportato (vedi errore di convalida). Temo che non funzionerà fuori dagli schemi.

E, come ho capito, la SYSTEM "log4j.dtd"notazione non è un segnaposto. È un riferimento valido a un documento che dovrebbe essere trovato accanto al dtd (in questo caso).


Capisco cosa stai dicendo, ma questa sembra essere una proprietà generale. Tuttavia, abbiamo progetti diversi (alcuni nemmeno progetti Maven) e usano versioni diverse di log4j. Sarebbe fantastico se potessi legare in qualche modo la configurazione al progetto.
sjngm

Se dici versioni diverse di log4j, intendi versioni diverse di log4j.dtd? Quindi devi definire una voce di catalogo per ogni versione. Se vuoi associare la configurazione al progetto, potrebbe essere meglio posizionare log4j.dtd accanto a log4j.xml (all'interno del progetto) e allora <code> SYSTEM "log4j.dtd" </code> dovrebbe funzionare (I speranza).
FrVaBe

Scusa, intendevo una versione diversa del log4j.jarnel suo insieme. Presumo che "log4j.dtd" sia una sorta di segnaposto in quanto è un nome così generico. - Sì, copiare il log4j.dtd accanto all'XML sarebbe una soluzione, ma è davvero un modo comune per farlo?
sjngm

1
E tieni presente che stiamo parlando di una soluzione che non si rivolge alla domanda principale.
sjngm

Siamo spiacenti non ho notato che il riferimento http ha funzionato - penso che sia la soluzione migliore - o il riferimento fornito per la tua dichiarazione SYSTEM "log4j.dtd" è il modo per farlo .
FrVaBe

2

Ho aggiunto la cartella DTD in webcontent e poi ho copiato il file log4j dtd in quella. poi ho provato come muggito. Sta funzionando

<!DOCTYPE log4j:configuration SYSTEM "<Path>/DTD/log4j.dtd">

Percorso significa qui il percorso del progetto come /projectname


1

Ho provato con la risposta di FrVaBe ma non ha funzionato per me e ho apportato una piccola modifica alla chiave valore e funziona.

"Preferenze -> XML -> Catalogo XML"

Localization: C:\Users\me\Desktop\log4j.dtd
Key Type: URI
Key: -//APACHE//DTD LOG4J 1.2//EN

1

@Jack Leow usa un buon approccio con l'ID PUBBLICO. Tuttavia, come sottolinea, richiede una connessione di rete.

Preferisco una combinazione:

Entry element:      Public
Location:           org\apache\log4j\xml\log4j.dtd in jar file C:\Development\lib\external\apache-log4j-1.2.17\log4j-1.2.17.jar
URI:                jar:file:/C:/Development/lib/external/apache-log4j-1.2.17/log4j-1.2.17.jar!/org/apache/log4j/xml/log4j.dtd
Key type:           Public ID
Key:                -//APACHE//DTD LOG4J 1.2//EN

Fa riferimento a un JAR locale e supporta una dichiarazione DOCTYPE senza l'URL completo.

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">

-1

Di solito, Eclipse cerca log4j.dtdin classpath e non lo trova lì e quindi l'errore. Possiamo risolvere questo problema fornendo l'URL per il log4j.dtdfile come di seguito.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

1
Questa è una copia esatta di ciò che ho provato nella mia domanda.
sjngm
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.