JP2023070452A - 情報処理装置、クラスのロード方法、集約の方法およびプログラム - Google Patents
情報処理装置、クラスのロード方法、集約の方法およびプログラム Download PDFInfo
- Publication number
- JP2023070452A JP2023070452A JP2021182649A JP2021182649A JP2023070452A JP 2023070452 A JP2023070452 A JP 2023070452A JP 2021182649 A JP2021182649 A JP 2021182649A JP 2021182649 A JP2021182649 A JP 2021182649A JP 2023070452 A JP2023070452 A JP 2023070452A
- Authority
- JP
- Japan
- Prior art keywords
- class
- file
- library
- files
- information processing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】ファイル単位で権限が管理される環境において複数のファイルを1つの統合ファイルにまとめた場合であっても、統合ファイルに含まれた個々のファイルの単位で権限を管理することができる情報処理装置、クラスのロード方法、集約の方法及びプログラムを提供する。【解決手段】方法は、複数のライブラリファイル夫々に関連付く複数のライブラリファイル夫々に含まれるクラスの権限を保持する。アーカイブファイルは、複数のライブラリファイル夫々に含まれるクラスを特定するクラスマップをを有する。クラスローダは、設定された担当ライブラリファイルを特定する情報を保持し、クラスマップに基づいて、アーカイブファイルに含まれた担当ライブラリファイルから、指定されたクラスをロードし、ロードしたクラスに対して、当該クラスを含む担当ライブラリファイルに関連付けて保持されている権限を設定する。【選択図】図6
Description
本発明は、Javaプログラムを実行するためのクラスローダ等を含む情報処理装置、クラスのロード方法、集約の方法およびプログラムに関する。
従来、複数のアプリケーションの権限を管理して実行する仕様Open Services Gateway initiative(OSGi)が普及している。アプリケーションの権限の管理は、Java(登録商標)仮想マシン(以降JavaVMと記載)が標準で備えるセキュリティマネージャを用いて行う。セキュリティマネージャを用いる権限管理方法として、デバイスが保持するアプリケーションプログラムと、アプリケーションの権限を設定するポリシーファイルを個別に管理する仕組みが考案されている(例えば特許文献1参照)。
OSGiでは、OS上の1プロセス上で複数のアプリケーションを実行できる。しかし、1プロセスで同時に開けるファイル数には上限がある。そのため、動かすアプリケーションが増えると、JavaVMが開くjarファイルも増えて、上限に達してしまう。jarファイルは一般的なアーカイブファイルであるため、複数のjarファイルを1つのjarファイルとしてまとめなおせば、JavaVMが開くファイル数を削減することができる。しかし、セキュリティマネージャの権限管理はファイル単位で設定するため、複数のjarファイルを1つのjarファイルにまとめると、まとめられた個々のjarファイルの権限を管理できなくなる課題が生じる。
本発案は上記の課題に鑑みてなされたものであり、ファイル単位で権限が管理される環境において複数のファイルを1つの統合ファイルにまとめた場合であっても、統合ファイルに含まれた個々のファイルの単位で権限を管理することを目的とする。
上記目的を達成するために本発明は以下の構成を有する。すなわち、本発明の一側面によれば、クラスを含む複数のライブラリファイルを集約したアーカイブファイルから、前記複数のライブラリファイルのいずれかに含まれたクラスをロードするクラスローダを有する情報処理装置であって、
前記複数のライブラリファイルそれぞれに関連付けて前記複数のライブラリファイルそれぞれに含まれたクラスの権限を保持する第1の保持手段を有し、
前記アーカイブファイルは、前記複数のライブラリファイルそれぞれに含まれた前記クラスを特定するクラスマップを含み、
前記クラスローダは、
設定された担当ライブラリファイルを特定する情報を保持する第2の保持手段と、
前記クラスマップに基づいて、前記アーカイブファイルに含まれた前記担当ライブラリファイルから、指定されたクラスをロードするロード手段と、
前記ロード手段によりロードしたクラスに対して、当該クラスを含む前記担当ライブラリファイルに関連付けて前記第1の保持手段により保持されている権限を設定する権限設定手段と、を有する
ことを特徴とする情報処理装置が提供される。
前記複数のライブラリファイルそれぞれに関連付けて前記複数のライブラリファイルそれぞれに含まれたクラスの権限を保持する第1の保持手段を有し、
前記アーカイブファイルは、前記複数のライブラリファイルそれぞれに含まれた前記クラスを特定するクラスマップを含み、
前記クラスローダは、
設定された担当ライブラリファイルを特定する情報を保持する第2の保持手段と、
前記クラスマップに基づいて、前記アーカイブファイルに含まれた前記担当ライブラリファイルから、指定されたクラスをロードするロード手段と、
前記ロード手段によりロードしたクラスに対して、当該クラスを含む前記担当ライブラリファイルに関連付けて前記第1の保持手段により保持されている権限を設定する権限設定手段と、を有する
ことを特徴とする情報処理装置が提供される。
また本発明の他の側面によれば、複数のライブラリファイルを1つのアーカイブファイルに集約する情報処理装置であって、
集約対象のライブラリファイルと該ライブラリファイルに含まれたクラスとを関連付けたクラスマップを生成する第1の生成手段と、
前記集約対象のライブラリファイルと該ライブラリファイルに含まれたリソースファイルとを関連付けたリソースマップを生成する第2の生成手段と、
集約対象のライブラリファイルに含まれたクラスの所在を示すリストと前記クラスマップと前記リソースマップとを含むアーカイブファイルを生成する第3の生成手段と、を有する
ことを特徴とする情報処理装置が提供される。
集約対象のライブラリファイルと該ライブラリファイルに含まれたクラスとを関連付けたクラスマップを生成する第1の生成手段と、
前記集約対象のライブラリファイルと該ライブラリファイルに含まれたリソースファイルとを関連付けたリソースマップを生成する第2の生成手段と、
集約対象のライブラリファイルに含まれたクラスの所在を示すリストと前記クラスマップと前記リソースマップとを含むアーカイブファイルを生成する第3の生成手段と、を有する
ことを特徴とする情報処理装置が提供される。
本発明によれば、ファイル単位で権限が管理される環境において複数のファイルを1つの統合ファイルにまとめた場合であっても、統合ファイルに含まれた個々のファイルの単位で権限を管理することができる。
以下、添付図面を参照して実施形態を詳しく説明する。なお、以下の実施形態は特許請求の範囲に係る発明を限定するものではない。実施形態には複数の特徴が記載されているが、これらの複数の特徴の全てが発明に必須のものとは限らず、また、複数の特徴は任意に組み合わせられてもよい。さらに、添付図面においては、同一若しくは同様の構成に同一の参照番号を付し、重複した説明は省略する。
<実施形態1>
●ハードウェア
本発明の実施形態1におけるハードウェアとシステムの構成を説明する。図1は、一般的な情報処理装置100のハードウェア構成の一例を示す図である。図1に示すように情報処理装置100は、ハードウェア構成として、CPU11を含む。
●ハードウェア
本発明の実施形態1におけるハードウェアとシステムの構成を説明する。図1は、一般的な情報処理装置100のハードウェア構成の一例を示す図である。図1に示すように情報処理装置100は、ハードウェア構成として、CPU11を含む。
CPU11が、記憶部13に記憶されている後述するアプリケーションやプログラム実行環境等の各々に対応するプログラムに基づき処理を行うことによって、後述する各機能、又はフローチャートを実現する。
また、CPU11には、バス10を介して、入力部12、記憶部13、表示部14及び外部接続IF15が接続されている。入力部12は、情報を入力するキーボード及び/又はマウスである。記憶部13は、例えば、ROM、RAM、ハードディスク装置等を含み、上述した各プログラム以外に、プログラムに基づく処理で用いられるデータ等を記憶する。表示部14は、画面等を表示するディスプレイである。外部接続IF15は、ネットワークインタフェース、外部機器との各種接続インタフェースである。
尚、CPU11はプログラムを実行することで各種の手段として機能することが可能である。なお、CPU11と協調して動作するASICなどの制御回路がこれらの手段として機能してもよい。また、CPU11と情報処理装置100の動作を制御する制御回路との協調によってこれらの手段が実現されてもよい。また、CPU11は単一のものである必要はなく、複数であってもよい。この場合、複数のCPU11は分散して処理を実行することが可能である。また、複数のCPU11は単一のコンピュータに配置されていてもよいし、物理的に異なる複数のコンピュータに配置されていてもよい。なお、CPU11がプログラムを実行することで実現する手段が専用の回路によって実現されてもよい。
●ソフトウェア
次に、情報処理装置100上に構築するシステム構成について、図2を用いて説明する。図2は、情報処理装置100のシステム構成の一例を示す図である。オペレーティングシステム201(以降OS201と記載)は、システム全体の基盤となるソフトウェアである。プロセス202は、OS201上でソフトウェアを動作させる実行の単位である。プロセス202上では複数のプログラムを動作させることができる。複数のプログラムを一つのプロセス202上で動作させる利点は、プロセス202間の通信コストがなくなることである。ただし、一つのプロセス202が利用できるOS201の資源には上限がある。資源とは、メモリやファイルディスクリプタを含む。ファイルディスクリプタ(以降、FDと記載)とは、プロセス202がファイルを開くための資源である。
次に、情報処理装置100上に構築するシステム構成について、図2を用いて説明する。図2は、情報処理装置100のシステム構成の一例を示す図である。オペレーティングシステム201(以降OS201と記載)は、システム全体の基盤となるソフトウェアである。プロセス202は、OS201上でソフトウェアを動作させる実行の単位である。プロセス202上では複数のプログラムを動作させることができる。複数のプログラムを一つのプロセス202上で動作させる利点は、プロセス202間の通信コストがなくなることである。ただし、一つのプロセス202が利用できるOS201の資源には上限がある。資源とは、メモリやファイルディスクリプタを含む。ファイルディスクリプタ(以降、FDと記載)とは、プロセス202がファイルを開くための資源である。
本実施形態では、OS201はLinux(登録商標)とする。一般的なLinux(登録商標)ではFDの上限は1024個である。単にFDの上限を増やすだけなら、リソースの上限を設定するulimitコマンドで設定できる。しかし、OSにはFD集合のいずれか一つがI/Oを実行可能な状態になるのを待つselectコマンドがある。selectコマンドはFDの上限を増やすと正しく動かなくなるため、selectコマンドを利用している組み込み向けライブラリなどを実行するデバイスでは、FDの上限を増やせない。
JavaVM203は、プロセス202上で動作する。JavaVM203上では、OSGiの実装であるアプリケーションフレームワーク204(以降アプリケーションFW204と記載)が動作する。アプリケーションFW204に管理されて、複数のアプリケーション205が動作する。
●アプリケーションFWとJavaVMの構成
次に、アプリケーションFW204とJavaVM203の構成について図3を用いて説明する。JavaVM203には、セキュリティマネージャ301が含まれる。アプリケーションFW204は、各アプリケーション205をロードするためのアプリケーションクラスローダ302を生成して、アプリケーション205を実行する。アプリケーションクラスローダ302は、Java標準のクラスローダを継承したものである。この構成はOSGi仕様によるものであり、公知である。
次に、アプリケーションFW204とJavaVM203の構成について図3を用いて説明する。JavaVM203には、セキュリティマネージャ301が含まれる。アプリケーションFW204は、各アプリケーション205をロードするためのアプリケーションクラスローダ302を生成して、アプリケーション205を実行する。アプリケーションクラスローダ302は、Java標準のクラスローダを継承したものである。この構成はOSGi仕様によるものであり、公知である。
Java標準のクラスローダは生成時にURLの配列を受け取る仕様である。jarファイルのURLを受け取っておき、クラスロードの指示を受けた時にはURLで示されるjarファイルを読みこんでクラスを探索し、該当するクラスが見つかればロードする。
一般的なjarファイルの構成について図13を用いて説明する。図13は、jarファイルに格納されているファイルのリストの例である。
図13(a)は、libA.jarのファイルのリストである。Javaプログラムのクラスは、階層構造のパッケージで一意の名前になるようになっており、libA.jarにはcom/cinc/liba.AクラスのファイルであるA.classファイルが格納されている。
また、jarファイルにはマニフェストというキーバリュー形式のファイルを含めることができる。このマニフェストは、jarファイル内のMETA-INF/MANIFEST.MFファイルとなるのが、javaの仕様である。マニフェストファイルの記載例を、図14に示す。Manifest-Version項目はjavaの仕様で定義されている項目である。さらにマニフェストには独自の定義を記載してよいため、図14の例ではlibVersion項目を記載している。
また、jarファイルにはプログラムが表示する画像ファイルなどを含めることができる。図13(a)のlibA.jarは、Imageフォルダにlogo.jpgファイルを含んでいる。同様に、図13(b)には、libB.jarのファイルのリストを示す。libA.jarとlibB.jarは一般的なjarファイル形式なので、MANIFEST.MFファイルは必ず同じパスになる。ただし、これらのMANIFEST.MFファイルの内容は異なる。また、図13(a)(b)では、libA.jarとlibB.jarが偶然にImageディレクトリにlogo.jpgという画像ファイルを持つ例を示している。ただし同じlogo.jpgというファイル名でも、それぞれの画像はそれぞれ異なる。
●権限の設定
次に、セキュリティマネージャ301で権限を設定する方法について、図12を用いて説明する。図12は、セキュリティマネージャ301に指示する権限の設定を記したセキュリティポリシーファイルの一例である。
次に、セキュリティマネージャ301で権限を設定する方法について、図12を用いて説明する。図12は、セキュリティマネージャ301に指示する権限の設定を記したセキュリティポリシーファイルの一例である。
図12に示すように、Javaのセキュリティポリシーファイルは、ファイルの場所を指定して、そのファイルからロードされたクラスの権限を記載する。図12の例では、クラスの権限として、ファイルへのアクセス権限(FilePermission)が、そのクラスを含むjarファイルに関連付けて設定されている。すなわちセキュリティポリシーファイルは、jarファイルごとに権限を自保持する。図12の例では、/libディレクトリのlibA.jarファイルからロードされたクラスには、FileX.txtへの読み込み権限("read")を設定している。同様に、libB.jarには、FileY.xmlへの読み込みと書き込みの権限("read,write")を設定している。FilePermission以外にも多くの権限があるが、Javaの標準仕様なので詳細説明は省略する。
次に、Java標準のクラスローダがセキュリティマネージャ301と連携して権限を設定する処理について、図5を用いて説明する。図5は、JavaVM203上でjarファイルが含むクラスをロードする処理の流れを示すフローチャートである。なお、前述のとおり、アプリケーションクラスローダ302はJava標準のクラスローダを継承した子クラスのため、メソッドをオーバライドしなければ標準のクラスローダと同じ動きとなる。そこで以下の説明および図5では、アプリケーションクラスローダ302のことを単にクラスローダと呼んでいる。
クラスローダが図13(a)に例示したlibA.jarからクラスAを読み込む例で説明する。ロードを開始すると、クラスローダはlibA.jarから対象クラス、ここではクラスAを読み込む(S501)。次に、クラスローダはlibA.jarのファイルパスを指定して、セキュリティマネージャ301に権限を問い合わせる(S502)。
すると、セキュリティマネージャ301は、libA.jarのファイルパスを指定して、クラスAをロードしたクラスローダ(本例ではアプリケーションクラスローダ302)に権限を問い合わせる(S503)。
そして、クラスローダがgetPermissionsメソッドをオーバライドしているかを判定する(S504)。すなわち、標準のクラスローダから継承されたクラスローダにおいて、getPermissionsメソッドが標準のクラスローダから変更されているか判定する。getPermissionsメソッドは、当該クラスの権限を獲得するメソッドである。Java標準のクラスローダはgetPermissionsをオーバライドしない。Java標準のクラスローダをそのまま継承するアプリケーションクラスローダもgetPermissionsをオーバライドしない。しかし、Java標準クラスファイルは容易に解読できるため、セキュリティを高めるために独自フォーマットのクラスファイルを使う拡張をしたいケースなどがある。そこで、自作のクラスローダをオーバライドして実装できるように、このようなフローがJavaの仕様で定められている。
ステップS504において、クラスローダがgetPermissionsメソッドをオーバライドしていなければ、再度libA.jarを指定して、セキュリティマネージャ301にデフォルトの権限を問い合わせる(S505)。そして、セキュリティマネージャ301は図12に示したセキュリティポリシーファイルに従って、そこに設定された権限すなわちlibA.jarのデフォルト権限を応答する(S506)。そして、クラスローダは取得した権限をクラスAに設定する(S507)。
ステップS504において、getPermissionsメソッドをオーバライドしていれば、オーバライドしたgetPermissionsの実装で取得した権限をクラスAに設定する(S508)。
ここまで、公知である一般的なOSGiとJavaの仕様について説明した。セキュリティマネージャ301にはファイル単位での権限設定が可能だが、1プロセスで開けるファイル数には上限があるため、複数のjarファイルを1つのjarファイルにまとめたうえで、個別に権限を設定したいという課題が生じる。
●jarファイルの集約
ここから、この課題を解決するための本発明の実施形態について説明する。まず、複数のjarファイルを1つのjarファイルにまとめる方法について、図7を用いて説明する。図7は、集約対象のjarファイルを1つのjarファイルにまとめる処理の流れを示すフローチャートである。集約されるjarファイルは、1または複数のクラスを含むクラスのライブラリであり、ライブラリファイルと呼ぶこともある。またライブラリファイルを集約したファイルをアーカイブファイルまたは集約ファイルと呼ぶことがある。
ここから、この課題を解決するための本発明の実施形態について説明する。まず、複数のjarファイルを1つのjarファイルにまとめる方法について、図7を用いて説明する。図7は、集約対象のjarファイルを1つのjarファイルにまとめる処理の流れを示すフローチャートである。集約されるjarファイルは、1または複数のクラスを含むクラスのライブラリであり、ライブラリファイルと呼ぶこともある。またライブラリファイルを集約したファイルをアーカイブファイルまたは集約ファイルと呼ぶことがある。
デバイスのアプリケーションから共通して利用される機能をライブラリとしてまとめたものが、libA.jarやlibB.jarであるとする。これらはデバイス内のlibディレクトリに配置されるものとする。このとき、libディレクトリ内のjarを1つにまとめれば、FDの使用量を削減できる。
そこで、libディレクトリ内の各jarファイルをlibs.jarファイルとして集約或いは統合する処理を行う。この処理はデバイス内で行ってもよいし、デバイスにインストールするファームイメージの作成処理で行ってもよい。
集約処理では、まずlibパスにあるjarファイルをリスト化する(S701)。次に、リストの最後のファイルまで処理したかを判定する(S702)。未処理のファイルがあるなら、そのうちからjarファイルをひとつ選択する(S703)。そして、そのjarファイル名のフォルダに、jarファイルが内包していたファイルを展開する(S704)。そして、後述するクラスマップ1501に、展開したファイルのファイル名とクラスリストを記載し、リソースマップ1502に、展開したファイルのファイル名とファイルリストを記載する(S705)。
ステップS702ですべて処理済みなら、展開済みのフォルダと、クラスマップ1501を記載したファイルと、リソースマップ1502を記載したファイルとを、1つのjarファイルとして圧縮する(S706)。その結果得られるjarファイルは図15に例示したファイルそれぞれを含んでいる。
図15に、集約したlibs.jarファイルの構成を示す。図15(a)は、libs.jarファイルが含むファイルのリストである。このリストでは、集約されたライブラリのファイルやそれぞれのマニフェストファイル、それぞれのリソースファイルの所在と対応するライブラリとが特定されており、集約ファイルリストあるいはアーカイブファイルリストなどと呼ぶ。Javaの正式なクラス名は、パッケージ名とクラス名から構成される。パッケージ名に開発元やライブラリの識別子を含めることで、Log.classなどのよくある名前のクラスも一意のクラス名として識別できる。このように正式なクラスは一意の名前になるため、com/cinc/liba/A.classやcom/csoft/libb/B.classをそのまま格納している。
一方、マニフェストファイルや画像ファイルは、各jarファイル間で同一名となって競合しうるため、ステップS704で作成したjarファイル名のディレクトリlibAやlibBの下に格納している。クラスマップ1501はClassmap.csvファイル、リソースマップ1502はResourcemap.csvファイルとしてそれぞれ保持しているが、ファイル形式はcsv以外でもよい。
図15(b)と図15(c)が、ステップS705で作成したクラスマップ1501とリソースマップ1502の例である。クラスマップ1501には、クラスを含んでいたjarファイル名をキーとして、クラスのリストを記載する。リソースマップ1502には、画像やマニフェストを含んでいたjarファイル名をキーとして、各ファイルのリストを記載する。なお図15の例では、図15(a)に示したアーカイブファイルリストからリソースファイルの所在とリソースファイルを含むjarファイルを特定できる。そのため図15(c)のリソースマップはなくともよい。逆にリソースマップを保持して、アーカイブファイルリストからリソースファイルに関する記述を省いてもよい。もちろん図15のように両方含めてもよい。なお、アーカイブファイルリストにリソースファイルの所在とリソースファイルを含むjarファイルを特定する記述を含む場合、その記述のこともリソースマップと呼んでよい。
以上、複数のjarファイルを集約したlibs.jarの作成について説明した。このlibs.jarを読み込むには、集約lib用クラスローダが必要となる。集約lib用クラスローダの作成はJavaVMが行ってもよいし、アプリケーションFW204が行ってもよい。図4に、アプリケーションFW204上に集約lib用クラスローダ401を作成したときの構成図を示す。
●集約lib用クラスローダ
次に、libs.jarを読み込むための集約lib用クラスローダの構成について、図16を用いて説明する。集約lib用クラスローダ401は、クラスマップ1501を参照してクラスをロードするクラスロード部1601をもつ。また、担当するlibを管理する担当lib管理部1603を備える。また、セキュリティポリシーファイルの設定内容と、担当lib管理部1603の情報に基づいて権限を管理する権限管理部1602を備える。
次に、libs.jarを読み込むための集約lib用クラスローダの構成について、図16を用いて説明する。集約lib用クラスローダ401は、クラスマップ1501を参照してクラスをロードするクラスロード部1601をもつ。また、担当するlibを管理する担当lib管理部1603を備える。また、セキュリティポリシーファイルの設定内容と、担当lib管理部1603の情報に基づいて権限を管理する権限管理部1602を備える。
次に、集約lib用クラスローダ401の動作について、図6を用いて説明する。図6はJavaVM203上で集約lib用クラスローダ401を作成し、集約lib用クラスローダ401がクラスをロードして権限を設定する処理の流れを示すフローチャートである。この説明例では、libs.jarからクラスAをロードするとして説明する。
まず、JavaVM203上で集約lib用クラスローダを作成する(S609)。作成はJavaVMが行ってもよいし、アプリケーションFW204が行ってもよい。集約lib用クラスローダは、集約前の個別のjarファイルの数と同じだけ作るのが、もっとも単純である。次に、作成したクラスローダに担当ファイル名(あるいは担当ライブラリファイルの名称)を設定する(S610)。担当ファイル名の例は、libA.jarやlibB.jarである。この説明の例では、libA.jarを設定したものとする。設定された担当ファイル名は、所定の記憶場所に保持される。
次に、libs.jarのクラスマップ1501を参照して、libA.jarのクラスのリストを取得する(S611)。そして、libs.jarからクラスをロードする(S612)。ステップS612の詳細は後述する。そして、クラスのロード処理が例外を投げたがどうかを確認する(S613)。例外を投げたとは、たとえばロード処理の結果として、該当するクラスが見つからないなどの応答が返された場合などである。
例外を投げていなければ、Java標準のクラスローダと同様にlibA.jarを指定して権限を問い合わせる(S602)。セキュリティマネージャ301は、クラスAをロードしたクラスローダに権限を問い合わせる(S603)。集約lib用クラスローダはgetPermissionsメソッドをオーバライドしているので、ステップS604ではYesしかありえない。なおS604(S504も同様)では判定を行わず、getPermissionsメソッドを実行してもよい。その場合、オーバライドされていなければS505-S506が実行され、オーバライドされていればS614が実行される。そして、オーバライドしたgetPermissionsメソッドによって権限を取得する(S614)。ステップS614の処理の詳細は後述する。そして、その取得した権限をクラスAに設定する(S608)。
●権限の設定
ステップS614の処理の詳細について、図9を用いて説明する。権限の取得のためのgetPermissionsメソッドは、クラスファイルのパスであるCodeSourceを受け取る(S901)。しかし、本発明では同じCodeSourceについて異なる権限を取得するために、受け取ったCodeSourceは参照しない。代わりに、図12に示したセキュリティポリシーファイルを参照して、ステップS610で設定した担当ファイル名に該当するファイルの権限を応答する(S902)。図12の例では、例えば担当ファイル名がlibA.jarであれば、FileX.txtなるファイルについて読み出し権限があることを応答する。なお場合によっては、セキュリティポリシーファイルを参照せず、独自の権限設定をしてもよい。
ステップS614の処理の詳細について、図9を用いて説明する。権限の取得のためのgetPermissionsメソッドは、クラスファイルのパスであるCodeSourceを受け取る(S901)。しかし、本発明では同じCodeSourceについて異なる権限を取得するために、受け取ったCodeSourceは参照しない。代わりに、図12に示したセキュリティポリシーファイルを参照して、ステップS610で設定した担当ファイル名に該当するファイルの権限を応答する(S902)。図12の例では、例えば担当ファイル名がlibA.jarであれば、FileX.txtなるファイルについて読み出し権限があることを応答する。なお場合によっては、セキュリティポリシーファイルを参照せず、独自の権限設定をしてもよい。
●クラスのロード
次に、ステップS612の詳細について、図10を用いて説明する。Java仕様のクラスロード用メソッドには、クラス名だけを受け取るメソッドと、クラス名とresolveフラグを受け取るメソッドがあるが、本発明の実施はどちらでも可能である。図10では、後者のメソッドを例に説明する。なお、クラス名だけを受け取るメソッドの場合は、resolveフラグをfalseで、クラス名とresolveフラグを受け取るメソッドを呼ぶだけである。
次に、ステップS612の詳細について、図10を用いて説明する。Java仕様のクラスロード用メソッドには、クラス名だけを受け取るメソッドと、クラス名とresolveフラグを受け取るメソッドがあるが、本発明の実施はどちらでも可能である。図10では、後者のメソッドを例に説明する。なお、クラス名だけを受け取るメソッドの場合は、resolveフラグをfalseで、クラス名とresolveフラグを受け取るメソッドを呼ぶだけである。
まず、クラスのロード指示で、クラス名とresolveフラグを受け取る(S1001)。すると、クラスローダは親のクラスローダが存在するかを確認する(S1002)。親のクラスローダが存在するなら、親のクラスローダでクラスをロードする(S1003)。そして、クラスをロードできたかを判定する(S1004)。ロードできていれば、そのクラスを応答する(S1005)。応答されるクラスとは、たとえばクラス名等のクラスの識別情報であってよい。
ステップS1001、S1002,S1003,S1004は一般的なクラスローダと同様の処理である。Javaではシステム用のクラスローダを親としてアプリ用のクラスローダが作られるが、Java標準のクラスはシステムのクラスローダでロードするため、このような動作となっている。
ステップS1004でクラスをロードできなかった場合に、本実施形態の集約lib用クラスローダの特徴的な処理を始める。まず、クラスマップ1501を参照して、ステップS1001で受け取ったクラス名が、担当lib管理部1603で担当と設定されたjarファイルのものかを判定する(S1006)。担当するクラスの判定では、担当lib管理部1603に設定された担当Jarファイルのクラスであれば、自身が担当するクラスと判定する(S1007)。担当するクラスでなければ、例外を投げる(S1008)。
担当するクラスであれば、ロードしようとするクラスがロード済みクラスにあるかを判定する(S1009)。ロード済みクラスかどうかの判定は、Java標準の関数で行える(S1010)。ロード済みクラスであれば、Resolveフラグがtrueかを判定する(S504)。trueであれば、Java標準の関数であるresolveClassメソッドによって、ロードしたクラスのリンク関係の処理を実行する(S1012)。そして、ステップS1005と同様にクラスを応答する(S1013)。
ステップS1010でロード済みクラスでなかったときは、担当と設定されているjarファイルから担当するクラスを探索する(S1014)。そして、クラスが見つかったかを判定する(S1015)。クラスが見つかれば、ステップS1011以降の処理を行う。
ステップS1015でクラスが見つからなければ、ステップS1008以降の処理を行う。ただし、ステップS1015でクラスが見つからない場合は、ステップS1006で参照したクラスマップ1501が壊れているときか、libs.jarファイルが壊れているときのみであり、通常は発生しない。
以上、1つにまとめたjarファイルの作成方法と、まとめたjarファイルをロードする専用のクラスローダについて説明した。
以上説明した構成及び手順により、本実施形態によれば、複数のjarファイルを1つに集約することで、システム資源、特にファイルディスクリプタを節約できる。これにより、ファイルディスクリプタの上限に起因する、アプリケーションから同時に開くことのできるファイル数を実質的に増加させることができる。併せて、ロードされるクラスの権限を、集約前のファイル単位で管理することができる。
<実施形態2>
実施形態1では、1つのjarファイルにまとめたクラスをそれぞれ異なる権限で実行する方法について説明した。しかし、1つのjarファイルにまとめて生じる課題には、権限管理のほかに、画像ファイルなどのリソースファイルの競合がある。Javaの仕様で定義されているリソース取得用のメソッドには、findResource、getResource、getResourceAsStreamがある。アプリケーション205はこれらのメソッドを用いることで、jarファイル内部のマニフェストファイルや画像ファイルなどのリソースファイルを取得する。
実施形態1では、1つのjarファイルにまとめたクラスをそれぞれ異なる権限で実行する方法について説明した。しかし、1つのjarファイルにまとめて生じる課題には、権限管理のほかに、画像ファイルなどのリソースファイルの競合がある。Javaの仕様で定義されているリソース取得用のメソッドには、findResource、getResource、getResourceAsStreamがある。アプリケーション205はこれらのメソッドを用いることで、jarファイル内部のマニフェストファイルや画像ファイルなどのリソースファイルを取得する。
そこで、リソースファイルの競合を防ぎつつ、従来通りにリソースを取得できるクラスローダの作成方法について、実施形態2として説明する。
実施形態2にかかる集約lib用クラスローダ401の構成について、図17を用いて説明する。クラスロード部1601、権限管理部1602、担当lib管理部1603は図16の説明と同様である。加えて、リソースマップ1502を参照してリソースを管理するリソース管理部1701を備える。
次に実施形態2にかかるリソース取得の処理の流れについて、図8を用いて説明する。具体例として、libA.jarのA.class内で作成したプログラムが"META-INF/MANIFEST.MF"を指定してfindResourceメソッドを実行する場合での説明とする。
初めに、集約lib用クラスローダがjarファイル内のリソースを指すファイルパスを受け取る(S801)。すると、リソース管理部1701は、受け取ったファイルパスを担当lib管理部1603に応じて書き換える(S802)。具体的には、"libA/META-INF/MANIFEST.MF"と書き換える。そして、Java標準のfindResourceメソッドを実行して、libs.jarのlibAディレクトリのマニフェストを応答する(S803)。リソースファイルは各jarファイル間で同一名となって競合しうるため、集約処理においてステップS704で作成したjarファイル名のディレクトリ(例えばlibAやlibB)の下に格納している。またファイルのリストでも、図15(a)に示したように、そのディレクトリも含めてファイル名が特定されている。そのため、集約前のjarファイルでは同一の名称が採用され得るリソースファイルであっても、集約されたjarファイルでは固有に識別することができる。
以上、1つのjarファイルにまとめるときに競合しうるリソースファイルを、まとめた後も同様に取得するための方法について説明した。
<実施形態3>
実施形態1では、1つのjarファイルから異なる権限でプログラムを実行する方法について説明した。また、実施形態2では、複数のjarファイルで競合するリソースがある場合でも適切なリソースを取得する方法について説明した。これらの実施形態は、まとめる前の集約対象である各jarファイルのクラスとリソースのロードを、それぞれ異なる集約lib用クラスローダが担当した。
実施形態1では、1つのjarファイルから異なる権限でプログラムを実行する方法について説明した。また、実施形態2では、複数のjarファイルで競合するリソースがある場合でも適切なリソースを取得する方法について説明した。これらの実施形態は、まとめる前の集約対象である各jarファイルのクラスとリソースのロードを、それぞれ異なる集約lib用クラスローダが担当した。
しかし、同じ権限のjarファイルが複数存在し、かつ、それらのjar間でリソースが競合しなければ、1つのクラスローダで複数のjarを担当してよい。マニフェストについては、マニフェストの内容をそもそも参照しないライブラリであれば、1つのjarファイルにする過程でマニフェストが失われても問題は生じない。
そこで、1つの集約lib用クラスローダが複数のjarファイルを担当する例を、実施形態3として説明する。
libs.jarファイルとして、libディレクトリ内の各jarファイルを集約する処理は、図7と同様である。ただし、リソースが競合しないので、ステップS704と異なり、jarファイル名のフォルダを作る必要はない。リソースファイル名でリソースファイルを識別可能なためである。図18に集約前後の各jarファイルの構成を示す。図18(a)は集約前のlibA.jar、図18(b)は集約前のlibB.jarを示す。図18(c)はlibA.jarとlibB.jarを集約したlibs.jarである。リソースが競合しないので、フラットに、すなわちリソースファイルのためのフォルダを設けることなくすべてのファイルを展開して再圧縮するのみでよい。マニフェストについては、libA.jarとlibB.jarが、集約しても競合しない独自の項目を定義しているときに、それらの項目をすべて集約後のlibs.jarのMANIFEST.MFに記載すればよい。
集約lib用クラスローダの動作は実施形態1と同様であるが、ステップS610では、同じ権限の複数のjarファイルを担当ファイル名として設定する。また、リソース取得処理のステップS802では、ファイルパスの書き換えはしないでよい。
以上、同じ権限のライブラリが複数存在し、かつ、それらのライブラリ間でリソースが競合しない場合に、一つの集約lib用クラスローダで複数のjarを担当する方法について説明した。
なお、集約前の複数のjarファイルを1つのクラスローダが担当するための前述した条件は、それが満たされていることを前提として上述の構成を採用してもよい。或いは、条件が具備されている複数の集約対象のjarファイルを集約して1つの集約jarファイルを生成してもよい。
後者の手順を、図7に基づいて説明する。まずS701では、jarファイルをリスト化するとともに、そのうちの1つのjarファイルに着目し、それを基準jarファイルとする。また、基準jarファイルの権限について取得しておき、その名称のフォルダに転回しておく。
そしてS703では、基準jarファイルおよび処理済みのjarファイルを除くjarファイルのひとつを対象jarファイルとして選択し、対象jarファイルの権限を取得する。そして基準jarファイルと対象jarファイルそれぞれの権限と、リソースファイルと、マニフェストファイルとを比較し、権限が互いに同一であり、かつリソースファイルとマニフェストの内容とに重複がないか判定する。これらの条件が満たされたならば、対象jarファイルを集約の対象としてS704に進む。一方、条件が満たされないならば対象jarファイルは集約の対象外としてS702に戻る。S705はスキップしてよい。
ステップS706では集約したjarファイルを生成するが、その際にはリソースファイルは特にフォルダにいれず、そのまま集約jarファイルに含めてよい。マニフェストファイルも一つにまとめてよい。さらに新たに作成した集約jarファイルのセキュリティポリシーをセキュリティマネージャ301に登録させる。
以上の手順により、一つのクラスローダ特にjava標準のクラスローダによってクラスをロード可能な集約jarファイルを生成することができる。集約したjarファイルについて、必ずしも元のjarファイル名のフォルダの下に集約前のファイルを保持する必要がない。
これによりjarファイルの数を減らすことができ、FDを節約してより多くのアプリケーションを並列に実行することができる。
<実施形態4>
上記実施形態はlibs.jarと集約lib用クラスローダ401のみで実施できる。そのため、集約lib用クラスローダ401は、アプリケーションFW204上で作成してもよいし、アプリケーションFW204がない環境で作成してもよい。
上記実施形態はlibs.jarと集約lib用クラスローダ401のみで実施できる。そのため、集約lib用クラスローダ401は、アプリケーションFW204上で作成してもよいし、アプリケーションFW204がない環境で作成してもよい。
しかし、FDを多く消費するのは、アプリケーションFW204上で多くのjarを実行する場合のため、アプリケーションFW204上で集約lib用クラスローダ401を用いる方が自然である。そこで、アプリケーションFW204上で集約lib用クラスローダ401を用いる方法について、実施形態4として説明する。
図4は、集約lib用クラスローダを備えるアプリケーションFW204の構成を示す図である。
実施形態4にかかるアプリケーションFW204の起動処理について、図11のフローチャートを用いて説明する。なおアプリケーションFW204のことをアプリケーション実行の基盤となることからアプリケーションプラットフォームと呼ぶこともある。アプリケーションFW204は起動されると、集約lib用クラスローダを生成する(S1101)。ステップS1101において、生成するクラスローダは集約する前のjarの数と同数にするのが単純である。Javaのクラスローダは生成時にURLの配列を受け取る仕様であるため、すべての集約lib用クラスローダのインスタンスは、libs.jarのURLを受け取ることになる。ただし、各インスタンスに設定する担当ファイル名は、ステップS610で説明した通り、異なるファイル名となる。
そして、アプリケーションFW204は、デバイスにインストールされているアプリケーション205のリストを取得する(S1102)。もしすべてのアプリを開始済みであれば(S1103)、起動は終了する。もしそうでなければ、開始対象のアプリを1つ選択する(S1104)。そして、そのアプリを実行するためのアプリケーションクラスローダ302を生成する(S1105)。
そして、そのアプリケーションクラスローダ302が集約lib用クラスローダ401を参照するように設定する(S1106)。設定方法としては、アプリケーションクラスローダ302の親クラスとして設定してもよいし、単に参照だけを設定して必要なときにクラスロード処理を委譲できるようにするだけでもよい。
そして、アプリケーションクラスローダ302でアプリケーション205のクラスをロードして開始する(S1107)。
以上、アプリケーションFW204上で集約lib用クラスローダ401を用いる方法について説明した。このような手順によりアプリケーションFW204上で集約lib用クラスローダ401を用いることができる。それにより実施形態1乃至3の効果、すなわちFDの消費を抑制してより多くのアプリケーションを並列的に実行することが可能となる。
[その他の実施例]
本発明は、上述の実施形態の1以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける1つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、1以上の機能を実現する回路(例えば、ASIC)によっても実現可能である。
[その他の実施例]
本発明は、上述の実施形態の1以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける1つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、1以上の機能を実現する回路(例えば、ASIC)によっても実現可能である。
発明は上記実施形態に制限されるものではなく、発明の精神及び範囲から離脱することなく、様々な変更及び変形が可能である。従って、発明の範囲を公にするために請求項を添付する。
100 情報処理装置、401 集約lib用クラスローダ
Claims (12)
- クラスを含む複数のライブラリファイルを集約したアーカイブファイルから、前記複数のライブラリファイルのいずれかに含まれたクラスをロードするクラスローダを有する情報処理装置であって、
前記複数のライブラリファイルそれぞれに関連付けて前記複数のライブラリファイルそれぞれに含まれたクラスの権限を保持する第1の保持手段を有し、
前記アーカイブファイルは、前記複数のライブラリファイルそれぞれに含まれた前記クラスを特定するクラスマップを含み、
前記クラスローダは、
設定された担当ライブラリファイルを特定する情報を保持する第2の保持手段と、
前記クラスマップに基づいて、前記アーカイブファイルに含まれた前記担当ライブラリファイルから、指定されたクラスをロードするロード手段と、
前記ロード手段によりロードしたクラスに対して、当該クラスを含む前記担当ライブラリファイルに関連付けて前記第1の保持手段により保持されている権限を設定する権限設定手段と、を有する
ことを特徴とする情報処理装置。 - 請求項1に記載の情報処理装置であって、
前記アーカイブファイルは、前記複数のライブラリファイルそれぞれに含まれたリソースファイルを特定するリソースマップを含み、
前記クラスローダは、前記リソースマップに基づいて、前記ロード手段によりロードしたクラスに対して、当該クラスを含む前記担当ライブラリファイルに含まれたリソースファイルを取得するリソース取得手段を更に有する
ことを特徴とする情報処理装置。 - 請求項1または2に記載の情報処理装置であって、
前記第2の保持手段は、担当ライブラリファイルとして、前記第1の保持手段により同一の権限が保持されているクラスを含むライブラリファイルを特定する情報を保持する
ことを特徴とする情報処理装置。 - 請求項1乃至3のいずれか一項に記載の情報処理装置であって、
前記アーカイブファイルを読みこんで実行するアプリケーションプラットフォームをさらに有し、
前記アプリケーションプラットフォームは、
起動されると、アプリケーションごとに固有のクラスローダとして前記クラスローダを生成し、
前記クラスローダでロードされた前記アプリケーションを、当該アプリケーションのクラスで実行する
ことを特徴とする情報処理装置。 - 請求項1乃至4のいずれか一項に記載のクラスローダとしてコンピュータを機能させるためのプログラム。
- クラスを含む複数のライブラリファイルを集約したアーカイブファイルから、前記複数のライブラリファイルのいずれかに含まれたクラスをロードするクラスローダを有する情報処理装置によるクラスのロード方法であって、
前記情報処理装置は、前記複数のライブラリファイルそれぞれに関連付けて前記複数のライブラリファイルそれぞれに含まれたクラスの権限を保持する第1の保持手段を有し、
前記アーカイブファイルは、前記複数のライブラリファイルそれぞれに含まれた前記クラスを特定するクラスマップを含み、
前記情報処理装置は、
設定された担当ライブラリファイルを特定する情報を保持し、
前記クラスマップに基づいて、前記アーカイブファイルに含まれた前記担当ライブラリファイルから、指定されたクラスをロードし、
前記ロードしたクラスに対して、当該クラスを含む前記担当ライブラリファイルに関連付けて前記第1の保持手段により保持されている権限を設定する
ことを特徴とするクラスのロード方法。 - 複数のライブラリファイルを1つのアーカイブファイルに集約する情報処理装置であって、
集約対象のライブラリファイルと該ライブラリファイルに含まれたクラスとを関連付けたクラスマップを生成する第1の生成手段と、
前記集約対象のライブラリファイルと該ライブラリファイルに含まれたリソースファイルとを関連付けたリソースマップを生成する第2の生成手段と、
集約対象のライブラリファイルに含まれたクラスの所在を示すリストと前記クラスマップと前記リソースマップとを含むアーカイブファイルを生成する第3の生成手段と、を有する
ことを特徴とする情報処理装置。 - 請求項7に記載の情報処理装置であって、
前記集約対象のライブラリファイルに同一の権限が設定されている場合には、前記第1の生成手段は前記クラスマップを生成しない
ことを特徴とする情報処理装置。 - 請求項7または8に記載の情報処理装置であって、
前記集約対象のライブラリファイルが異なる名称のリソースファイルを含む場合には、前記第2の生成手段は前記リソースマップを生成しない
ことを特徴とする情報処理装置。 - 請求項9に記載の情報処理装置であって、
前記第3の生成手段は、前記アーカイブファイルを、標準のクラスローダで前記アーカイブファイルに含まれたクラスをロードできるアーカイブファイルとして生成する
ことを特徴とする情報処理装置。 - 請求項7乃至10のいずれか一項に記載の情報処理装置としてコンピュータを機能させるためのプログラム。
- 第1の作成手段と第2の作成手段と第3の作成手段とを有する情報処理装置により複数のライブラリファイルを1つのアーカイブファイルに集約する方法であって、
前記第1の作成手段が、集約対象のライブラリファイルと該ライブラリファイルに含まれたクラスとを関連付けたクラスマップを生成し、
前記第2の作成手段が、前記集約対象のライブラリファイルと該ライブラリファイルに含まれたリソースファイルとを関連付けたリソースマップを生成し、
前記第3の作成手段が、集約対象のライブラリファイルに含まれたクラスの所在を示すリストと前記クラスマップと前記リソースマップとを含むアーカイブファイルを生成する
ことを特徴とする方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2021182649A JP2023070452A (ja) | 2021-11-09 | 2021-11-09 | 情報処理装置、クラスのロード方法、集約の方法およびプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2021182649A JP2023070452A (ja) | 2021-11-09 | 2021-11-09 | 情報処理装置、クラスのロード方法、集約の方法およびプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2023070452A true JP2023070452A (ja) | 2023-05-19 |
Family
ID=86331528
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2021182649A Pending JP2023070452A (ja) | 2021-11-09 | 2021-11-09 | 情報処理装置、クラスのロード方法、集約の方法およびプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2023070452A (ja) |
-
2021
- 2021-11-09 JP JP2021182649A patent/JP2023070452A/ja active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110389829B (zh) | 多租户环境中扩展对象的分类与分发 | |
EP3336690B1 (en) | Extensible data transformation authoring and validation system | |
US9880889B2 (en) | Virtual application extension points | |
US9223568B2 (en) | Designing and cross-configuring software | |
US8838644B2 (en) | Extensible access control list framework | |
US20100205604A1 (en) | Systems and methods for efficiently running multiple instances of multiple applications | |
KR20110128846A (ko) | 장치와 웹 서비스 간에 브라우저 캐시를 동기화하는 프로그래밍 모델 | |
US20110154378A1 (en) | Api namespace virtualization | |
CN102279748A (zh) | 远程存储本地执行的软件使用方法、系统、服务器及客户端 | |
KR20070049166A (ko) | 목표 기기 상에서의 종속 소프트웨어 패키지의 검출 및이용을 자동화하기 위한 방법 및 소프트웨어 리포지터리를생성하기 위한 시스템 | |
US20150089408A1 (en) | Method and framework for content viewer integrations | |
US9928010B2 (en) | Methods and apparatus to re-direct detected access requests in a modularized virtualization topology using virtual hard disks | |
EP3518116A1 (en) | Method and apparatus for layered access of file in virtualization instance | |
US20160378348A1 (en) | Methods and apparatus to manage inter-virtual disk relations in a modularized virtualization topology using virtual hard disks | |
US9804789B2 (en) | Methods and apparatus to apply a modularized virtualization topology using virtual hard disks | |
CN110688174A (zh) | 容器启动方法、存储介质和电子设备 | |
WO2021040843A1 (en) | Hydration of applications | |
US9058576B2 (en) | Multiple project areas in a development environment | |
WO2007123620A1 (en) | Isolation of application execution | |
US20130311603A1 (en) | On-demand tethered greedy virtual application appliance | |
US20230195695A1 (en) | File Sharing Method and Terminal Device | |
JP6418419B2 (ja) | ハードディスクがアプリケーションコードを実行するための方法および装置 | |
JP6103978B2 (ja) | 配信装置、デバイス装置、配信装置の制御方法およびコンピュータプログラム | |
JP2023070452A (ja) | 情報処理装置、クラスのロード方法、集約の方法およびプログラム | |
US20060253858A1 (en) | Software service application and method of servicing a software application |