Eclipse: referenciando log4j.dtd em log4j.xml

117

Eu uso o log4j há um bom tempo e geralmente o uso no topo do log4j.xml (provavelmente como muitos outros e de acordo com o Google, esta é a maneira de se fazer):

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

Obviamente, isso está funcionando, no entanto, o Eclipse não fornece sua ajuda contextual para escrever o XML e tudo. Além disso, sempre mostra um aviso de que não encontra o log4j.dtd. Agora estou curioso para saber como consertar isso.

Tentei algumas coisas e estas funcionam:

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

Como você pode ver acima, estamos usando o Maven. Portanto, tentei fazer isso, mas não deu certo:

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

O Eclipse geralmente sabe como lidar com as variáveis ​​do caminho de classe, mas por que isso não funciona? Eu sei que a referência não funcionará durante o tempo de execução, mas nem um simples log4j.dtd(se não estou errado), então isso não deve ser um problema.

Alguém pode, por favor, lançar uma luz sobre isso?

sjngm
fonte

Respostas:

176

Sei que esta pergunta foi respondida, mas gostaria de fornecer minha alternativa ligeiramente diferente:

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

É semelhante à resposta de @FrVaBe , mas pelo lado positivo, não requer nenhuma configuração adicional do Eclipse (ou seja, se você estiver compartilhando seu projeto com outras pessoas ou tiver uma equipe grande, é uma coisa a menos com que se preocupar).

A desvantagem, porém, é que acredito que isso significa que você precisará de uma conexão com a Internet (pelo menos em algum ponto durante o desenvolvimento, mesmo que seja apenas uma vez).

Jack Leow
fonte
essa abordagem é melhor do que a resposta aceita, já que você não precisa lidar com a localização física do arquivo dtd. Isso ajuda ao compartilhar seu projeto com outros desenvolvedores.
ases.
1
Interessante. Agora eu tenho que encontrar o dtd para log4j 2.0 - que dor - qual é a configuração do meu arquivo de propriedades de volta!
Martin,
8
recentemente, isso parou de funcionar. Se você for em um navegador para logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… você verá que agora há um erro xml
Kip
@Kip você está certo, o link não está funcionando. Tem algum link atualizado com alguém aqui?
mannedear
Verifiquei o link com curl e ele retornou um DTD completo. Se eu tentar examiná-lo em um navegador, ele retornará erros. Eu sugeriria verificar com uma ferramenta como o curl.
John Yeary
41

Tente adicionar o log4j.dtd como uma entrada de catálogo XML URI específico do usuário em "Preferências -> XML -> Catálogo XML". Como eu sei, este é o lugar onde o eclipse gerencia as referências aos arquivos de definição / validação (como xsd). Se eles podem ser encontrados aqui, o eclipse não precisa de acesso à Internet para acessá-los em seu local nativo (web).

Fiz assim (para teste) e o eclipse não reclama:

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

Talvez $ {M2_REPO} também funcione - eu não verifiquei isso.

Use o URL nativo em seu log4j.xml depois

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

EDITAR

Eu escolheria a solução acima, mas voltando à sua pergunta, acho que as variáveis ​​de caminho de classe 'podem ser usadas em um caminho de construção Java' . Por que eles deveriam trabalhar dentro de uma definição DOCTYPE? "Valide" (menu de contexto do eclipse) o arquivo log4j.xml e você receberá um aviso de que o caminho não pode ser resolvido.

Eu esperava classpath:org/apache/log4j/xml/log4j.dtdque desse certo, mas esse protocolo também não é compatível (consulte o erro de validação). Receio que não funcione fora da caixa.

E, como eu entendi, a SYSTEM "log4j.dtd"notação não é um espaço reservado. É uma referência válida a um documento que se espera encontrar ao lado do dtd (neste caso).

FrVaBe
fonte
Eu vejo o que você está dizendo, mas esta parece ser uma propriedade geral. No entanto, temos projetos diferentes (alguns nem mesmo projetos Maven) e eles usam versões diferentes do log4j. Seria ótimo se eu pudesse vincular a configuração ao projeto.
sjngm de
Se você disser versões diferentes de log4j - você quer dizer versões diferentes de log4j.dtd? Depois, você deve definir uma entrada no Catálogo para cada versão. Se você deseja vincular a configuração ao projeto, pode ser melhor colocar o log4j.dtd próximo ao log4j.xml (dentro do projeto) e então <code> SYSTEM "log4j.dtd" </code> deve funcionar (I esperança).
FrVaBe de
Desculpe, eu quis dizer uma versão diferente do log4j.jarcomo um todo. Presumo que "log4j.dtd" seja algum tipo de marcador, pois é um nome tão geral. - Sim, copiar o log4j.dtd ao lado do XML seria uma solução, mas essa é realmente uma maneira comum de fazer isso?
sjngm de
1
E, por favor, note que estamos falando de uma solução aqui que não tem como alvo a questão principal.
sjngm de
Desculpe não ter percebido que a referência http funcionou - acho que é a melhor solução - ou pleace a referência dada pelo seu depoimento SYSTEM "log4j.dtd" é a forma de fazê-lo .
FrVaBe de
2

Eu adicionei a pasta DTD no webcontent e copiei o arquivo log4j dtd nela. então eu tentei como abaixo. Está funcionando

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

Caminho significa aqui o caminho do projeto como /projectname

Dileep
fonte
1

Eu tentei com a resposta de FrVaBe, mas não funcionou para mim e fiz uma pequena alteração no valor da chave e funciona.

"Preferências -> XML -> Catálogo XML"

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

@Jack Leow usa uma boa abordagem com o ID PÚBLICO. No entanto, como ele aponta, requer uma conexão de rede.

Eu prefiro uma combinação:

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

Isso faz referência a um JAR local e oferece suporte a uma declaração DOCTYPE sem o URL completo.

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

Normalmente, o Eclipse procura log4j.dtdno classpath e não o encontra lá e, portanto, o erro. Podemos resolver esse problema fornecendo o URL do log4j.dtdarquivo como abaixo.

<!DOCTYPE log4j:configuration SYSTEM 
      "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
Nirbhay Rana
fonte
1
Essa é uma cópia exata do que tentei na minha pergunta.
sjngm