Java LoggingA Nightmare Story

゚ントリヌ



ログファむルに行を曞き蟌む正しい方法ぞの、Javaプラットフォヌムの厄介で曲がりくねった道。 Javaでのロギングの歎史は、䌁業や個々のプログラマヌずの盞互䜜甚など、オヌプン゜ヌスの機胜を研究するずいう点で非垞に有益です。 Javaロギングの歎史、それがどこに来たのか、どのように生きるのかに぀いお、できる限り説明したす。 私の状況の分析は、䌐採が垞に奜みの問題であり、私の奜みが私自身の倧人を圢成した理由に぀いお非垞に䞻芳的です。 動物園党䜓のロギングフレヌムワヌクの技術的特城ずいう点ではなく、オヌプン゜ヌスモデルの開発者のポリシヌず心理孊の芳点からは有益だず思いたす。



開始する



ロギングラむブラリは、少なくずもコン゜ヌル/ログファむルぞの行の出力を蚱可する必芁があるこずは明らかです。



もちろん、最初はSystem.err.println



。 さらに、サヌブレットAPIの最初のバヌゞョンにはlog



機胜が含たれおいたしたただし、非垞に原始的。



1999幎のより高床な゜リュヌションのオプションの1぀は、DIサヌビスに加えおLogEnabledむンタヌフェむスを提䟛するAvalonプロゞェクトおよびExcaliburおよびFortressず呌ばれるサブプロゞェクトでした。 LogEnabledを宣蚀したオブゞェクトが挿入されたしたDIずの接続を匷調するために「挿入」の代わりにこの単語を䜿甚したす。タむプLoggerのオブゞェクトで、a行b䟋倖を蚘述できたす。 圓時のこのアプロヌチは新鮮で革新的なように芋えたしたが、珟代の芳点から芋るず、それは玔粋な愚かさず過剰な゚ンゞニアリングです。 ロギングにDIを䜿甚しおも意味がありたせん。このLoggerの静的むンスタンスは誰にでも適しおいたす。 Avalonでは、このひどいLoggerを保存する堎所ず、クラスがDIを䜿甚しおいない堎合぀たり、コンテナによっお制埡されおいない堎合にどうすればよいかを考える必芁があり、本圓にログむンしたいず思いたす。



1999幎頃、新䞖代ラむブラリlog4jが登堎したす。 ラむブラリのプロトタむプはIBMによっお開発され圓時、青い巚人がJavaをOS / 2に詰め蟌もうずしおいた時代に、ASFがバトンを手に入れたした。 この補品はすでに、実際のニヌズに基づいおより倚くの怜蚎ずテストが行​​われたした。 䞀般に、圓時のJavaのサヌバヌアプリケヌションは1幎ほど前のものであり、サヌバヌでは垞にログが芁求されおいたず蚀わざるを埗たせん。 この間、Javaコミュニティは、圌らが䜕をどのように必芁ずしおいるかを埐々に理解し始めたした。



log4jは、ロガヌたたはカテゎリ ぀たり、ログに曞き蟌みたいアプリケヌションの領域の抂念、いわゆるappendersによっお実行される実際のログ゚ントリ、およびレコヌドのフォヌマット レむアりト を分割したした。 log4j構成は、どのアペンダヌがどのカテゎリヌにアタッチされるかを決定し、 ログレベルメッセヌゞは各アペンダヌに分類されたす。



log4jの基瀎は、カテゎリの階局です。 たずえば、 org.hibernate



からのすべおのメッセヌゞを蚘録し、 org.hibernate



からすべおをミュヌトできたす。 しばらくしお、事実䞊、アプリケヌションのカテゎリ階局ずパッケヌゞ階局を䞀臎させる慣行が確立されたした。



カテゎリの階局により、䞍芁なメッセヌゞを非垞に効果的に遮断できるため、log4jは非垞に賢く機胜したした。 ちなみに、ロガヌの基本的なこずは、䞍芁な通垞は90を超える䞍芁なフィルタヌ凊理ずフォヌマットの蚘録速床ほど蚘録速床ではありたせん。



log4jで芏定されおいる原則は、log4cxx、log4netおよび新しいcub-log4phpなど、他の蚀語に非垞にうたく移怍されおいたす。 Python 2.xの暙準ロギングパッケヌゞは、log4jを再蚭蚈したものです他のラむブラリを少し远加したした。



それで、芁玄したす。 成功したアヌキテクチャ、明確な構成スキヌム、 フェむルセヌフの原則-プラットフォヌムにそのような玠晎らしいラむブラリを含めおみたせんか



Java Logging API



実際、すべおが奇劙になりたした。 IBMは、log4jが発生した深さで、新しいJSR47Java Logging APIの圢成を疑問芖するのに非垞に迅速であるこずが刀明したした。 特に、JSR47の責任者である同志Graham Hamiltonは、log4jを基瀎ずしおではなく、 元のIBMロギングツヌルキットを採甚するこずを決定したした。 さらに、ロギングツヌルキットは最倧限に䜿甚されたした。すべおのメむンクラスの名前が䞀臎しただけでなく、それらの実装も䞀臎したした。 プラットフォヌムの次のリリヌスをキャッチするために、圌らはコヌドをできる限り少なくしようずしたした。 ただし、抂念的にはlog4jず非垞によく䌌おいお、アペンダヌの代わりにハンドラヌず呌ばれ、レむアりトの代わりにフォヌマッタヌがありたした。



JSR47の䞻な目的は実装ではなくAPIを定矩するこずであったため、 䜿甚可胜なプラットフォヌムのデフォルトの出力ツヌルは4぀log4jには10以䞊しかなく、フォヌマッタヌは非垞に貧匱であり、すぐにフォヌマッタヌを䜜成する必芁がありたした十分ではありたせん。 JSR47は、 .properties



の圢匏で構成を䜿甚するこずを提案し、ファむル内にすべおを蚘述できるわけではないこずを括匧内に蚘茉したした。 したがっお、構成が耇雑な堎合、プログラマヌは予期せず、コヌドを蚘述する必芁があるこずがわかりたした。 .properties



の圢匏では.properties



その構成は実珟できたせん。



これは、JSR47のパフォヌマンスが䜎䞋したずいうこずではありたせん。 いく぀かの堎所で、圌はメモリ内に圌の蚭定の特別な衚珟を保持するこずでlog4jを远い越したした偶然にもこの蚭定を耇雑にしたした。 しかし、刀明したように、JSR47はいわゆる発信者情報、぀たり「このメッセヌゞはどこから来たのか」を匷制的に収集したした。 発信者情報の取埗は、かなり高䟡な操䜜であり、ネむティブコヌドを䜿甚しお続行したす。 log4jの経隓豊富な叔父はこれを知っおいたので、この機䌚に「それをオンにしない方がよい」ずいう条件を提䟛したした。



log4jの開発者はオヌプンな請願曞を䜜成し、「アセンブリラむンからJSR47を削陀する」こずを芁求したしたが、ただプラットフォヌムの䞀郚ではありたせんでした。 請願曞は100人以䞊の人々によっお眲名されたした...しかし、それは遅すぎたした。 JDKの次のリリヌスが承認され、プラットフォヌムは初歩的なjava.util.logging



、たたは略しおJULで未来に広たりたした。 新しいロギングは非垞に未開発で䞍䟿だったため、いく぀かのアプリケヌションサヌバヌResinずJettyの䞭ででのみ䜿甚するこずにしたした。 しかし、Sunは請願に応じ、元のJSR47の䞻芁な問題のほずんどは埐々に解消されたした。 それにもかかわらず、これらの操䜜は、朚補の橋に支柱を取り付けるようなもので、この橋は鉄筋コンクリヌトではありたせん。 log4j開発者はSunに向かっお瞮小したしたが、JULの曲率はただかなり高いこずに泚意しおください。 特に、JDK 1.4ラむセンスでは、 log4j を JUL実装ずしお䜿甚できたせんでした 。 log4jの最終列車はなくなりたした。



倚数のログラむタヌ぀たりハンドラヌをサポヌトできないため、JULは信じられないほど倚くのログレベルを定矩するこずで自慢したした。 たずえば、メッセヌゞのデバッグには、FINE、FINER、FINESTの3぀のレベルがすでにありたした。 これをすべお芋るず、開発者はしばしば、3぀のレベルのうちどれを䜿甚すべきかをたったく理解しおいたせんでした。



Javaコミュニティは、人気のある安定した開発䞭のlog4jず䞊行した「暙準」ロギングの出珟により完党に混乱したした。 2぀のうちどちらがテナントであるかは誰にもわかりたせんでした。 プロゞェクトで耇数のラむブラリがアセンブルされ、それぞれが独自のロギングず独自の蚭定を䜿甚しお、ログファむルをたったく異なる方法で蚘録する状況がしばしばありたした。



もちろん、コミュニティはこの問題を修正しようずしたした。 ラッピングの流行が始たった。 たたは、私はパンデミックずさえ蚀うでしょう。



ラッパヌ地獄



耇数のラむブラリを接続し、それらのログを1぀の党䜓に結合しようずするずおよびコヌドは倉曎できたせん、これはアダプタヌず呌ばれたす。 JULアダプタヌはlog4jで䜜成され、その逆も同様です。 残念ながら、機胜アダプタヌは「最小公倍数」です。 コンテキストサポヌトNDCおよびMDCがlog4jに登堎した堎合でも、JULの茞血䞭に倱われたした。 さらに悪いこずに、JULはJDK 1.4以降でしか機胜したせんでしたが、゚ンタヌプラむズアプリケヌションの数は䟝然ずしお1.3のたたでした。 その結果、コミュニティは、誰もが䞀緒に䜿甚し、い぀でもどこでも機胜する「事実䞊の共通基準」を䜜成するずいう考えに取り付かれたした。



2002幎頃、commons-loggingJCL = Jakarta Commons Loggingず呌ばれるプロゞェクトがJakartaグルヌプから登堎したした。 実際、その時点で存圚しおいたすべおのロギングツヌルのラッパヌでした。 ラッパヌ Log



ず呌ばれるむンタヌフェヌスを䜿甚するようにアプリケヌションを䜜成し、「適切な」ロギングシステムを遞択しおそれ自䜓に接続するこずが提案されたした。 ラッパヌは機胜的に貧匱で、既存のログツヌルに远加したせんでした。



適切なロギングシステムはどのように自動的に遞択されたしたか しかし、これは最も興味深いです。 たず、CLASSPATHのどこかに特別なcommons-logging.properties



ファむルを配眮するこずで、明瀺的に蚭定できたす。 第二に、システムプロパティを介しお明らかに、誰もしたせん。 第䞉に、log4jがCLASSPATHのどこかで怜出された堎合、自動的にアクティブ化されたした。 他のすべおのラむブラリの実装も同じ方法で怜玢され、最初のラむブラリは垞に接続されおいたした。



いいね たあ、぀たり、䞖界䞭のすべおの゜フトりェアがcommons-loggingを䜿甚しおいるずいいでしょう 。 その埌、JARを安党に収集しおアプリケヌションサヌバヌに配眮するず、JCLがこのアプリケヌションサヌバヌのログを取埗したす。



実際、刀明したように、倚くの゜フトりェアは通垞「開発者のお気に入りのログ」を䜿甚したす。 これは、完党に任意のラむブラリが䟝存関係の圢匏で、たずえばlog4jをプルアップできるこずを意味したす。したがっお、CLASSPATHに分類され、log4jを䜿甚するようにJCLが予期せず切り替えられたす。 commons-logging.properties



さらに悪化しcommons-logging.properties



。 掻動家が自分のJARにそれを抌し蟌むこずを考えおいた堎合、このJARを接続するず、あなた自身が理解し、曞き蟌みが倱われたす。 状況の特別な䞍正行為は、それがどのJARから感染したのかが完党に理解できないずいう事実によっお䞎えられたした。 時々、すべおのJARをアルファベット順に゜ヌトするのに圹立ちたした。 時にはタンバリン。



ロギングの遞択が完党に予枬䞍胜であるこずが、JCLの䞻芁で非垞に楜しい機胜であるこずが刀明したした。 log4jグルヌプは、commons-logging APIを採甚する前に、怒っおいるThink again蚘事で爆発したした。これは、流行を止め、既存の゜リュヌションlog4jの改良に集䞭するこずを提案したした。



残念ながら、手遅れでした。 数癟、数千の図曞通がゞャカルタからコモンズロギングに移されたした。 その䞭には、Hibernate、Spring、Tomcatがありたした。 その埌、これらのラむブラリの倚くのナヌザヌは、䞀般的にClassLoader hellず呌ばれる問題の波に流されたした。 アプリケヌションサヌバヌは、かなり耇雑なClassLoaderの階局を䜿甚したすが、倚くの堎合、J2EE暙準から倧きく逞脱しおいたす。 これらの条件䞋では、 JCLが2回初期化され、誀っお初期化され、完党に神秘的なスタックトレヌスが発生し、ログラッパヌに問題があるず疑うこずさえできなくなりたす。



実際、なぜオヌプン゜ヌスがこのような奇劙な方法で機胜し、この倒錯を生み出したのでしょうか なぜ開発者は、もう1぀の成熟した人気のあるオヌプン゜ヌス補品であるlog4jを䜿甚するだけではありたせんか ここでのポむントは、おそらく、ASFおよびこの悪倢を生成したゞャカルタグルヌプがASFの䞀郚であるたたはSunを远跡するために䜿甚されるコミュニティの特定の慣性です。 JCLを䜿甚したプロゞェクトのクリティカルマスが圢成されるずすぐに、他の党員最も愚かな人々ではなく、Gavin KingがJCLの䜿甚を開始したすApacheは玠晎らしいからです。 これは䞀般的に、ApacheやSunなどのブランドが䜕癟䞇人もの開発者が急いでいる䜎圧力の領域を䜜成できるブラりン運動を連想させたす。 JCLの堎合、「サクセスストヌリヌ」は2003幎にRod Waldhoff いわゆるゞャカルタコモンズの開発者の1人のブログで説明されたした。



新たな進展



したがっお、2004幎のどこかでキットに含たれおいたす。

  1. 安定しお機胜的に開発されたlog4j
  2. 鈍いjava.util.logging
  3. 問題コモンズ-ロギング
  4. 蚀及する䟡倀のない少数の小さなロガヌ


珟時点では、log4jプロゞェクトでは保守的な雰囲気が優勢であるこずに泚意しおください。 叀いJDKずの互換性に特に泚意が払われたした。 新しいブランチlog4j-1.3.xの開発のようです。 このバヌゞョンは、䞀皮の劥協゜リュヌションです。はい、新しい機胜が必芁です。はい、䞋䜍互換性を維持したいです。はい、私たちずあなたの䞡方を満足させようずしたす。 その間、可倉匕数、JMX拡匵機胜、その他のギフトを備えたJDK 1.5の途䞭で。 log4jチヌムは脳波を開始したした。 2.xブランチは切り離されおいたす。メむンの1.2.xブランチずは互換性がなく、JDK 1.5専甚に䜜成されおいたす。 Javaコミュニティは短気です。 それは䜕かずしお起こっおいるようです。 しかし、正確に理解しおはならないのは、log4j 2.0はただ達成できないアルファであり、log4j 1.3は非垞にバグが倚く、ドロップむンの互換性が玄束されおいないこずです。 ブランチ1.2のみがただ安定しおおり、数幎でゞャンプしたす -泚意 -バヌゞョン1.2.6から1.2.12。



2006幎のどこかで、log4jの創蚭者の1人であるCekiGÃŒlcÌは、急速に衰退したチヌムを去るこずに決めたした。 そのため、SLF4JJava甚のシンプルロギングファサヌドず呌ばれる次の「すべおのラッパヌ」が誕生したした。 これは、log4j、JUL、commons-logging、およびlogbackず呌ばれる新しいロガヌのラッパヌです。 ご芧のずおり、進捗状況はすぐに「ラッパヌの呚りのラッパヌ」の段階に達したした。 同じスキヌムによれば、ラップされたラむブラリの数が階乗ずしお増加するこずを予枬するのは簡単です。 ただし、SLF4Jには他の工倫もありたす。 これらは、log4jからSLF4J、commons-loggingからSLF4Jなどぞの特別なバむナリアダプタです。 このようなアダプタヌは、゜ヌスが利甚できないコヌド甚に䜜られおいたす。 ただし、ログラむブラリの元のJARを眮き換える必芁がありたす。 これがどんなおridgeになるのか想像できたせんが、本圓にしたいのならできたす。



私のラッパヌに察する憎しみすべおにずっお、正盎なずころ、SLF4Jはよくできた補品です。 前任者のすべおの欠点が考慮されたした。 たずえば、CLASSPATHでクラス怜玢を行うシャヌマニズムダンスの代わりに、より信頌性の高いスキヌムが考案されたした。 これで、ラッパヌ党䜓が2぀の郚分に分割されたすslf4j-log4j12.jar



アプリケヌションで䜿甚されるず、ロギングの各タむプの個別のJARファむルで衚される実装たずえば、 slf4j-log4j12.jar



、 slf4j-jdk14.jar



など。 必芁な実装ファむルをプロゞェクトに接続するだけで十分です。その埌、おっず 䜿甚されるすべおのプロゞェクトコヌドずすべおのラむブラリSLF4J APIにアクセスする堎合は、正しい方向にログむンしたす。



機胜的には、SLF4JはNDCやMDCなどの最新の機胜をすべおサポヌトしおいたした。 呌び出しを実際にラップするこずに加えお、SLF4Jは、文字列をフォヌマットするずきに、小さいながらも䟿利なボヌナスを提䟛したした。 ここでのボヌナスは次のずおりです。 コヌドでは、倚くの堎合、フォヌムの構造を印刷する必芁がありたす。



 log.debug("User " + user + " connected from " + request.getRemoteAddr());
      
      





実際に文字列を出力するこずに加えお、ここではuser.toString()



倉換の埌に文字列の連結が暗黙的に続きたす。 すべおは䜕もないでしょう。 デバッグモヌドでは、実行速床はそれほど気になりたせん。 ただし、たずえばINFOでレベルを蚭定した堎合でも、文字列の構築は匕き続き行われるこずがわかりたす。 奇跡はありたせんlog.debug



呌び出す前に行が構築されるため、 log.debug



はこれを䜕らかの方法で制埡する方法がありたせん。 このlog.debug



いく぀かの重芁な内郚ルヌプに配眮されおいるlog.debug



想像するず...䞀般的に、あなたはそのように生きるこずはできたせん。 log4jの開発者は、次のようなデバッグコヌドのフレヌミングを提案したした。



 if (log.isDebugEnabled()) { log.debug("User " + user + " connected from " + request.getRemoteAddr()); }
      
      





良くない 理論的には、これらの問題はすべおロギングラむブラリ自䜓で凊理する必芁がありたす。 この問題は、単にlog4jのアキレス腱でした。 開発者はキックに緩慢に反応し、オブゞェクトをロギングコヌル正確には1぀に远加できるようになり、 ObjectRenderer



むンタヌフェむスを䜿甚しおこのオブゞェクトがログに曞き蟌たれる方法に぀いおも説明したした。 抂しお、これらはすべお蚀い蚳ず半分の措眮でした。



SLF4Jは、叀いバヌゞョンのJDKおよびAPIずの互換性のフレヌムワヌクによっお圧迫されおいなかったため、すぐにより゚レガントな゜リュヌションを提案したした。

  log.debug("User {} connected from {}", user, request.getRemoteAddr());
      
      





䞀般的に、すべおは簡単です。 この行の{}



は、個別に枡されるパラメヌタヌぞのリンクです。 パラメヌタヌを文字列に倉換し、ログレコヌドの最終フォヌマットは、DEBUGレベルが蚭定されおいる堎合にのみ行われたす。 倚くのパラメヌタヌを枡すこずができたす。 うたくいく フレヌミングを蚘述する必芁はありたせん。



括匧内で、GStringの抂念があるGroovy蚀語によっお、この機胜も完党に予期せず実装されたこずに泚意する必芁がありたす。 文字列を衚瀺
 "User ${user} connected from ${request.getRemoteAddr()}"
      
      



、いく぀かのコンテキスト倉数ここではuser



、 request



に暗黙的に関連付けられおおり、文字列の蚈算は延期されたす 。 これは、log4jなどのログラむブラリにずっお非垞に䟿利です。GString入力に入力し、蚈算せずに砎棄するか、通垞の静的文字列-文字列に倉換できたす。



芁するに、SLF4Jは将来に備えお有胜に䜜られたした。 これにより、コミュニティでの人気が倧幅に高たりたした。珟圚、SLF4Jは、Jetty、Hibernate、Mina、Geronimo、Mule、Wicket、Nexusなどの重芁なプロゞェクトで䜿甚されおいたす...䞀般的に、か぀おcommons-loggingにかかっおいたほずんどすべおの敗者はSLF4Jに切り替えたした。 䜕幎も前に、コモンズのログが目的の状態に改善されなかったのはなぜでしょうか しかし、これらはオヌプン゜ヌスの珟実です。その䞭での゜フトりェアの開発は、進化よりも革呜的です。



SLF4Jず同時に、たったく新しいロガヌがテヌブルに远加されたした-Logback。 それは䌐採で犬を食べた男性によっお䜜られ、実際には本圓に良い補品であるこずが刀明したした。 logbackはもずもずJDK 1.5+の䞋で研ぎ柄たされ、log4jプロゞェクトに内圚するすべおの老人性䞋䜍互換性疟患を䞀気に取り陀いた。 そしおそれは、可倉匕数、 java.util.concurrent



、 その他の喜びを意味したす。 たずえば、組み蟌みのランタむムフィルタリングシステムにより、ナヌザヌセッションに応じおログレベルを倉曎したり、ナヌザヌを別のログファむルに分散したりするこずができたす。



著者が描いた田園にマスタヌドを投げたす。 これらの機胜のほずんどは、log4jの远加アペンダヌずしお実装できたす。 構成を曲げおファむルするこずはより困難ですが、これのために新しいロガヌに切り替える必芁はないずいう事実です。 したがっお、Logbackでアドバタむズされたすべおのチップは䟿利ですが、䞀意ではありたせん。



コミュニティに関しおは、Logbackを慎重に扱いたす。 たず、数幎のうちに圌はバヌゞョン0.9.xに到達したしたが、これは䞀郚のプログラマヌを怖がらせたす。 第二に、LogbackはApacheの傘䞋にもSunのスコヌプ内にもありたせん。 それはsc垳面な人々を悩たす。 第䞉に、䜜者は食べる必芁があるため、Logbackずサポヌトの䞀郚のアドオンにはお金が必芁です。 これは時々生埒を怖がらせたす。 ずりわけ、Logbackにはかなり耇雑なデュアルラむセンスLGPL / EPLがありたすが、log4jにはナニバヌサルApacheラむセンスがありたす。 ラむブラリおよび䞀般的に再配垃可胜な゜フトりェアの堎合、ラむセンスは非垞に埮劙なポむントです。



抂しお、今日のLogbackは進化の頂点です。Logbackに加えお、10個の新しいロギングラむブラリが登堎したしたが、どれも生き残れない可胜性が高いです。芁玄するず、珟時点での状況は次のずおりです。



オヌプン゜ヌスコミュニティは「重心」に矀がる傟向があるずすでに述べたした。珟圚、そのような重心は、その「普遍性」のため、むしろSLF4Jです。SLF4Jの盞察的な人気は、ある皋床新しいラッパヌの出珟を保蚌したす。SLF4Jを䜿甚するプロゞェクトの数は、すでに「クリティカルマス」を蓄積するのに十分です。ログバック同じ著者、気にしないでくださいには、そのようなクリティカルマスはありたせん。ちなみに、log4jは今でも黄金の山ずバヌゞョン2.0を玄束したすが、物事はただありたす。Logbackがプラむドを和らげ、Apacheに移行するず、圌の䜍眮は倧きく改善するず思いたす。



おわりに



問題の歎史をプログラマヌの心理孊の芳点から芋るのは興味深い。実際、原則ずしお、これはすべおスパむラルですそしお、それは進歩的であるようです運動-無限の「車茪の再発明」。぀たり、「既存の倉曎」ず「独自の操䜜」ずいう2぀のオプションのうち、2番目のオプションが垞に遞択されおいたした。したがっお、蚀及されたプロゞェクトのいずれも、非垞に事実䞊の基準に基づいお無条件のリヌダヌに分割されおいたせん。代わりに、開発者は、䞀緒に行動するのではなく、異なるプロゞェクトで異なる時間に「切り刻たれ」、別々に行動したした。すべおの著者が1぀のチヌムで䜜業できるずいう事実ではありたせんが。政治的な瞬間がありグラハムハミルトンがIBMをどのように愛しおいたかを思い出しおください、チヌムの些现な口論だけでした。コミュニティに「遞択の自由」を提䟛したいずいうゞャカルタコモンズの参加者の欲求は、䞀般にコミュニティの長い「ラッパヌの流行」に倉わりたした。



䞀般に、これらの悪はすべおオヌプンコミュニティの兞型です。この10幎以䞊の歎史は、SunがJavaコミュニティで䜕かを決定しおいるように思われた今、その信念がどれほど誀っおいるかを瀺しおいたす。Sunに反しお、Sunから独立しお倚くのこずが起こったこずがわかりたす。䞀蚀で蚀えば、私はそれがさらにどのように進むのだろうか。私は䞀぀のこずを確信しおいたす-プロゞェクトは行き来し、人々は倉わりたせん:)



All Articles