web-dev-qa-db-ja.com

Eclipse:log4j.xmlでlog4j.dtdを参照する

私はかなり長い間log4jを使用していますが、通常はlog4j.xmlの上部でこれを使用します(おそらく他の多くのものと同じように、Googleによればこれはthe方法です):

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

明らかにこれは機能していますが、EclipseはXMLを記述するための状況依存ヘルプを提供していません。さらに、log4j.dtdが見つからないという警告が常に表示されます。今、私はこれを修正する方法に興味があります。

私はいくつかのことを試しましたが、これらの作業は次のとおりです。

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

上からわかるように、Mavenを使用しています。したがって、私はこれを試しましたが、失敗します:

<!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は通常、クラスパス変数の処理方法を知っていますが、なぜこれが機能しないのですか?参照は実行中に機能しないことは知っていますが、単純なlog4j.dtd(私が間違っていなければ)も機能しないので、それは問題になりません。

誰もこれに光を当てることができますか?

112
sjngm

私はこの質問に回答したことは知っていますが、少し異なる選択肢を提供したいと思います。

<!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の応答 に似ていますが、プラス側では、Eclipseの追加の構成は必要ありません(つまり、プロジェクトを他の人と共有している場合、または大規模なチームがある場合、1つ少ない心配すること)。

ただし、マイナス面は、インターネット接続が必要になることを意味するということです(少なくとも1回だけの場合でも、開発中のある時点で)。

169
Jack Leow

「設定-> XML-> XMLカタログ」で、log4j.dtdをユーザー固有のURI XMLカタログエントリとして追加してみてください。私が知っているように、これはEclipseが定義/検証ファイル(xsdなど)への参照を管理する場所です。ここでそれらを見つけることができれば、Eclipseはネイティブ(ウェブ)ロケーションでそれらにアクセスするためにインターネットアクセスを必要としません。

私はこれを(テストのために)やりましたが、Eclipseは文句を言いません:

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

たぶん$ {M2_REPO}も動作する-これをチェックしなかった。

その後、log4j.xmlでネイティブURLを使用します

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

編集

上記のソリューションを使用しますが、質問に戻って、クラスパス変数 'Java Build Path'で使用できます ' と思います。なぜDOCTYPE定義内で動作するのですか? log4j.xmlファイルを「検証」(Eclipseコンテキストメニュー)すると、パスを解決できないという警告が表示されます。

classpath:org/Apache/log4j/xml/log4j.dtdがうまくいくと思いますが、そのプロトコルもサポートされていません(検証エラーを参照)。私はそれが箱から出して動作しないことを恐れています。

そして、理解したように、SYSTEM "log4j.dtd"表記はプレースホルダーではありません。これは、dtd(この場合)の横にあると予想されるドキュメントへの有効な参照です。

39
FrVaBe

WebcontentにDTDフォルダーを追加し、その中にlog4j dtdファイルをコピーしました。それから私は怒鳴るように試しました。その働き

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

ここでのパスとは、/projectnameのようなプロジェクトパスを意味します

2
Dileep

FrVaBeの答えを試してみましたが、うまくいきませんでした。Keyの値を少し変更すると動作します。

「設定-> XML-> XMLカタログ」

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

@ Jack Leow は、PUBLIC IDで適切なアプローチを使用します。しかし、彼が指摘するように、ネットワーク接続が必要です。

私は組み合わせを好む:

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

これはローカルJARを参照し、完全なURLなしのDOCTYPE宣言をサポートします。

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