タグ付けされた質問 「classloader」

クラスローダーは、Javaでクラスをロードするためのオブジェクトです。

11
Java / Mavenで「Xerces hell」を処理しますか?
私のオフィスでは、Xercesという単語を単に言及するだけで、開発者の殺意を呼び起こします。SOに関する他のXercesの質問をざっと見ると、ほとんどすべてのMavenユーザーがこの問題にいつか「触れられている」ことを示しているようです。残念ながら、問題を理解するには、Xercesの歴史について少し知識が必要です... 歴史 Xercesは、Javaエコシステムで最も広く使用されているXMLパーサーです。Javaで作成されたほとんどすべてのライブラリまたはフレームワークは、Xercesをある程度の能力で使用しています(直接ではない場合でも、推移的に)。 公式バイナリに含まれるXerces jar は、現在のところバージョン管理されていません。たとえば、Xerces 2.11.0実装jarには名前が付けられxercesImpl.jar、名前は付けられませんxercesImpl-2.11.0.jar。 XercesチームはMavenを使用しません。つまり、公式リリースをMaven Centralにアップロードしません。 Xercesは以前は単一のjar(xerces.jar)としてリリースされていましたが、1つはAPI(xml-apis.jar)を含み、もう1つはそれらのAPIの実装を含む()の2つのjarに分割されましたxercesImpl.jar。多くの古いMaven POMは、依然としてへの依存を宣言していxerces.jarます。過去のある時点で、XercesもとしてリリースされましたxmlParserAPIs.jar。これは、一部の古いPOMも依存しています。 jarをMavenリポジトリーにデプロイする人がxml-apisおよびxercesImpl jarに割り当てたバージョンは、多くの場合異なります。たとえば、どちらもXerces 2.8.0からのものであっても、xml-apisにはバージョン1.3.03が与えられ、xercesImplにはバージョン2.8.0が与えられる場合があります。これは、人々がxml-apis jarに実装する仕様のバージョンをタグ付けすることがよくあるためです。ここには非常に良いが不完全な内訳があります。 さらに複雑なことに、Xercesは、JREに含まれているJava API for XML Processing(JAXP)のリファレンス実装で使用されるXMLパーサーです。実装クラスはcom.sun.*名前空間の下に再パッケージ化されているため、一部のJREでは使用できない可能性があるため、直接アクセスするのは危険です。ただし、すべてのXerces機能がjava.*およびjavax.*APIを介して公開されるわけではありません。たとえば、Xercesシリアル化を公開するAPIはありません。 混乱する混乱に加えて、ほとんどすべてのサーブレットコンテナ(JBoss、Jetty、Glassfish、Tomcatなど)は、Xercesとともに1つ以上の/libフォルダで出荷されます。 問題 紛争解決 上記の理由のいくつか、またはおそらくすべてのために、多くの組織は、自分のPOMでXercesのカスタムビルドを発行および使用しています。小さなアプリケーションでMaven Centralのみを使用している場合、これは実際には問題ではありませんが、ArtifactoryまたはNexusが複数のリポジトリ(JBoss、Hibernateなど)をプロキシしているエンタープライズソフトウェアではすぐに問題になります。 たとえば、組織Aは次のように公開xml-apisします。 <groupId>org.apache.xerces</groupId> <artifactId>xml-apis</artifactId> <version>2.9.1</version> 一方、組織Bは次のものと同じものjarを公開する場合があります。 <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> <version>1.3.04</version> B jarはAよりも低いバージョンですがjar、Mavenはが異なるため、それらが同じアーティファクトであることを認識していません groupId。したがって、競合の解決は実行できず、両方 jarのが解決された依存関係として含まれます。 クラスローダー地獄 上記のように、JREはJAXP RIのXercesに同梱されています。すべてのXerces Maven依存関係を<exclusion>sまたは<provided>、依存するサードパーティのコードは、使用しているJDKのJAXPで提供されるバージョンで動作する場合と動作しない場合があります。さらに、Xerces jarがサーブレットコンテナに同梱されており、これに対処する必要があります。これにはいくつかの選択肢があります。サーブレットのバージョンを削除して、コンテナがJAXPバージョンで実行されることを望んでいますか?サーブレットバージョンを残し、アプリケーションフレームワークがサーブレットバージョンで実行されることを望んでいますか?上記で概説した1つまたは2つの未解決の競合が製品に侵入した場合(大規模な組織で起こりやすい)、クラスローダーの地獄にすぐに気づき、実行時にクラスローダーが選択しているXercesのバージョンと、そのバージョンかどうかを疑問に思います。 WindowsとLinuxで同じjarを選択します(おそらくそうではありません)。 ソリューション? 私たちは、全てのXerces Mavenの依存関係をマーキングしようとした<provided>かのように<exclusion>アーティファクトが非常に多くの別名(持っていることを考えると(特に大規模なチームで)が、これは強制することは困難であるxml-apis、xerces、xercesImpl、xmlParserAPIs、など)。さらに、サードパーティのlibs / frameworksは、JAXPバージョンまたはサーブレットコンテナによって提供されるバージョンでは実行できない場合があります。 Mavenでこの問題にどのように対処すればよいでしょうか?依存関係をこのように細かく制御してから、階層型クラスローディングに依存する必要がありますか?すべてのXerces依存関係をグローバルに除外し、すべてのフレームワーク/ライブラリに強制的にJAXPバージョンを使用させる方法はありますか? 更新:Joshua …

18
実行時にJARファイルを動的にロードする方法は?
なぜこれをJavaで行うのがそれほど難しいのですか?任意の種類のモジュールシステムが必要な場合は、JARファイルを動的にロードできる必要があります。独自ClassLoaderにを作成する方法はあると言われていますが、JARファイルを引数としてメソッドを呼び出すのと同じくらい簡単な(少なくとも私の心の中で)必要な作業には、多くの作業が必要です。 これを行う簡単なコードの提案はありますか?
308 java  jar  classloader 

13
実行時のJavaアノテーションのスキャン[終了]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 3か月前に閉鎖。 この質問を改善する 注釈付きクラスのクラスパス全体を検索する最良の方法は何ですか? 私はライブラリーをやっていて、ユーザーがクラスに注釈を付けられるようにしたいので、Webアプリケーションが開始するときに、クラスパス全体をスキャンして特定の注釈を見つける必要があります。 これを行うためのライブラリまたはJava機能を知っていますか? 編集:Java EE 5 WebサービスまたはEJBの新機能のようなものについて考えています。@WebServiceまたは@EJBでクラスに注釈を付けると、システムはロード中にこれらのクラスを見つけ、リモートでアクセスできるようにします。


14
JavaのクラスパスからリソースをロードするためのURL
Javaでは、同じAPIを使用してさまざまなURLプロトコルであらゆる種類のリソースをロードできます。 file:///tmp.txt http://127.0.0.1:8080/a.properties jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class これにより、リソースの実際の読み込みが、リソースを必要とするアプリケーションからうまく切り離されます。URLは単なる文字列なので、リソースの読み込みも非常に簡単に設定できます。 現在のクラスローダーを使用してリソースをロードするプロトコルはありますか?これはJarプロトコルに似ていますが、リソースの送信元のjarファイルまたはクラスフォルダーを知る必要がない点が異なります。 Class.getResourceAsStream("a.xml")もちろん、を使用してそれを行うことができますが、それには別のAPIを使用する必要があり、既存のコードを変更する必要があります。プロパティファイルを更新するだけで、既にリソースのURLを指定できるすべての場所でこれを使用できるようにしたいと思います。
197 java  url  classloader 

7
Class.getResource()とClassLoader.getResource()の違いは何ですか?
私は違いが間にあるのだろうかClass.getResource()とClassLoader.getResource()? 編集:特にキャッシュがファイル/ディレクトリレベルで行われているかどうかを知りたいです。「クラスのバージョンではディレクトリのリストがキャッシュされますか?」のように 私の知る限り、以下は本質的に同じことをするはずですが、そうではありません: getClass().getResource() getClass().getClassLoader().getResource() WEB-INF/classes/そのディレクトリの既存のファイルから新しいファイルを作成するレポート生成コードをいじるときに、これを発見しました。Classのメソッドを使用すると、を使用してデプロイメント時に存在していたファイルを見つけることができましたがgetClass().getResource()、新しく作成されたファイルをフェッチしようとすると、nullオブジェクトを受け取りました。ディレクトリを参照すると、新しいファイルがそこにあることがはっきりとわかります。ファイル名の先頭には、「/ myFile.txt」のようにスラッシュが付いています。 一方、のClassLoaderバージョンでgetResource()は、生成されたファイルが見つかりました。この経験から、ディレクトリリストのキャッシュが行われているようです。私は正しいですか、そうであれば、これはどこに文書化されていますか? 上のAPIドキュメントからClass.getResource() 指定された名前のリソースを検索します。特定のクラスに関連付けられているリソースを検索するためのルールは、クラスの定義クラスローダーによって実装されます。このメソッドは、このオブジェクトのクラスローダーに委譲します。このオブジェクトがブートストラップクラスローダーによってロードされた場合、メソッドはClassLoader.getSystemResource(java.lang.String)に委譲します。 私には、これは「Class.getResourceが実際に独自のクラスローダーのgetResource()を呼び出している」と読みます。これはと同じgetClass().getClassLoader().getResource()です。しかし、明らかにそうではありません。誰かが私にこの問題についていくつかの照明を提供してくれませんか?

11
Javaクラスのロード元を見つける
javaクラスローダーが実際にクラスをロードする場所をプログラムで見つける方法を誰かが知っていますか? 私は、クラスパスが非常に長くなり、手動検索が実際には選択肢にならないような大規模なプロジェクトによく取り組みます。最近問題がありました、クラスローダーが2つの異なる場所のクラスパスにあるため、クラスローダーが誤ったバージョンのクラスをロードするがありました。 では、クラスローダーに、実際のクラスファイルがディスク上のどこから来ているのかを教えてもらうにはどうすればよいでしょうか。 編集:バージョンの不一致(または何か他の理由)が原因でクラスローダーが実際にクラスのロードに失敗した場合はどうでしょうか?

3
JVMフラグCMSClassUnloadingEnabledは実際には何をしますか?
CMSClassUnloadingEnabled「PermGenの問題を取り除きます」などの非常にあいまいな高レベルの定義を除いて、Java VMフラグが実際に行うことの定義を一生見つけることはできません。 私はSun / Oracleのサイトを見てきましたが、オプションリストでさえ、実際には何をしているのかわかりません。 フラグの名前に基づいて、CMSガベージコレクターはデフォルトではクラスをアンロードせず、このフラグがオンになっていると思いますが、確信が持てません。

7
Javaでクラスをアンロードしていますか?
デスクトップクラスのアプリケーションが、対話する必要のあるAppServerから動的にクラスのロードを開始できるように、カスタムクラスローダーがあります。これを行うのに必要なjarの量がばかばかしいため(これを出荷したい場合)、これを行いました。AppServerライブラリから実行時にクラスを動的にロードしないと、バージョンの問題も発生します。 さて、2つの異なるAppServerと通信する必要があるという問題にぶつかったところ、最初にロードするクラスによっては、うまく機能しない可能性があることがわかりました...実際にJVMを強制終了せずにクラスのアンロードを強制する方法はありますか? これは理にかなっていると思います
174 java  classloader 

7
Java ClassLoaderとは何ですか?
いくつかの簡単な文で、Java ClassLoaderとは何ですか、いつ使用され、なぜですか? OK、私はwikiの記事を読みました。ClassLoaderはクラスをロードします。OK。したがって、jarファイルを含めてインポートすると、ClassLoaderがその役割を果たします。 なぜこのClassLoaderに悩む必要があるのですか?私はそれを使用したことがなく、それが存在することを知りませんでした。 問題は、なぜClassLoaderクラスが存在するのですか?また、実際にどのように使用しますか?(場合によっては存在します。)
174 java  classloader 


6
ファイルとしてのJavaリソース
Javaでクラスローダーを介してjarから取得したリソースにFileインスタンスを構築する方法はありますか? 私のアプリケーションは、jar(デフォルト)または実行時に指定されたファイルシステムディレクトリ(ユーザー入力)のいくつかのファイルを使用します。私は一貫した方法を探し ています a)これらのファイルをストリームとしてロードするb)ユーザー定義のディレクトリまたはjarのディレクトリにあるファイルをそれぞれリストする 編集:どうやら、理想的なアプローチは、java.io.Fileから完全に離れることです。クラスパスからディレクトリをロードし、その内容(そこに含まれるファイル/エンティティ)を一覧表示する方法はありますか?

5
Java、クラスパス、クラスローディング=>同じjar /プロジェクトの複数のバージョン
これは経験豊富なコーダーにとってばかげた質問かもしれません。しかし、私は私のプロジェクトで使用される他のフレームワーク/ jarのいくつかが必要とするライブラリ(httpクライアント)を持っています。ただし、それらすべてに次のような異なるメジャーバージョンが必要です。 httpclient-v1.jar => Required by cralwer.jar httpclient-v2.jar => Required by restapi.jar httpclient-v3.jar => required by foobar.jar クラスローダーは、どういうわけかそれらを分離するのに十分インテリジェントですか?おそらくそうではありませんか?クラスが3つのすべてのjarで同じ場合、クラスローダーはこれをどのように処理しますか。どれがロードされ、なぜですか? Classloaderはjarを1つだけピックアップしますか、それともクラスを任意に混合しますか?たとえば、クラスがVersion-1.jarからロードされた場合、同じクラスローダーからロードされた他のすべてのクラスはすべて同じjarに入りますか? この問題をどのように処理しますか? jarを「required.jar」に何らかの形で「組み込む」ためのトリックがあり、それによって、それらは「1つのユニット/パッケージ」として表示されます。 Classloader、それか、何らかの形でリンクされますか?


8
Mavenを使用して、必要なすべてのJARファイルを最終的なJARファイル内のライブラリフォルダーに配置するにはどうすればよいですか?
私はスタンドアロンアプリケーションでMavenを使用していて、ここにある回答の1つにあるように、ライブラリフォルダー内のJARファイルにすべての依存関係をパッケージ化したいと思います。 Mavenを使用して、依存関係を持つ実行可能JARを作成するにはどうすればよいですか? 私の最終的なJARファイルには、依存関係をmaven-shade-plugin.m2フォルダーのMaven階層のようなフォルダーの形式で配置するものとは異なり、依存関係をJARファイルとして含むライブラリフォルダーが必要です。 ええと、実際には現在の構成で十分ですが、アプリケーションの実行時にJARファイルをロードするときに問題が発生します。クラスを読み込めません。 これが私の設定です: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/classes/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.myapp.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> …

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