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


117

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

<!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(私が間違っていなければ)単純なこともできないので、問題にはなりません。

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

回答:


176

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

<!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つ少なくなります)。

ただし、欠点は、インターネット接続が必要になることを意味すると私は考えています(少なくとも、開発中のある時点で、たとえそれが一度でも)。


このアプローチは、dtdファイルの物理的な場所を処理する必要がないため、受け入れられた回答よりも優れています。これは、プロジェクトを他の開発者と共有するときに役立ちます。
エース。

1
面白い。ここで、log4j 2.0のdtdを見つける必要があります—どんな苦痛—私のプロパティファイルの構成を元に戻す必要があります。
マーティン

8
最近、これは機能しなくなりました。ブラウザでlogging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/にアクセスすると、XMLエラーが表示されます
Kip

@Kipあなたは正しい、リンクが機能していません。ここにいる誰かと更新されたリンクを手に入れましたか?
mannedear '20

curlでリンクを確認したところ、完全なDTDが返されました。ブラウザで見ようとすると、エラーが返されます。curlなどのツールで確認することをお勧めします。
John Yeary

41

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

私はそれを(テストのために)このようにしました、そして日食は文句を言いません:

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ビルドパスで使用できますと思います。なぜDOCTYPE定義内で機能する必要があるのですか?「検証」(Eclipseコンテキストメニュー)log4j.xmlファイルとパスを解決できないという警告が表示されます。

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

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


あなたの言っていることはわかりますが、これは全体的な性質のようです。ただし、私たちにはさまざまなプロジェクト(Mavenプロジェクトさえもいくつか)があり、それらは異なるバージョンのlog4jを使用しています。構成をプロジェクトにいくらかバインドできればすばらしいと思います。
sjngm

異なるバージョンのlog4jと言う場合-異なるバージョンのlog4j.dtdを意味しますか?バージョンごとにカタログエントリを定義する必要があります。構成をプロジェクトにバインドしたい場合は、log4j.dtdをlog4j.xmlの隣(プロジェクト内)に配置すると、<code> SYSTEM "log4j.dtd" </ code>が機能する(I望む)。
FrVaBe 2011

申し訳ありませんが、log4j.jar全体としての異なるバージョンを意味しました。「log4j.dtd」は一般的な名前なので、ある種のプレースホルダーだと思います。-はい、XMLの隣にlog4j.dtdをコピーすることで解決できますが、これは本当に一般的な方法ですか?
sjngm

1
ここでは、主要な質問を対象としないソリューションについて話していることに注意してください。
sjngm

申し訳ありませんが、HTTP参照が働いたことはないの通知をしなかった-私はそれが最善の解決策だと思う-またはあなたの文のpleace所定の基準は、SYSTEM "log4j.dtd" それを行う方法です
FrVaBe 2011

2

webcontentにDTDフォルダーを追加し、その中にlog4j dtdファイルをコピーしました。それから私は怒鳴りつけてみました。その働き

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

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


1

私はFrVaBeの答えを試してみましたが、うまくいきませんでした。キーを少し変更しました値を、それが動作します。

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

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

1

@ジャック・リューは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

通常、Eclipseはlog4j.dtdクラスパスを探しますが、そこでは見つからないため、エラーが発生します。log4j.dtd以下のようなファイルのURLを提供することで、この問題を解決できます。

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

1
それは私が私の質問で試したものの正確なコピーです。
sjngm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.