(57)【要約】【課題】ソフトウェアを解析して、そのソフトウェア内において、ユーザの必要とする機能を備えたソフトウェアを構築するソフトウェア自動構成装置等を提供する。【解決手段】ソフトウェア自動構成装置１ａは、ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから依存クラスを抽出する依存クラス抽出部２１２ａ、依存クラスが依存する提供クラスを抽出する関係抽出部２１３ａ、提供クラスから依存クラスまでの関係を基にモジュールを頂点とするグラフの経路を構築するグラフ構築部２１４ａ、グラフの経路を逆方向に辿りグラフに逆方向の経路を加える逆参照構築部２１５ａ、モジュールを出発点として逆方向の経路が加えられたグラフの経路を辿り、到達可能な、モジュールとは異なるモジュールを収集するモジュール収集部２１６ａとを備える。【選択図】      図２３
2016170515.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出する依存クラス抽出手段と、
前記依存クラスが依存する提供クラスを抽出する関係抽出手段と、
前記提供クラスから前記依存クラスまでの関係を基に、前記モジュールを頂点とするグラフの経路を構築するグラフ構築手段と、
前記グラフの経路を逆方向に辿り、前記グラフに前記逆方向の経路を加える逆参照構築手段と、
前記モジュールを出発点として、前記逆方向の経路が加えられた前記グラフの経路を辿り、到達可能な、前記モジュールとは異なるモジュールを収集するモジュール収集手段
とを備えるソフトウェア自動構成装置。
【請求項２】
前記依存とは、継承関係である、
請求項１に記載のソフトウェア自動構成装置。
【請求項３】
前記ソフトウェアプログラムが備える複数の機能の内、ユーザが利用したい機能を受け付ける始動手段、
を更に備える請求項１又は２に記載のソフトウェア自動構成装置。
【請求項４】
前記ソフトウェアプログラムが備える入力モジュール群を格納する永続記憶手段と、
前記永続記憶手段から前記入力モジュール群を取得し、前記入力モジュール群の各々のモジュールに属する少なくとも１つの前記提供クラスを抽出する提供クラス抽出手段、
とを更に備える請求項１乃至３のいずれかに記載のソフトウェア自動構成装置。
【請求項５】
前記モジュール収集手段が収集したモジュールは、出力モジュール群として前記永続記憶手段に格納される、
請求項１乃至４のいずれかに記載のソフトウェア自動構成装置。
【請求項６】
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出し、
前記依存クラスが依存する提供クラスを抽出し、
前記提供クラスから前記依存クラスまでの関係を基に、前記モジュールを頂点とするグラフの経路を構築し、
前記グラフの経路を逆方向に辿り、前記グラフに前記逆方向の経路を加え、
前記モジュールを出発点として、前記逆方向の経路が加えられた前記グラフの経路を辿り、到達可能な、前記モジュールとは異なるモジュールを収集する、
ことを備えるソフトウェア自動構成方法。
【請求項７】
前記ソフトウェアプログラムが備える複数の機能の内、ユーザが利用したい機能を受け付けること、
を更に備える請求項６に記載のソフトウェア自動構成方法。
【請求項８】
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出する機能と、
前記依存クラスが依存する提供クラスを抽出する機能と、
前記提供クラスから前記依存クラスまでの関係を基に、前記モジュールを頂点とするグラフの経路を構築する機能と、
前記グラフの経路を逆方向に辿り、前記グラフに前記逆方向の経路を加える機能と、
前記モジュールを出発点として、前記逆方向の経路が加えられた前記グラフの経路を辿り、到達可能な、前記モジュールとは異なるモジュールを収集する機能、
をコンピュータに実行させるためのソフトウェア自動構成プログラム。
【請求項９】
前記ソフトウェアプログラムが備える複数の機能の内、ユーザが利用したい機能を受け付ける機能、
を更に備える請求項８に記載のソフトウェア自動構成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアを構築するためのモジュール集合からソフトウェアを自動的に構築する技術に関する。
【背景技術】
【０００２】
アプリケーションサーバの標準仕様であるＪａｖａ（登録商標、以下同様）ＥＥ(旧名称Ｊ２ＥＥ)は、バージョンアップの度に機能が追加された。そのため、Ｊａｖａ_ＥＥ内における一部の機能を利用したい場合でも、全ての機能を含んだアプリケーションサーバを実行する必要があり、実行効率が悪かった。アプリケーションサーバを軽量化するために、Ｊａｖａ_ＥＥ_６のバージョンからは、プロファイルという考え方が導入された。このプロファイル導入により、Ｊａｖａ_ＥＥ_６では、全ての機能を利用したい場合は「フルプロファイル」を、ウェブアプリケーションに限定した機能を利用したい場合は軽量な「ウェブプロファイル」を利用できる。またＪａｖａ_ＥＥに準拠したアプリケーションサーバは独自のプロファイルを提供してもよい。
【０００３】
あるソフトウェアのプロファイルを作成するとは、あるソフトウェアの全機能を実現するためのモジュール集合から、必要な一部の機能を実現するに足る部分集合を抽出することを意味する。そのソフトウェアのベンダが、プロファイルを、固定的に提供してもよいし、利用者が自身で作成してもよい。
【０００４】
あるソフトウェアが備える全機能のうち、一部の機能だけを実現可能とする縮小版ソフトウェアのサブセットを作成するためには、全機能を実現するモジュール集合から、その一部の機能の実現に必要なモジュールの集合のみを抽出すればよい。
【０００５】
しかしながら、ソフトウェアを使用するユーザ側で、縮小版ソフトウェアを構築しようとした場合、適切なモジュールを抽出することは一般的に困難である。この理由は、ユーザ側において、モジュール機能の詳細を理解したり、モジュール間の依存関係を把握したりするなど、ソフトウェア設計者と同等の知識が求められるからである。このため、ユーザ側におけるモジュールの抽出は現実的ではない。
【０００６】
特許文献１は、対象ソフトウェアとは別に、モジュールの組み合わせに関するデータベースを使用することにより、モジュールの集合を抽出する技術を開示する。
【０００７】
特許文献２は、依存関係を解決してモジュールを収集する技術を開示する。
【０００８】
特許文献３は、木構造のデータベースを使用することにより、モジュール集合を抽出する技術を開示する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００９−２０５１９０号公報
【特許文献２】特開２０１３−６９０８６号公報
【特許文献３】特開２００８−２４２８７３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
特許文献１は、モジュールの集合を抽出するために、対象ソフトウェアとは別に、モジュールの組み合わせに関するデータベースを使用する。すなわち、対象ソフトウェアに加えて、補助的な情報を別途準備する必要がある。しかしながら、ソフトウェアベンダはこの補助的な情報を公開しておらず、ユーザ側の手元にはソフトウェアコードがあるのみであるため、ユーザ側におけるモジュールの抽出はほぼ不可能であるという問題がある。
【００１１】
特許文献２は、依存関係を解決してモジュールを収集する。しかし、インタフェースと実装とが分離されている場合、モジュール間は粗結合になり、単純に依存関係を追うだけでは、必要な機能を実現するに足るモジュールを列挙することができないという問題がある。
【００１２】
特許文献３は、ソフトウェアそのものは解析対象外で、別途データベースを準備する必要がある。当該データベースを利用してモジュールの集合を抽出するには、既存の木構造データベースが必要であるという問題がある。
【００１３】
本発明は、上記の問題点を解決するべくなされた。本発明は、ソフトウェアそのものを解析して、そのソフトウェア内において、ユーザが必要とする機能を備えたソフトウェアを構築することを主たる目的とする。
【課題を解決するための手段】
【００１４】
上記課題を解決するため、本発明の第１の観点は、
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出する依存クラス抽出手段と、
依存クラスが依存する提供クラスを抽出する関係抽出手段と、
提供クラスから依存クラスまでの関係を基に、モジュールを頂点とするグラフの経路を構築するグラフ構築手段と、
グラフの経路を逆方向に辿り、グラフに逆方向の経路を加える逆参照構築手段と、
モジュールを出発点として、逆方向の経路が加えられたグラフの経路を辿り、到達可能な、モジュールとは異なるモジュールを収集するモジュール収集手段
とを備えるソフトウェア自動構成装置である。
【００１５】
本発明の第２の観点は、
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出し、
依存クラスが依存する提供クラスを抽出し、
提供クラスから依存クラスまでの関係を基に、モジュールを頂点とするグラフの経路を構築し、
グラフの経路を逆方向に辿り、グラフに逆方向の経路を加え、
モジュールを出発点として、逆方向の経路が加えられたグラフの経路を辿り、到達可能な、モジュールとは異なるモジュールを収集する、
ことを備えるソフトウェア自動構成方法である。
【００１６】
本発明の第３の観点は、
ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出する機能と、
依存クラスが依存する提供クラスを抽出する機能と、
提供クラスから依存クラスまでの関係を基に、モジュールを頂点とするグラフの経路を構築する機能と、
グラフの経路を逆方向に辿り、グラフに逆方向の経路を加える機能と、
モジュールを出発点として、逆方向の経路が加えられたグラフの経路を辿り、到達可能な、モジュールとは異なるモジュールを収集する機能、
をコンピュータに実行させるためのソフトウェア自動構成プログラムである。
【発明の効果】
【００１７】
本発明によれば、ソフトウェアそのものを解析して、そのソフトウェア内において、ユーザの必要とする機能を備えたソフトウェアを構築することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の第１の実施形態に係るソフトウェア自動構成装置のハードウェア構成の一例を示す図である。
【図２】本発明の第１の実施形態に係るソフトウェア自動構成装置のソフトウェアを含む構成の一例を示す図である。
【図３】永続記憶装置内の入力モジュール群のデータ構成を示す図である。
【図４】標準化されたクラスファイルのフォーマットの一例を示す図である。
【図５】始動部の動作を示すフローチャートである。
【図６】モジュールリスト記憶部内の内部データを示す図である。
【図７】提供クラス抽出部の動作を示すフローチャートである。
【図８】提供クラス抽出部処理完了時点におけるグラフテーブルのデータ内容を示す図である。
【図９】依存クラス抽出部の動作を示すフローチャートである。
【図１０】クラスファイルとメモリ構造との関係を示す概念図である。
【図１１】関係抽出部の動作を示すフローチャートである。
【図１２】関係抽出部処理完了時点におけるグラフテーブルのデータ内容を示す図である。
【図１３】グラフ構築部の動作を示すフローチャートである。
【図１４】グラフ構築部処理完了時点におけるグラフテーブルのデータ内容を示す図である。
【図１５】モジュール間の依存関係を示すグラフ図である。
【図１６】逆参照構築部の動作を示すフローチャートである。
【図１７】逆参照構築部処理完了時点におけるグラフテーブルのデータ内容を示す図である。
【図１８】モジュール間の依存関係を示すグラフ図である。
【図１９】モジュール収集部の動作を示すフローチャートである。
【図２０】モジュール収集部のグラフ探索動作を示すフローチャートである。
【図２１】モジュール収集部の動作終了時における永続記憶装置内部の出力モジュール群のデータ内容を示す図である。
【図２２】モジュール収集部の動作終了時における永続記憶装置内部の出力モジュール群の依存関係を示すグラフ図である。
【図２３】本発明の第２の実施形態に係るソフトウェア自動構成装置の構成図である。
【発明を実施するための形態】
【００１９】
次に図面を参照して、本発明の実施形態を説明する。以下の図面の記載において、同一又は類似の部分には同一又は類似の符号を付している。ただし、図面は本発明の実施形態における構成を模式的に表している。更に以下に記載される本発明の実施形態は一例であり、その本質を同一とする範囲において適宜変更可能である。
【００２０】
＜第１の実施形態＞
（ソフトウェア自動構成装置）
図１は、本発明の第１の実施形態に係るソフトウェア自動構成装置のハードウェアを構成する情報処理装置１００の一例である。情報処理装置１００は、ＣＰＵ（Central Processing Unit）１１０、記憶装置１２０、入力装置１３０、永続記憶装置１４０および表示装置１５０を備えている。
【００２１】
記憶装置１２０は、ＣＰＵ１１０が実行するプログラムおよびデータを格納するメモリであり、ＲＯＭ（Read Only Memory）およびＲＡＭ(Random Access Memory)等から構成される。
【００２２】
入力装置１３０は、ユーザに対して選択可能な機能を提示して、その当該ユーザの選択結果（即ち、ユーザが選択した機能のリスト）を受け付ける入力部である。入力装置１３０は、例えば、タッチパネル、キーボード、マウス、入力ボタン等から構成される。選択可能なモジュールをどのように定義し管理するかの詳細は、本発明とは別に定義されるものとする。
【００２３】
永続記憶装置１４０は、本装置の入力データおよび出力データを保存しておくメモリであり、例えば、永続ストレージである。永続記憶装置１４０は、コンピュータにおけるファイル管理や、外部記憶装置（不図示）との入出力等において使用される、特定のドメインでセッションを越えて使われるデータを保存する。永続記憶装置１４０は、自身に関連付けられているインスタンスが存在する間のみならず、現在使用していないインスタンスも格納する。これにより、所定のインスタンスの再利用を可能とする。
【００２４】
表示装置１５０は、本装置の処理過程および処理結果をユーザが認識できるように表示する装置である。表示装置１５０は、例えば液晶表示パネル等から構成され、入力装置１３０と一体とされるタブレット端末等であってもよい。
【００２５】
ＣＰＵ１１０は、記憶装置１２０からプログラムを適宜ロードして実行する。尚、ＣＰＵ１１０自身がプログラムを電子回路として備えていてもよい。ＣＰＵ１１０は、永続記憶装置１４０からデータを読み込み、入力装置１３０により指定された機能を実現させるソフトウェアを自動構成し、結果を永続記憶装置１４０および表示装置１５０に出力する。
【００２６】
図２は、本発明の第１の実施形態に係るソフトウェア自動構成装置１の構成の一例を示す図である。図２は、図１で示した情報処理装置１００と対応する。ソフトウェア自動構成装置１は、ソフトウェア自動構成部２００、入力装置１３０、永続記憶装置１４０および表示装置１５０を備える。
【００２７】
ソフトウェア自動構成部２００は、始動部２１０、提供クラス抽出部２１１、依存クラス抽出部２１２、関係抽出部２１３、グラフ構築部２１４、逆参照構築部２１５、モジュール収集部２１６、モジュールリスト記憶部２２０、グラフテーブル記憶部２２１を備える。各モジュールはユーザに対して特定の機能を提供するソフトウェアプログラムのモジュールである。
【００２８】
始動部２１０は、入力装置１３０から、ユーザが選択した機能に対応するモジュール名の一覧を受け取り、受け取ったモジュール名の一覧をモジュールリスト記憶部２２０に記録する。モジュール名の一覧は、モジュールリストともいう。
【００２９】
提供クラス抽出部２１１は、永続記憶装置１４０に保存されている入力モジュール群１４１を読み込み、読み込んだ各モジュールが提供するクラス（提供クラス）の一覧を作成し、作成した一覧をグラフテーブル記憶部２２１に記録する。
【００３０】
依存クラス抽出部２１２は、グラフテーブル記憶部２２１を走査し、順次、提供クラスを解析して依存クラスを抽出する。依存クラス抽出部２１２は、抽出結果を、グラフテーブル記憶部２２１に記録する。
【００３１】
関係抽出部２１３は、提供クラスと依存クラスとの関係から、クラスの継承関係を解析して、提供クラスと依存クラスとが「is-a」の関係にあるかどうかを検査し、検査結果をグラフテーブル記憶部２２１に書き込む。尚、「is-a」とは、あるクラスＡと別のクラスＢとが継承（inheritance）の関係であることを意味する。より具体的に説明すると、クラスＡ ｉｓ ａ クラスＢ、言い換えると、クラスＡはクラスＢの一種である、という意味となる。
【００３２】
グラフ構築部２１４は、グラフテーブル記憶部２２１に記憶された提供クラスと依存クラスとを基に、モジュールを頂点とするグラフを、有向辺を用いて構築する。
【００３３】
逆参照構築部２１５は、グラフテーブル記憶部２２１を参照し、is-aの関係にあるクラスについて、グラフ構築部２１４が構築したグラフの有向辺とは逆方向の有向辺を導入し、導入結果をグラフテーブル記憶部２２１に書き込む。
【００３４】
モジュール収集部２１６は、モジュールリスト記憶部２２０において記録されたモジュール名を出発点として、グラフテーブル記憶部２２１が表現するモジュールのグラフを辿り、到達可能なモジュールを収集する。更にモジュール収集部２１６は、収集したモジュールを、永続記憶装置１４０に出力モジュール群１４２として記録する。また、モジュール収集部２１６は、処理の結果を表示装置１５０に出力する。
【００３５】
モジュールリスト記憶部２２０は、入力装置１３０から入力されたモジュール名一覧として、モジュールリストを格納する。
【００３６】
グラフテーブル記憶部２２１は、ソフトウェア自動構成部２００の処理過程において発生する中間結果を書き込むグラフテーブル（後述する図８に示す形式のテーブル）を格納する。グラフテーブルは、最終的にモジュール間の依存関係を表現する有向グラフを構築するためのデータとなる。
【００３７】
図２に示すソフトウェア自動構成部２００内の各部（始動部２１０、提供クラス抽出部２１１、依存クラス抽出部２１２、関係抽出部２１３、グラフ構築部２１４、逆参照構築部２１５およびモジュール収集部２１６）は、機能ブロック単位で表されたプログラムと捉えることができる。そしてこれらのプログラムは、図１に示すＣＰＵ１１０、記憶装置１２０内のＲＯＭやＲＡＭなどに格納されている。ＣＰＵ１１０がこれらのプログラムを適宜演算処理することでこれらの機能は実行される。尚、上述した各部は、電子回路等のハードウェアで構成されていてもよい。尚、図１に示す記憶装置１２０は、モジュールリスト記憶部２２０およびグラフテーブル記憶部２２１を備える。
【００３８】
永続記憶装置１４０は、入力モジュール群１４１および出力モジュール群１４２を格納する。入力モジュール群１４１は、ソフトウェア自動構成装置１の入力データであるソフトウェアプログラムのモジュール群である。出力モジュール群１４２は、ソフトウェア自動構成装置１の出力データであるソフトウェアプログラムのモジュール群である。
【００３９】
入力モジュール群１４１の一例を図３に示す。入力モジュール群１４１は、項目として、モジュール名、クラスファイルおよびクラスファイルに対応するソースコードを含むデータセットから構成される。図３に示される入力モジュール群１４１の一行は、一モジュール（モジュールの１レコード）を示す。
【００４０】
モジュールは、JavaにおいてはJarと呼ばれるアーカイブファイルで表現され、モジュール名はこのアーカイブファイル名を指す。モジュールの中には、ソースコードのコンパイル結果であるクラスファイルを含む。この他、モジュールの中には、モジュールに対するメタデータを表現するマニフェストファイル等が含まれていてもよい。図３に示す入力モジュール群１４１は、８行、即ち８個のソフトウェアプログラムのモジュールから構成され、各モジュールがそれぞれクラスファイルおよびクラスファイルに対応するソースコードを保持している。尚、図３において「ソースコード」は、「クラスファイル」をコンパイルする前の状態を示し、Jarファイルには含まれない。
【００４１】
図４は、クラスファイル（ClassFile）のフォーマットの一例を示す図である。クラスファイルのフォーマットは、「The Java Virtual Machine Specification」（出願時における最新版：Java_SE_8_Edition、2014年3月3日発行）において標準化されている。図４に示すクラスファイル内において、「constant_pool（Ｃ３）」は、このクラスに関する全ての詳細情報を備えている。「super_class（Ｃ１）」は、constant_pool（Ｃ３）内におけるクラスの詳細情報を格納する場所を示すインデックスを格納する。「interfaces（Ｃ２）」は、constant_pool（Ｃ３）内におけるインタフェースの詳細情報を格納する場所を示すインデックスを格納する。
【００４２】
尚、図３に示す入力モジュール群１４１の「ソースコード」に記述された情報は、全てクラスファイルに変換される。すなわち「ソースコード」において提示しているクラスの依存関係は、コンパイル後のクラスファイルから容易に取得可能であると仮定してよい。以後、この仮定を前提とし、説明を進める。
【００４３】
（ソフトウェア自動構成装置の動作）
次に、本発明の第１の実施形態におけるソフトウェア自動構成装置１の動作の一例として、Javaアプリケーションを自動的に構成する動作を説明する。
【００４４】
先ず、図５を用いて始動部２１０の動作について説明する。
【００４５】
ステップＳ５０１において、ソフトウェア自動構成装置１のユーザが、キーボードやマウス等の入力装置１３０を利用して、ユーザが直接利用したい機能に対応するモジュール名を、始動部２１０に指定する。一例として、ユーザが図３に示されるモジュール名「feature-a.jar」で示されるモジュールを利用したい機能として指定したと仮定して、以下の動作を説明していく。指定を受け取った始動部２１０は、入力装置１３０から受け取ったモジュールリストを、モジュールリスト記憶部２２０に記録する。ここでは、feature-a.jarが図６に示すようにモジュールリスト記憶部２２０に記録される。以上で始動部２１０の動作は終了する。尚、図６ではモジュールリスト記憶部２２０に記録されたモジュール名は一つだが、これは複数存在して構わない。
【００４６】
始動部２１０の動作終了を受けると、提供クラス抽出部２１１が動作を開始する。以下、提供クラス抽出部２１１の動作を、図７に示すフローチャートに基づいて説明する。
【００４７】
ステップＳ７０１において、提供クラス抽出部２１１は、入力モジュール群１４１（図３参照）内のクラス抽出処理を未だ行っていないモジュールを「Module」（フィールド名：データ格納領域の変数名）に設定する。更に、提供クラス抽出部２１１は、未処理のモジュールが存在する間、ステップＳ７０２およびＳ７０３に記載する処理を実行する。
【００４８】
ステップＳ７０２において、提供クラス抽出部２１１は、「Module」の内容（モジュール）を読み込む。
【００４９】
ステップＳ７０３において、提供クラス抽出部２１１は、「Module」が保持するクラス（提供クラス）を抽出し、抽出されたクラスを、モジュール名毎に、グラフテーブル記憶部２２１に記録する（図８参照）。
【００５０】
未処理のモジュールが無くなると、提供クラス抽出部２１１は動作を終了する。
【００５１】
提供クラス抽出部２１１の動作終了を受けると、依存クラス抽出部２１２が動作を開始する。以下、依存クラス抽出部２１２の動作を、図９に示すフローチャートを参照して説明する。
【００５２】
ステップＳ９０１では、依存クラス抽出部２１２は、グラフテーブル記憶部２２１（図８参照）に格納される「提供クラス」を、ProvidedClass（変数名）と設定する。ステップＳ９０１からＳ９０７までの間のループ処理は、未処理のProvidedClassが存在する間実行される。
【００５３】
ステップＳ９０２においては、依存クラス抽出部２１２は、ProvidedClassを解析し、解析の結果得た値を、図４に示すClassFileのフォーマットに各々設定する。
【００５４】
ステップＳ９０３においては、依存クラス抽出部２１２は、ClassFileが保持する依存クラスを抽出し、DependedClass（変数名）として設定する。抽出処理について図１０を用いて説明する。図１０は、クラスファイルとメモリ構造との関係を示す図である。メモリは、クラスファイルの記憶装置１２０等を指す。図１０に示すconstant_pool（Ｃ３）は、このクラスに関する全ての詳細情報を備えている場所のインデックスを格納している。このインデックスに紐付られたconstant_poolのメモリＣ４においては、「CONSTANT_Class」および「CONSTANT_Methodref」等が格納されている。CONSTANT_Classとは、クラスの詳細情報を示す。CONSTANT_Methodrefとは、メソッドの詳細情報を示す。メモリＣ４内に存在するCONSTANT_Classの各々は、ClassFileに係るクラスが必要としているクラス、即ち当該提供クラスの依存クラスを示している。よって、依存クラス抽出部２１２は、図１０に示すClassFile内のconstant_pool（Ｃ３）のインデックスを抽出し、さらにインデックスが示すconstant_poolメモリＣ４が保持するCONSTANT_Class（依存クラス）を抽出する。依存クラス抽出部２１２は、抽出された依存クラスをDependedClass（変数名）として設定する。
【００５５】
この後、ステップＳ９０３からＳ９０６までのループ処理を、未処理のDependedClassが存在する間実行する。
【００５６】
ステップＳ９０４においては、依存クラス抽出部２１２は、DependedClassが備える情報をグラフテーブル記憶部２２１内の依存クラス（図８参照）に記録する。
【００５７】
ステップＳ９０５においては、依存クラス抽出部２１２は、関係抽出部２１３を呼び出し、関係抽出処理を実行させる。詳細は後述する。
【００５８】
ステップＳ９０１からＳ９０７までのループ処理およびステップＳ９０３からＳ９０６までのループ処理が終了すると、依存クラス抽出部２１２は動作を終了する。
【００５９】
依存クラス抽出部２１２における処理の過程で、関係抽出部２１３が呼び出され、抽出動作を実行する。以下、関係抽出部２１３の動作を、図１１に示すフローチャートを参照して説明する。
【００６０】
ステップＳ１００１において、関係抽出部２１３は、依存クラス抽出部２１２から、ClassFileおよびDependedClassを受け取る。関係抽出部２１３は、受け取ったClassFileおよびDependedClassについて、図４に示すClassFileフォーマットを参照し、
条件１）DependedClassが、ClassFile内の項目super_class（Ｃ１）が示すスーパークラスと等しいか、あるいは、
条件２）DependedClassが、ClassFile内の項目interfacesが示すインタフェース群のどれかと等しいか、を判断する。
【００６１】
判断の動作を図１０を参照して説明する。図１０に示すように、constant_pool（Ｃ３）は、このクラスに関する全ての詳細情報を備えている場所のインデックスを格納している。super_class（Ｃ１）は、constant_pool（Ｃ３）内におけるクラスの詳細情報を格納する場所を示すインデックスを格納している。interfaces（Ｃ２）は、constant_pool（Ｃ３）内におけるインタフェースの詳細情報を格納する場所を示すインデックスを格納する。
【００６２】
次に、関係抽出部２１３は、条件１）を基に、super_class（Ｃ１）に格納されたインデックスを用いて間接参照可能なconstant_pool内のクラスの詳細情報に、DependedClassが含まれているかを判断する。
【００６３】
更に、関係抽出部２１３は、条件２）を基に、interfaces（Ｃ２）に格納されたインデックスを用いて間接参照可能なconstant_pool内のインタフェースの詳細情報に、DependedClassが含まれているかを判断する。
【００６４】
一般的に、クラス型変数の場合、提供クラスから生成されたオブジェクトのみならず、依存クラスから生成されたオブジェクトを代入可能である。インタフェース型オブジェクトの場合、実装クラスから生成されたオブジェクトを代入可能である。即ち、スーパークラスの継承およびインタフェースの実装は、何れもis-a関係にある。
【００６５】
ステップＳ１００１において、条件１）および条件２）の少なくともいずれかの条件が成り立つ場合は、ステップＳ１００２に進む。ステップＳ１００２において、関係抽出部２１３は、グラフテーブル記憶部２２１のis-a関係項目にtrue（真）を記録する（図１２参照）。グラフの再構築について、オブジェクト指向設計においては「is-a(継承)」、「has-a(包含)」、「uses-a(利用)」の3通りの依存関係が存在する。本実施形態ではインタフェースの依存関係から「is-a(継承)」の関係を抽出し、その関係とは逆方向の辺を導入して依存関係を示すグラフを再構築する。
【００６６】
ステップＳ１００１において、条件１）または条件２）のいずれの条件も成り立たない場合は、ステップＳ１００３に進む。ステップＳ１００３において、関係抽出部２１３は、グラフテーブル記憶部２２１内のis-a関係項目にfalse（偽）を記録する。
【００６７】
以上で、関係抽出部２１３は動作を終了し、処理は、依存クラス抽出部２１２へと再度戻される。
【００６８】
依存クラス抽出部２１２における動作が完了するということは、すなわち依存クラス抽出部２１２から呼び出される関係抽出部２１３における動作も完了したことを示す。この時点において、グラフテーブル記憶部２２１内のグラフテーブルは図１１に示すように記録されている。図１１に示す、依存クラス項目のデータは、依存クラス抽出部２１２における処理によって記録された情報である。is-a関係項目のデータは、関係抽出部２１３における処理によって記録された情報である。図１２中の斜線は、該当する情報がない事を示している。
【００６９】
依存クラス抽出部２１２の動作終了を受けると、グラフ構築部２１４が動作を開始する。グラフ構築部２１４における処理動作を、図１３に示すフローチャートを参照して説明する。
【００７０】
ステップＳ１２０１において、グラフ構築部２１４は、グラフテーブル記憶部２２１内のグラフテーブル（図１２参照）において「依存クラス」項目の記録がある行をRequester（要求側）行と設定する。その後、未処理のRequester行が存在する間、ステップＳ１２０１からＳ１２０４までの間のループ処理が実行される。
【００７１】
ステップＳ１２０２においては、グラフ構築部２１４は、グラフテーブル記憶部２２１内のグラフテーブルにおける提供クラス項目が、Requester行の依存クラス項目と一致する行を取得して、Provider（供給側）行と設定する。
【００７２】
ステップＳ１２０３においては、グラフ構築部２１４は、グラフテーブル記憶部２２１内のグラフテーブルにおける、Requester行の依存モジュール項目へ、Provider行のモジュール項目に記載してあるデータを記録する（図１４参照）。
【００７３】
例えば、図１２に示される上から１行目のレコードＲ１の依存クラス項目データはService Aである。提供クラス項目においてService Aを格納するのは、５行目のレコードＲ５である。レコードＲ５のモジュール項目のデータは「service-a-api.jar」であるため、このデータをレコードＲ１の依存モジュール項目に記録する。
【００７４】
ステップＳ１２０１〜Ｓ１２０４間のループが終了すると、グラフ構築部２１４は動作を終了する。
【００７５】
グラフ構築部２１４におけるグラフ構築処理の終了時点では、グラフテーブル記憶部２２１内の内容は図１４に示すデータの様になる。図１４に示すグラフテーブルは、本実施形態の特徴である、is-a関係における逆方向の有向辺を導入する前の状態を示す。理解を助けるために、図１４に示すグラフテーブルを基とした、モジュール間における依存関係の概念を示すグラフを図１５に示す。図１５に示すグラフは、「モジュール」を始点、「依存モジュール」を終点とする有向辺を使用して表現される。このグラフ（有向グラフ）においては、水平方向中央に位置する、インタフェースとして動作する依存モジュール（service-a-api.jar、service-b-api.jar、service-c-api.jar）を中心とした、その上下に位置する各モジュールが粗結合になっている状態（構造）が表されている。
【００７６】
グラフ構築部２１４における動作終了を受けると、逆参照構築部２１５は動作を開始する。逆参照構築部２１５における処理動作を、図１６で示すフローチャートを参照して説明する。
【００７７】
ステップＳ１５０１において、逆参照構築部２１５は、グラフテーブル記憶部２２１内のグラフテーブルにおける、is-a関係項目データが、trueである行をDestination（目的地）行と設定する。具体的に、図１４に示すグラフテーブルであると、逆参照構築部２１５は、上から８〜１０行目のレコードＲ８、Ｒ９、Ｒ１０を、Destination行と設定する。レコード以後、ステップＳ１５０１〜Ｓ１５０４間のループ処理は、グラフテーブルに未処理のDestination行が存在する間実行される。
【００７８】
ステップＳ１５０２において、逆参照構築部２１５は、グラフテーブル記憶部２２１内のグラフテーブルにおける提供クラス項目が、Destination行の依存クラス項目と一致する行を取得してSource（源）行と設定する。
【００７９】
ステップＳ１５０３において、逆参照構築部２１５は、Source行に以下の値またはデータを追加する。即ち、
・「依存クラス」項目に、N/A（Not Available：値が未設定）、
・「is-a関係」項目に、N/A、
・「依存モジュール」項目に、Destination行の「モジュール」項目。
【００８０】
この動作についてより具体的に説明する。図１４に示すDestination行であるレコードＲ８、Ｒ９、Ｒ１０の依存クラス項目のデータには各々、service A、service B、service Cが格納されている。これらを提供クラス項目データとして備えるのは、レコードＲ５、Ｒ６、Ｒ７である。よって、レコードＲ５、Ｒ６、Ｒ７をSource行に設定し、レコードＲ５、Ｒ６、Ｒ７における、上記の依存クラス項目、is-a関係項目および依存モジュール項目に、所定のデータを記録する。依存モジュール項目の記録について説明すると、Destination行（Ｒ８、Ｒ９、Ｒ１０）の各々のモジュール項目が備えるデータ（service-a-impl.jar、service-b-impl.jar、service-c-impl.jar）を、Destination行の依存クラス項目のデータと同じ提供クラス項目のデータを備える行（Ｒ５、Ｒ６、Ｒ７）に、依存モジュール項目のデータとして各々記録する。
【００８１】
ステップＳ１５０１〜Ｓ１５０４間のループ処理を終了すると、逆参照構築部２１５は動作を終了する。
【００８２】
逆参照構築部２１５における処理動作が終了した時点では、グラフテーブル記憶部２２１内のグラフテーブルは図１７に示すような状態となる。
【００８３】
理解を助けるために、図１７に示すグラフテーブルを基とした、モジュール間における依存関係の概念を示すグラフを図１８に示す。図１８に示すグラフは、アーカイブファイル名で表されているモジュール項目のデータを始点、依存モジュール項目のデータを終点とする、有向辺で表現される。このグラフは、水平方向の中央に位置する、インタフェースとして動作する依存モジュール項目のデータ（service-a-api.jar、service-b-api.jar、service-c-api.jar）を中心として、その上下に位置する各モジュールが粗結合になっている状態（構造）を表している。更に、依存モジュール項目のデータ（service-a-api.jar、service-b-api.jar、service-c-api.jar）に向かう有向辺に加えて、図１７に示す太字枠部分データを反映させた、その逆方向に対する有向辺が追加されて表されている。
【００８４】
逆参照構築部２１５における処理動作が終了すると、モジュール収集部２１６は動作を開始する。以下、モジュール収集部２１６における処理動作を、図１９および図２０に示すフローチャートを参照して説明する。
【００８５】
ステップＳ１８０１において、モジュール収集部２１６は、モジュールリスト記憶部２２０（図６参照）内のモジュールリストに記載されているモジュールを「Module」に設定する。この後、ステップＳ１８０１〜Ｓ１８０３間のループ処理は、モジュールリスト内に未処理のモジュールが存在する間実行される。尚、図６に示されるモジュールリスト内のモジュールは一つだが、これは複数存在して良い。
【００８６】
ステップＳ１８０２において、モジュール収集部２１６は、「Module」に対してグラフ探索の処理を呼び出す。詳細は後述する。
【００８７】
ステップＳ１８０１〜Ｓ１８０３間のループ処理が終了すると、モジュール収集部２１６は、結果を表示装置１５０に出力して、動作を終了する。
【００８８】
モジュール収集部２１６におけるグラフ探索の処理について図１９を参照して説明する。
【００８９】
ステップＳ１９０１においては、グラフ探索（Ｓ１８０２）が開始されると、モジュール収集部２１６は、処理対象のモジュールが到達済みか、つまり出力モジュール群１４２に当該モジュールの情報が記録されているかを確認する。記録がある場合は、処理を終了して呼び出し処理を終了する。
【００９０】
記録がない場合は、ステップＳ１９０２において、モジュール収集部２１６は、モジュールを出力モジュール群１４２に記録する。
【００９１】
ステップＳ１９０３において、モジュール収集部２１６は、グラフテーブル記憶部２２１内のグラフテーブル（図１７参照）から「モジュール」項目がModuleの内容と一致する行を取得してこれをNode（変数名）行に設定する。
【００９２】
ステップＳ１９０４において、モジュール収集部２１６は、Node行が保持する「依存モジュール」をNeighbor（変数名）と設定する。即ち、あるモジュールと、そのモジュールに隣接する依存モジュールとの関係を表す。ステップＳ１９０４〜Ｓ１９０６間のループ処理は、モジュールリスト内に未処理のNeighborが存在する間実行される。
【００９３】
ステップＳ１９０５においては、モジュール収集部２１６は、Neighborに対してグラフ探索を再帰的に呼び出す。詳細は後述する。
【００９４】
ステップＳ１９０４〜Ｓ１９０６間のループ処理が終了すると、モジュール収集部２１６は、ループ処理の呼び出し元に処理を戻す。
【００９５】
モジュール収集部２１６における処理動作が終了すると、本装置の全体動作は終了する。
【００９６】
モジュール収集部２１６における処理動作が終了した時点では、出力モジュール群１４２に格納される出力モジュール内容は図２１に示す状態のようになる。これらの出力モジュールは、feature-a.jarを動作させるために必要なモジュール群である。
【００９７】
理解を助けるために、図２１に示す出力モジュール群を基とした、モジュール間における依存関係のグラフを図２２に示す。図２２に示すグラフは、図１８に示したモジュール間における依存関係グラフのうち、モジュール収集部２１６における収集結果であるモジュール群（図２１参照）を、破線部２１００によって囲った状態を示している。図２２を参照すると、feature-a.jarの動作に必要なモジュールが破線部２１００内に含まれ、且つ、feature-b.jarのみの動作に必要なモジュールは破線部２１００に含まれていないことが表されている。
【００９８】
（本発明の第１の実施形態の効果）
本発明の第１の実施形態によると、ソフトウェアそのものを解析して、そのソフトウェア内において、ユーザが必要とする機能を備えたソフトウェアを構築することができる。
【００９９】
その理由は、本実施形態は、あるソフトウェアの全機能を実現するためのモジュールの集合から、利用したい機能だけを持つ縮小版ソフトウェアを構成するためのモジュールの集合を抽出し、縮小版ソフトウェアを自動的に構成するからである。具体的に説明すると、ユーザに対しては、ユーザが必要としている機能に対応するモジュールのみを表示装置１５０に出力し、機能および対応するモジュールを選択させ、ソフトウェアの複雑な内部構造は、原則的に、閲覧できないようにする。ソフトウェア自動構成部２００は、ユーザが所望する機能を直接的に実現するモジュールを出発点として、モジュールの依存関係を表現する有向グラフを辿って、縮小版ソフトウェアを構成するモジュールを抽出する。更に、ソフトウェア自動構成部２００は、インタフェースと実装とが分離されているモジュールについて、実装にも適切に到達できるように、実装しているインタフェースを元に依存関係を示すグラフを再構築する。
【０１００】
本実施形態によると、ソフトウェアの内部構成に詳しくないエンドユーザであっても、ソフトウェアの構成をカスタマイズできる。その理由は、ソフトウェアを構成するモジュールの依存関係を自動で解析して、適切な構成を提供できるためである。
【０１０１】
本実施形態によると、不要な機能を持たない必要最小限の構成を自動で構築できる。その理由は、解析した依存関係に従ってモジュールを収集するため、補助的な情報の準備が不要で、且つ、不必要なモジュールが混在する事がないためである。
【０１０２】
本実施形態によると、インタフェースを利用して粗結合となっているソフトウェアであっても、実行時に必要となる実装を適切に収集できる。即ち、インタフェースと実装とが分離されているモジュールであっても、その実装構成に適切に到達できる。その理由は、依存関係の種別を考慮して、is-a関係に基づいて依存関係を再構成し、再構築された依存関係を用いて、モジュールを収集するためである。
【０１０３】
＜第２の実施形態＞
本発明の第２の実施形態に係るソフトウェア自動構成装置１ａについて図２３を参照して説明する。ソフトウェア自動構成装置１ａは、図２３に示すように、依存クラス抽出部２１２ａ、関係抽出部２１３ａ、グラフ構築部２１４ａ、逆参照構築部２１５ａおよびモジュール収集部２１６ａを備える。
【０１０４】
依存クラス抽出部２１２ａは、ソフトウェアプログラムに含まれるモジュールに属する少なくとも２つ以上のクラスから、依存クラスを抽出する。
【０１０５】
関係抽出部２１３ａは、依存クラスが依存する提供クラスを抽出する。
【０１０６】
グラフ構築部２１４ａは、提供クラスから依存クラスまでの関係を基に、モジュールを頂点とするグラフの経路を構築する。
【０１０７】
逆参照構築部２１５ａは、グラフの経路を逆方向に辿り、グラフに逆方向の経路を加える。
【０１０８】
モジュール収集部２１６ａは、モジュールを出発点として、逆方向の経路が加えられたグラフの経路を辿り、到達可能な、モジュールとは異なるモジュールを収集する。
【０１０９】
本発明の第２の実施形態によると、ソフトウェアそのものを解析することにより、そのソフトウェア内において、ユーザの必要とする機能を備えたソフトウェアを構築することができる。
【０１１０】
（変更例）
以下、本発明の各実施形態の変更例について説明する。ＤＩ（Dependency Injection）コンテナなどでは、インタフェースとその実装とをＸＭＬ（Extensible Markup Language）文書などの外部ファイルに定義している場合がある。その場合は、本発明の他の実施例として、依存クラス抽出部２１２をＸＭＬ文書の解析処理で置換した装置を作成する。サービス指向を基に設計されたソフトウェアは、ＸＭＬ文書などで公開しているサービス以外へのアクセスは許可しておらず、そのためクラスの解析は不要である。即ち、ＸＭＬ文書の解析のみで依存関係を構築可能である。
【０１１１】
本発明の各実施形態の変更例の効果は、実装言語やプラットフォームによらずソフトウェアの自動構成が可能である点である。その理由は、バイナリファイルの解析を行わず、汎用的なＸＭＬファイルの解析のみを行うためである。
【産業上の利用可能性】
【０１１２】
本願発明の各実施形態に係るソフトウェア自動構成装置は、Ｊａｖａ ＥＥのプロファイル機能を実現するために利用できる。あるソフトウェア製品のラインアップが、廉価版から高機能版まで、機能を制限する、あるいは機能を追加する形で提供されている場合、これらの製品を自動構築することができる。更に、マシンリソースが制限された状況で、あるソフトウェアの特定の機能だけを利用したい場合、そのソフトウェアを軽量化してその制限された環境で実施可能にする事ができる。
【符号の説明】
【０１１３】
１          ソフトウェア自動構成装置
１ａ        ソフトウェア自動構成装置
１００      情報処理装置
１１０      ＣＰＵ
１２０      記憶装置
１３０      入力装置
１４０      永続記憶装置
１４１      入力モジュール群
１４２      出力モジュール群
１５０      表示装置
２００      ソフトウェア自動構成部
２１０      始動部
２１１      提供クラス抽出部
２１２      依存クラス抽出部
２１２ａ    依存クラス抽出部
２１３      関係抽出部
２１３ａ    関係抽出部
２１４      グラフ構築部
２１４ａ    グラフ構築部
２１５      逆参照構築部
２１５ａ    逆参照構築部
２１６      モジュール収集部
２１６ａ    モジュール収集部
２２０      モジュールリスト記憶部
２２１      グラフテーブル記憶部
２１００    破線部
【図１】
2016170515.tif 000003
【図２】
2016170515.tif 000004
【図３】
2016170515.tif 000005
【図４】
2016170515.tif 000006
【図５】
2016170515.tif 000007
【図６】
2016170515.tif 000008
【図７】
2016170515.tif 000009
【図８】
2016170515.tif 000010
【図９】
2016170515.tif 000011
【図１０】
2016170515.tif 000012
【図１１】
2016170515.tif 000013
【図１２】
2016170515.tif 000014
【図１３】
2016170515.tif 000015
【図１４】
2016170515.tif 000016
【図１５】
2016170515.tif 000017
【図１６】
2016170515.tif 000018
【図１７】
2016170515.tif 000019
【図１８】
2016170515.tif 000020
【図１９】
2016170515.tif 000021
【図２０】
2016170515.tif 000022
【図２１】
2016170515.tif 000023
【図２２】
2016170515.tif 000024
【図２３】
2016170515.tif 000025