Eclipse: log4j.xml'de log4j.dtd'ye başvurma


117

Şimdi uzunca bir süre log4j kullanıyorum ve ben genellikle log4j.xml üstündeki bu kullanmak (muhtemelen sadece diğerleri gibi ve Google'a göre bu bunu yapmanın yolu):

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

Açıkçası bu işe yarıyor, ancak Eclipse XML ve tümünü yazmak için içeriğe duyarlı yardımını sağlamıyor. Ayrıca, her zaman log4j.dtd. Şimdi bunu nasıl düzelteceğimi merak ediyorum.

Birkaç şey denedim ve bunlar işe yarıyor:

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

Yukarıdan da görebileceğiniz gibi Maven kullanıyoruz. Bu yüzden bunu denedim ama başarısız oldu:

<!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 genellikle sınıf yolu değişkenleriyle nasıl başa çıkılacağını bilir, ancak bu neden çalışmıyor? Referansın çalışma süresi boyunca çalışmayacağını biliyorum, ancak basit de log4j.dtd(yanılmıyorsam), bu yüzden bu bir sorun olmamalı.

Biri lütfen buna ışık tutabilir mi?

Yanıtlar:


176

Bu sorunun yanıtlandığını biliyorum, ancak biraz farklı bir alternatifim sunmak istiyorum:

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

@ FrVaBe'nin yanıtına benzer , ancak artı tarafta, daha fazla Eclipse yapılandırması gerektirmez (yani, projenizi başkalarıyla paylaşıyorsanız veya büyük bir ekibiniz varsa, endişelenmeniz gereken bir şey daha azdır).

Olumsuz tarafı, bunun bir İnternet bağlantısına ihtiyacınız olacağı anlamına geldiğine inanıyorum (en azından geliştirme sırasında bir noktada, sadece bir kez olsa bile).


dtd dosyasının fiziksel konumuyla uğraşmak zorunda olmadığınız için bu yaklaşım kabul edilen yanıttan daha iyidir. Bu, projenizi diğer geliştiricilerle paylaşırken yardımcı olur.
aslar.

1
İlginç. Şimdi log4j 2.0 için dtd bulmalıyım - ne acı - özellik dosyamın konfigürasyonu geri geldi!
Martin

8
Son zamanlarda bazen bu çalışmayı durdurdu. Logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/… için bir tarayıcıya girerseniz, şimdi bir xml hatası olduğunu göreceksiniz
Kip

@Kip haklısın, bağlantı çalışmıyor. Buradaki herhangi biriyle güncellenmiş bir bağlantınız var mı?
mannedear

Bağlantıyı curl ile kontrol ettim ve tam bir DTD döndürdü. Bir tarayıcıda bakmaya çalışırsam, hata veriyor. Curl gibi bir araçla kontrol etmenizi öneririm.
John Yeary

41

Log4j.dtd'yi "Tercihler -> XML -> XML Kataloğu" nda Kullanıcıya Özel URI XML Katalog Girişi olarak eklemeyi deneyin. Bildiğim gibi burası, eclipse'in tanım / doğrulama dosyalarına (xsd gibi) referansları yönettiği yerdir. Burada bulunabilirlerse, tutulmanın onlara yerel (web) konumlarından erişmek için internet erişimine ihtiyacı yoktur.

Böyle yaptım (test için) ve tutulma şikayet etmiyor:

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

Belki $ {M2_REPO} da işe yarıyor - bunu kontrol etmedim.

Daha sonra log4j.xml dosyanızda yerel URL'yi kullanın

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

DÜZENLE

Yukarıdaki çözüme devam ederdim, ancak sorunuza geri dönersek, sınıf yolu değişkenlerinin 'bir Java Derleme Yolunda kullanılabilir' olduğunu düşünüyorum . Neden bir DOCTYPE tanımı içinde çalışmalılar? Log4j.xml dosyasını "Doğrula" (tutulma bağlam menüsü) ve yolun çözülemediğine dair bir uyarı alırsınız.

classpath:org/apache/log4j/xml/log4j.dtdHile yapacağımı umuyordum ama bu protokol de desteklemiyor (bkz. Doğrulama hatası). Korkarım kutudan çıkmaz.

Ve anladığım gibi, SYSTEM "log4j.dtd"gösterim yer tutucu değil. Dtd'nin yanında bulunması beklenen bir belgeye geçerli bir referanstır (bu durumda).


Ne dediğini anlıyorum, ama bu genel bir mülk gibi görünüyor. Ancak, farklı projelerimiz var (bazıları Maven projeleri bile yok) ve bunlar log4j'nin farklı sürümlerini kullanıyor. Yapılandırmayı projeye bir şekilde bağlarsam harika olur.
sjngm

Log4j'nin farklı sürümlerini söylerseniz - log4j.dtd'nin farklı sürümlerini mi kastediyorsunuz? Bundan sonra her sürüm için bir Katalog girişi tanımlamanız gerekir. Yapılandırmayı projeye bağlamak istiyorsanız, log4j.dtd'yi log4j.xml'nin yanına (projenin içinde) yerleştirmek en iyisi olabilir ve <code> SYSTEM "log4j.dtd" </code> çalışmalıdır (I umut).
FrVaBe

Üzgünüm, log4j.jarbir bütün olarak farklı bir versiyonunu kastetmiştim . "Log4j.dtd" nin genel bir isim olduğu için bir tür yer tutucu olduğunu varsayıyorum. - Evet, log4j.dtd dosyasını XML'in yanına kopyalamak bir çözüm olabilir, ancak bu gerçekten bunu yapmanın yaygın bir yolu mu?
sjngm

1
Ve lütfen burada ana soruyu hedeflemeyen bir çözümden bahsettiğimizi unutmayın.
sjngm

Maalesef http referansının işe yaradığını fark etmedim - bunun en iyi çözüm olduğunu düşünüyorum - ya da ifadeniz için verilen referans SYSTEM "log4j.dtd" , bunu yapmanın yolu .
FrVaBe

2

Web içeriğine DTD klasörünü ekledim ve ardından log4j dtd dosyasını bunun içine kopyaladım. sonra feryat gibi denedim. İşe yarıyor

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

Yol burada aşağıdaki gibi proje yolu anlamına gelir /projectname


1

FrVaBe'nin cevabıyla denedim ama benim için işe yaramadı ve Anahtar değerinde küçük bir değişiklik yaptım ve işe yarıyor.

"Tercihler -> XML -> XML Kataloğu"

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

1

@Jack Leow , PUBLIC ID ile iyi bir yaklaşım kullanıyor. Yine de işaret ettiği gibi, bir ağ bağlantısı gerektiriyor.

Bir kombinasyonu tercih ederim:

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

Bu, yerel bir JAR'a başvurur ve tam URL olmadan bir DOCTYPE bildirimini destekler.

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

-1

Eclipse genellikle log4j.dtdsınıf yolunda arar ve onu orada bulmaz ve dolayısıyla hata. log4j.dtdAşağıdaki gibi bir dosya için URL sağlayarak bu sorunu çözebiliriz .

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

1
Sorumda denediğim şeyin tam bir kopyası.
sjngm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.