IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特許7510795ファイル出力プログラム、ファイル出力方法、及びファイル出力装置
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-06-26
(45)【発行日】2024-07-04
(54)【発明の名称】ファイル出力プログラム、ファイル出力方法、及びファイル出力装置
(51)【国際特許分類】
   G06F 8/20 20180101AFI20240627BHJP
【FI】
G06F8/20
【請求項の数】 7
(21)【出願番号】P 2020107175
(22)【出願日】2020-06-22
(65)【公開番号】P2022002047
(43)【公開日】2022-01-06
【審査請求日】2023-03-09
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110004370
【氏名又は名称】弁理士法人片山特許事務所
(72)【発明者】
【氏名】長尾 貴浩
【審査官】久々宇 篤志
(56)【参考文献】
【文献】米国特許出願公開第2020/0125339(US,A1)
【文献】米国特許出願公開第2015/0268948(US,A1)
【文献】米国特許出願公開第2018/0246706(US,A1)
【文献】特開2014-063237(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/20
(57)【特許請求の範囲】
【請求項1】
複数のライブラリのうちの第1のライブラリと前記第1のライブラリと同じ種類で異なるバージョンの第2のライブラリとにプログラムが依存することを示す第1の定義ファイルと、前記第2のライブラリが前記第1のライブラリで代替可能であることを示す第1ヒント情報の入力とを受け付け、
前記第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出し、
前記第1の定義ファイル及び前記第1ヒント情報に従って、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する、
処理をコンピュータに実行させることを特徴とするファイル出力プログラム。
【請求項2】
前記論理式が充足不可能と判定された場合、前記プログラムが前記第2のライブラリに依存し、かつ前記プログラムが前記第1のライブラリに依存しないことを示す別の論理式を生成し、
前記別の論理式が充足可能と判定された場合、前記プログラムが前記第2のライブラリに依存し、かつ前記プログラムが前記第1のライブラリに依存しないことを示す第3の定義ファイルを出力する、
処理を前記コンピュータに実行させることを特徴とする請求項1に記載のファイル出力プログラム。
【請求項3】
複数のライブラリのうちの第1のライブラリと前記第1のライブラリと同じ種類で異なるバージョンの第2のライブラリとにプログラムが依存することを示す第1の定義ファイルと、前記第2のライブラリが前記第1のライブラリで代替可能であることを示す第1ヒント情報の入力とを受け付け、
前記第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出し、
前記第1の定義ファイル及び前記第1ヒント情報に従って、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する、
処理をコンピュータが実行することを特徴とするファイル出力方法。
【請求項4】
複数のライブラリのうちの第1のライブラリと前記第1のライブラリと同じ種類で異なるバージョンの第2のライブラリとにプログラムが依存することを示す第1の定義ファイルと、前記第2のライブラリが前記第1のライブラリで代替可能であることを示す第1ヒント情報の入力とを受け付ける入力部と、
前記第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出する検出部と、
前記第1の定義ファイル及び前記第1ヒント情報に従って、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成する生成部と、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する出力部と、
を有することを特徴とするファイル出力装置。
【請求項5】
前記論理式が充足不可能となるときに、前記第1のライブラリと異なる種類の第3のライブラリと前記第3のライブラリと同じ種類で異なるバージョンの第4のライブラリのいずれか一方を他方で代替可能なことを示す情報を前記第1ヒント情報に追加した第2ヒント情報を生成し、当該第2ヒント情報を出力する処理をコンピュータに実行させることを特徴とする請求項1に記載のファイル出力プログラム。
【請求項6】
前記論理式が充足不可能となるときに、前記第1のライブラリと異なる種類の第3のライブラリと前記第3のライブラリと同じ種類で異なるバージョンの第4のライブラリのいずれか一方を他方で代替可能なことを示す情報を前記第1ヒント情報に追加した第2ヒント情報を生成し、当該第2ヒント情報を出力する処理をコンピュータに実行させることを特徴とする請求項3に記載のファイル出力方法。
【請求項7】
前記論理式が充足不可能となるときに、前記生成部が前記第1のライブラリと異なる種類の第3のライブラリと前記第3のライブラリと同じ種類で異なるバージョンの第4のライブラリのいずれか一方を他方で代替可能なことを示す情報を前記第1ヒント情報に追加した第2ヒント情報を生成し、前記出力部が当該第2ヒント情報を出力することを特徴とする請求項4に記載のファイル出力装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ファイル出力プログラム、ファイル出力方法、及びファイル出力装置に関する。
【背景技術】
【0002】
プログラム開発においては、複数のクラスと関数の集合からなるライブラリを使用することがある。そのライブラリをプログラムが参照することにより、ライブラリに存在するクラスや関数をプログラムで使用することが可能となる。
【0003】
ライブラリは度々更新されることがあり、同一名称のライブラリで異なるバージョンのライブラリが存在することがある。以下では、同一名称で異なるバージョンの複数のライブラリを一つのプログラムが参照することをライブラリの衝突と呼ぶ。
【0004】
ソースプログラムにおいてライブラリが衝突していると、複数のライブラリのうちのどのライブラリのクラスを呼び出せばよいのかがコンパイラが判断できないため、コンパイラが実行可能プログラムを生成できない。そのため、ライブラリの衝突がある場合には、コンパイラ等のビルドツールは、ツールに依存した方法でライブラリの取捨選択を行い、ライブラリの衝突を解消する。
【0005】
しかし、これではプログラムの開発者が意図するライブラリが選択されるとは限らず、開発者の意図とは異なる実行可能プログラムが生成されてしまう。
【先行技術文献】
【特許文献】
【0006】
【文献】特開2006-79534号公報
【文献】国際公開第2016/174743号
【文献】特開平11-110195号公報
【文献】米国特許出願公開第2017/0075684号明細書
【文献】米国特許出願公開第2015/0268948号明細書
【文献】Apache Maven Project, [online], [令和2年5月7日検索]、インターネット< https://maven.apache.org/>
【文献】OSGi Alliance, [online], [令和2年5月7日検索], インターネット< https://www.osgi.org/>
【文献】M. Schroeder, “Using SAT for solving package dependencies”, [online], [令和2年5月7日検索], インターネット<https://en.opensuse.org/images/b/b9/Fosdem2008-solver.pdf>
【文献】Chris Tucker et al., “OPIUM: Optimal Package Install/Uninstall Manager”, In Proc. ICSE 2007, pages 178-188.
【発明の概要】
【発明が解決しようとする課題】
【0007】
一側面によれば、ライブラリの衝突を回避することを目的とする。
【課題を解決するための手段】
【0008】
一側面によれば、複数のライブラリのうちの第1のライブラリと前記第1のライブラリと同じ種類で異なるバージョンの第2のライブラリとにプログラムが依存することを示す第1の定義ファイルと、前記第2のライブラリが前記第1のライブラリで代替可能であることを示す第1ヒント情報の入力とを受け付け、前記第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出し、前記第1の定義ファイル及び前記第1ヒント情報に従って、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成し、前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する、処理をコンピュータに実行させることを特徴とするファイル出力プログラムが提供される。
【発明の効果】
【0009】
一側面によれば、ライブラリの衝突を回避することができる。
【図面の簡単な説明】
【0010】
図1図1は、POMファイルの記述例を示す模式図である。
図2図2は、MavenがPOMファイルに基づいて生成した依存グラフの模式図である。
図3図3は、グラフ探索の模式図である。
図4図4は、修正後のPOMファイルの模式図である。
図5図5は、図4のPOMファイルに基づいてMavenが生成した依存グラフの模式図である。
図6図6は、図4のPOMファイルに基づいてMavenが生成したJARファイルの模式図である。
図7図7は、第1実施形態に係るファイル出力装置の処理を示す模式図である。
図8図8は、第1実施形態に係るリストの模式図である。
図9図9は、第1実施形態において、ライブラリの依存関係を論理式にエンコーディングするときのルールを示す模式図である。
図10図10(a)は、第1実施形態においてPOMファイルに対応した依存グラフの模式図であり、図10(b)は、この依存グラフとリストとに対応した論理式の模式図である。
図11図11(a)は、第1実施形態において論理式を修正して得られた一つの論理式の模式図であり、図11(b)は、第1実施形態において論理式を修正して得られた別の論理式の模式図である。
図12図12は、図11(b)の論理式に対応したPOMファイルの模式図である。
図13図13は、第1実施形態に係るファイル出力装置の機能構成図である。
図14図14(a)、(b)は、第1実施形態に係る充足性判定部の判定結果の一例を示す模式図である。
図15図15は、第1実施形態に係るファイル出力方法のフローチャートである。
図16図16は、第2実施形態に係るファイル出力装置の処理を示す模式図である。
図17図17(a)は、第2実施形態に係るヒント情報の一例を示す模式図であり、図17(b)は、第2実施形態に係るヒント情報の他の例を示す模式図である。
図18図18(a)は、図17(a)のヒント情報を用いた場合に得られた論理式を示す模式図であり、図18(b)は、図17(b)のヒント情報を用いた場合に得られた論理式を示す模式図である。
図19図19は、図18(a)の論理式に対応したPOMファイルの模式図である。
図20図20は、図17(b)のヒント情報を用いた場合に第2実施形態に係るファイル出力装置が出力する衝突情報の模式図である。
図21図21は、第2実施形態において修正したヒント情報を示す模式図である。
図22図22は、第2実施形態に係るファイル出力方法のフローチャートである。
図23図23は、第1実施形態と第2実施形態の各々に係るファイル出力装置のハードウェア構成図である。
【発明を実施するための形態】
【0011】
本実施形態の説明に先立ち、本願発明者が検討した事項について説明する。
【0012】
まず、ライブラリの衝突について、Java(登録商標)向けのビルドツールであるMavenでビルドを行う場合を例にして説明する。
【0013】
Mavenでビルドを行う場合、ビルド定義ファイルであるPOM(Project Object Model)ファイルとJava(登録商標)のソースプログラムとに基づいてビルドが実行される。
【0014】
図1は、POMファイルの記述例を示す模式図である。
POMファイル1は、Java(登録商標)のソースプログラムが依存するライブラリを定義したビルド定義ファイルである。図1の例では、artifactId要素1aにおいて、Java(登録商標)のソースプログラムの名称がプロジェクト「prjA」であることが特定される。
【0015】
プロジェクト「prjA」は、あるライブラリで定義されているクラスや関数を参照する場合にそのライブラリに依存するという。このようなライブラリとプロジェクトとの依存関係はdependency要素1b~1dで特定される。例えば、dependency要素1bにおいては、プロジェクト「prjA」が、バージョンが「2.0」のライブラリ「libA」に依存することが特定される。
【0016】
同様に、dependency要素1cでは、バージョンが「2.0」のライブラリ「libB」にプロジェクト「prjA」が依存することが特定される。そして、dependency要素1dでは、バージョンが「1.1」のライブラリ「libC」にプロジェクト「prjA」が依存することが特定される。
【0017】
図2は、MavenがPOMファイル1に基づいて生成した依存グラフの模式図である。
【0018】
この依存グラフ2では、依存元から依存先に向かう有向グラフで依存関係を示す。例えば、プロジェクト「prjA」は、前述のようにライブラリ「libA」、「libB」、及び「libC」の各々に依存することが依存グラフ2により示される。
【0019】
また、各ライブラリは、更に別のライブラリに依存することがある。この例では、バージョンが「2.0」のライブラリ「libA」が、バージョンが「1.0」のライブラリ「libB」に依存している。この場合、バージョンが「2.0」のライブラリ「libA」は、バージョンが「1.0」のライブラリ「libB」の関数やクラスを参照しているということになる。
【0020】
このようなライブラリ間の依存関係は、各ライブラリに含まれるPOMファイルで定義される。前述の例では、バージョンが「2.0」のライブラリ「libA」に含まれるPOMファイルにおいて、バージョンが「1.0」のライブラリ「libB」との依存関係が定義される。
【0021】
ところで、図2の例では、バージョンが「1.0」と「2.0」で相違する二つのライブラリ「libB」にプロジェクト「prjA」が依存している。前述のように、名称が同一でバージョンが異なる複数のライブラリをあるプログラムが参照しているとき、そのプログラムにおいてライブラリの衝突が発生しているという。プロジェクト「prjA」においては、ライブラリ「libB」の衝突が発生している。同様に、ライブラリ「libC」の衝突もプロジェクト「prjA」において発生している。
【0022】
ライブラリが衝突している場合、Mavenにおいては、衝突している複数のライブラリのうちの一つのみをグラフ探索を利用して選択する。
【0023】
図3は、そのグラフ探索の模式図である。
図3に示すように、Mavenにおいては、深さ優先探索で依存グラフ2を探索したときに最初に見つかったライブラリを選択し、後に見つかった名称が同一のライブラリは選択しない。
【0024】
この例で深さ優先探索を行うと、バージョンが「2.0」のライブラリ「libA」、バージョンが「1.0」のライブラリ「libB」、バージョンが「1.0」のライブラリ「libC」がこの順に見つかる。これらのライブラリは衝突していないため、プロジェクト「prjA」が参照するライブラリとしてMavenが選択する。
【0025】
一方、バージョンが「2.0」のライブラリ「libB」は、バージョンが「1.0」のライブラリ「libB」と衝突しており、かつバージョンが「1.0」のライブラリ「libB」よりも後に発見される。そのため、Mavenは、バージョンが「2.0」のライブラリ「libB」を選択しない。同様の理由により、Mavenは、バージョンが「1.1」のライブラリ「libC」も選択しない。
【0026】
これによりライブラリ同士の衝突が一応は解決される。但し、これでは開発者が意図しないライブラリが選択されてしまい、開発者が意図したプログラムが得られないことがある。例えば、上記の例では、バージョンが「2.0」のライブラリ「libB」にのみ定義された関数やクラス等の資源をプロジェクト「prjA」が参照していると、その資源をプロジェクト「prjA」が参照できなくなるという問題が生じる。
【0027】
このような問題は、開発者がPOMファイル1を修正することにより回避できる。
【0028】
図4は、修正後のPOMファイル1の模式図である。
この例では、開発者は、プロジェクト「prjA」がライブラリ「libA」に依存することを特定するためのdependency要素1bの内側にexclusion要素1f、1gを記述する。
【0029】
exclusion要素1fは、ライブラリ「libA」がライブラリ「libB」に依存する場合であっても、ライブラリ「libA」の内部でライブラリ「libB」を使用しないことを示す要素である。同様に、exclusion要素1gは、ライブラリ「libA」がライブラリ「libC」に依存する場合であっても、ライブラリ「libA」の内部でライブラリ「libC」を使用しないことを示す要素である。
【0030】
図5は、図4のPOMファイル1に基づいてMavenが生成した依存グラフの模式図である。
【0031】
前述のようにexclusion要素1f、1gでライブラリ「libA」からライブラリ「libB」、「libC」を排除したため、この依存グラフ2においてはライブラリ「libA」の子ノードに対応するライブラリ「libB」、「libC」が選択されない。
【0032】
これにより、バージョンが「2.0」のライブラリ「libB」をMavenが選択するようになるため、バージョンが「2.0」のライブラリ「libB」にのみ定義された資源をプロジェクト「prjA」が参照できるようになる。
【0033】
なお、このようにexclusion要素1f、1gを使用するのに代えて、POMファイル1において「libA」の記載を「libB」と「libC」の各々の記載よりも後に移動してもよい。これによっても、図5と同様に、ライブラリ「libA」の子ノードに対応するライブラリ「libB」、「libC」をMavenが排除するようになる。
【0034】
図6は、図4のPOMファイル1に基づいてMavenがプロジェクト「prjA」をビルドして得られたJARファイルの模式図である。
【0035】
JARファイル8は、Mavenが生成する実行可能プログラムであって、図5の依存グラフ2で選択されたライブラリ「libA」、「libB」、「libC」を内包する。このJARファイル8は、ライブラリの衝突が解決されているため、他のJARファイルをクラスパスに加える必要がない単体で動作可能な実行可能プログラムとなる。
【0036】
前述のように、開発者が図4のようにPOMファイル1を修正することによりライブラリ同士の衝突を解消でき、単体で動作可能な実行可能プログラムを得ることができる。しかし、ライブラリの依存関係が複雑な場合は、図4のようにPOMファイルを人手で修正するのは煩雑な作業となり、プログラム開発を効率化するうえでの障害となる。
【0037】
(第1実施形態)
図7は、本実施形態に係るファイル出力装置の処理を示す模式図である。
【0038】
このファイル出力装置20は、サーバやPC(Personal Computer)等のコンピュータであって、以下のようにしてPOMファイルを修正してライブラリ同士の衝突を解決する。
【0039】
まず、ファイル出力装置20がPOMファイル1の入力を受け付ける(P1)。POMファイル1は、図1を参照して説明したように、Java(登録商標)のソースプログラムが依存するライブラリを定義したビルド定義ファイルである。なお、POMファイル1の中身は図1におけるのと同じなのでその説明は省略する。また、POMファイル1は第1の定義ファイルの一例である。
【0040】
次いで、ファイル出力装置20が、POMファイル1に基づいて、Java(登録商標)のソースプログラムが使用する各ライブラリが衝突しているかを示すリスト21を生成する(P2)。
【0041】
図8は、そのリスト21の模式図である。
本実施形態では、後述のように論理式の命題変数としてライブラリを使用するため、リスト21の命題変数の欄にはライブラリが格納される。ここでは、ライブラリの書式として、ライブラリの名称とバージョンとをハイフンで連結した書式を採用する。例えば、「libA-2.0」は、バージョンが「2.0」のライブラリ「libA」を示す。更に、この例ではソースプログラムを示すプロジェクト「prjA」も命題変数として格納する。
【0042】
また、衝突の有無の欄には、ライブラリが他のライブラリと衝突しているかを示す文字列が格納される。例えば、他のライブラリと衝突していないライブラリ「libA-2.0」は、文字列「衝突なし」と対応付けてリスト21に格納される。一方、ライブラリ「libB-1.0」とライブラリ「libB-2.0」は相互に衝突しているため、これらのライブラリと文字列「衝突あり」とが対応付けられてリスト21に格納される。
【0043】
再び図7を参照する。
次いで、ファイル出力装置20が、プロジェクト「prjA」とライブラリとの依存関係を示す論理式24を生成する(P3)。
【0044】
図9は、ライブラリの依存関係を論理式にエンコーディングするときのルールを示す模式図である。
【0045】
図9に示すように、論理式「A」は、ライブラリAがプログラムで使用されていることを示す。また、論理式「¬A」は、ライブラリAがプログラムで使用されていないことを示す。
【0046】
そして、論理式「¬A∨B」は、ライブラリAがライブラリBに依存することを示す。更に、論理式「¬A∨¬B」は、ライブラリAとライブラリBが衝突することを示す。
【0047】
図10(a)は、POMファイル1に対応した依存グラフ2の模式図である。そして、図10(b)は、この依存グラフ2とリスト21とに対応した論理式23の模式図である。
【0048】
図10(b)に示すように、論理式23は、複数の節の論理積をとった和積標準形(Conjunctive Normal Form: CNF)の論理式である。この例では、論理式23は、依存グラフ2を表す式23aと、リスト21を表す式23bとを有する。
【0049】
このうち、式23aにおいては、論理積「∧」で区切られた個々の節がライブラリの依存関係を表す。図9に示したように、各々の節においては、ライブラリを示す命題変数の否定と、これとは別のライブラリを示す命題変数との論理和をとることにより、これらのライブラリ同士の依存関係を表す。例えば、節「¬prjA ∨ libA-2.0」はプロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示し、節「¬libA-2.0 ∨ libB-1.0」はライブラリ「libA-2.0」がライブラリ「libB-1.0」に依存することを表す。これらの節は、ファイル出力装置20が、POMファイル1(図1参照)に基づいてライブラリの依存関係を特定し、依存元のライブラリを示す命題変数の否定と、依存先のライブラリを示す命題変数の論理和をとることで生成する。
【0050】
一方、式23bにおいては、論理積「∧」で区切られた個々の節がライブラリ同士の衝突を表す。この例では、節「¬libB-1.0 ∨ ¬libB-2.0」が、ライブラリ「libB-1.0」とライブラリ「libB-2.0」とが衝突することを表す。そして、節「¬libC-1.0 ∨ ¬libC-1.1」が、ライブラリ「libC-1.0」とライブラリ「libC-1.1」とが衝突することを表す。これらの節は、ファイル出力装置20が、リスト21(図8参照)を参照することにより相互に衝突しているライブラリを特定し、これらのライブラリを示す命題変数の否定の論理和をとることで生成する。
【0051】
また、本実施形態では、ファイル出力装置20がこの論理式23を修正した複数の論理式24を生成する。
【0052】
図11(a)は、論理式23を修正して得られた一つの論理式24の模式図である。
【0053】
本実施形態では、論理式23において互いに衝突しているライブラリ「libB-1.0」とライブラリ「libB-2.0」に着目する。なお、ライブラリ「libB-1.0」とライブラリ「libB-2.0」のうちの一方は第1のライブラリの一例であり、他方は第2のライブラリの一例である。そして、これらのライブラリのうち、ライブラリ「libB-2.0」を含む節23d、23e、23fを論理式23から削除し、ライブラリ「libB-1.0」を含む節23jを残すことにより論理式24を得る。
【0054】
この論理式24は、プロジェクト「prjA」がライブラリ「libB-1.0」に依存し、かつライブラリ「libB-2.0」に依存しないことを示す論理式である。また、この論理式24には、相互に衝突するライブラリ「libC-1.0」とライブラリ「libC-1.1」の各々の否定の論理和をとった節23iも残される。これらのライブラリ「libC-1.0」とライブラリ「libC-1.1」の一方は第3のライブラリの一例であり、他方は第4のライブラリの一例である。
【0055】
図11(a)の例では、「libC-1.0」と「libC-1.1」の各々の真理値の任意の組み合わせに対し、三つの節23g、23h、23iの少なくとも一つの真理値が偽となる。よって、論理式24は充足不可能となり、論理式24が表すPOMファイルではライブラリの衝突は解消されない。
【0056】
図11(b)は、論理式23を修正して得られた別の論理式24の模式図である。
【0057】
この論理式24は、ライブラリ「libB-1.0」を含む節23f、23g、23jを論理式23から削除し、かつライブラリ「libB-2.0」を含む節23d、23eを残した論理式である。この論理式24は充足可能であるため、論理式24が表すPOMファイルを使用することでライブラリの衝突を解消することができる。なお、この論理式24を充足可能とする各命題変数の値は次の通りである。
【0058】
「prjA」:真
「libA-2.0」:真
「libB-2.0」:真
「libC-1.1」:真
「libC-1.1」:偽
【0059】
本実施形態では、このように衝突する複数のライブラリ「libB-1.0」、「libB-2.0」ごとにファイル出力装置20が論理式24(図11(a)、図11(b)参照)を生成する。これらの論理式24の各々は、衝突する複数のライブラリ「libB-1.0」、「libB-2.0」のうちの一つのみにプログラムが依存し、残りのライブラリにはプログラムが依存しないことを表す論理式となる。
【0060】
再び図7を参照する。
次いで、ファイル出力装置20が、複数の論理式24のうちで充足可能となる論理式を特定し、その論理式24に対応したPOMファイル26を出力する(P4)。例えば、ファイル出力装置20は、論理式24の充足可能性をSAT(satisfiability)ソルバで特定する。SATソルバは高速に処理が可能なソルバであり、複数の論理式24のうちで充足可能となる論理式をファイル出力装置20が素早く特定することができる。
【0061】
図12は、図11(b)の論理式24に対応したPOMファイル26の模式図である。
【0062】
図12に示すように、このPOMファイル26はdependency要素26aと、その内側に記述されたexclusion要素26b、26cを有する。
【0063】
このうち、dependency要素26aは、プロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示す要素である。
【0064】
一方、exclusion要素26bは、ライブラリ「libA-2.0」の内部でライブラリ「libB」を使用しないことを示す要素であって、図11(b)の論理式24において節23jを削除したことに相当する。
【0065】
また、exclusion要素26cは、ライブラリ「libA-2.0」の内部でライブラリ「libC」を使用しないことを示す要素であって、図11(b)の論理式24において節23gを削除したことに相当する。
【0066】
ファイル出力装置20は、複数の論理式24のうちで充足可能となる論理式ごとにこのようなPOMファイル26を出力する。なお、複数のPOMファイル26のうちの一つは第2の定義ファイルの一例であり、これとは別のPOMファイル26は第3の定義ファイルの一例である。
以上により、ファイル出力装置20が行う基本的な処理を終える。
【0067】
上記した本実施形態によれば、ファイル出力装置20が論理式24を生成し、その論理式24のうちで充足可能な論理式に対応したPOMファイル26を出力する。そのPOMファイル26においてはライブラリの衝突が解消されているため、POMファイル26を用いてプロジェクト「prjA」をビルドすることで、単体で動作可能な実行可能プログラムを得ることができる。
【0068】
しかも、ファイル出力装置20は、充足可能な複数の論理式24の各々に対応した複数のPOMファイル26を出力する。そのため、プログラム開発者が、複数のPOMファイル26のうちで自らの意図に合うものを選択することが可能となる。
【0069】
次に、本実施形態に係るファイル出力装置20の機能構成について説明する。
【0070】
図13は、ファイル出力装置20の機能構成図である。
図13に示すように、ファイル出力装置20は、記憶部31と制御部32とを有する。
【0071】
このうち、記憶部31は、前述のPOMファイル1、リスト21、及びPOMファイル26を記憶する。
【0072】
一方、制御部32は、ファイル出力装置20の各部を制御する処理部であって、入力部33、衝突検出部34、論理式生成部35、充足性判定部36、ファイル生成部37、及び出力部38を有する。
【0073】
入力部33は、POMファイル1の入力を受け付け、該POMファイル1を記憶部31に格納する処理部である。一例として、入力部33は、CD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の記録媒体に記録されたPOMファイル1の入力を受け付ける。なお、入力部33は、LAN(Local Area Network)やインターネット等のネットワークとの通信を介して外部の装置からPOMファイル1の入力を受け付けてもよい。
【0074】
また、衝突検出部34は、POMファイル1に基づいてリスト21を生成し、リスト21に基づいてライブラリの衝突を検出する。一例として、衝突検出部34は、POMファイル1と、そのPOMファイル1に記述されているライブラリが参照するPOMファイルとを読み込む。そして、衝突検出部34は、これらのPOMファイルに記述されている全てのライブラリの名称とバージョンとを特定し、名称が同一でバージョンが異なるライブラリが衝突していることを検出する。そして、その検出結果に基づいて、衝突検出部34は、各ライブラリに対して「衝突あり」と「衝突なし」のいずれかの文字列を対応させたリスト21(図8参照)を生成し、それを記憶部31に格納する。
【0075】
論理式生成部35は、リスト21とPOMファイル1とに基づいて論理式24を生成する処理部である。例えば、論理式生成部35は、リスト21に基づいて、相互に衝突しているライブラリを特定する。図8の例では、ライブラリ「libB-1.0」とライブラリ「libB-2.0」が、相互に衝突しているライブラリとして論理式生成部35によって特定される。
【0076】
そして、論理式生成部35は、図10(b)に示したように、POMファイル1の依存グラフ2(図10(a)参照)を表す式23aと、相互に衝突しているライブラリを表す式23bとを論理積で結合した論理式23を生成する。
【0077】
このうち、式23aは、論理式生成部35がPOMファイル1におけるライブラリの依存関係を解析し、二つのライブラリの依存関係を示す節の論理積をとることで生成し得る。また、式23bは、論理式生成部35が、衝突している二つのライブラリの各々を示す命題変数の否定の論理和からなる節を求め、これらの節の論理積をとることで生成し得る。
【0078】
次いで、論理式生成部35は、この論理式23を修正した複数の論理式24(図11(a)、(b))を生成する。例えば、論理式生成部35は、相互に衝突する個々のライブラリごとに、当該ライブラリを含む節を論理式23から削除することにより論理式24を生成する。前述のように、これらの論理式24は、衝突する複数のライブラリのうちの一つのみにプログラムが依存し、残りのライブラリにはプログラムが依存しないことを表す論理式である。
【0079】
充足性判定部36は、例えばSATソルバであって、複数の論理式24の各々が充足可能かどうかを判定する。
【0080】
図14(a)、(b)は、充足性判定部36の判定結果の一例を示す模式図である。
【0081】
このうち、図14(a)は、論理式24が充足可能の場合の判定結果を示す模式図である。この場合は、判定結果「result」が、充足可能を示す「sat」となる。そして、論理式24を真にする命題の組み合わせの例が「model」として出力される。
【0082】
一方、図14(b)は、論理式24が充足不可能の場合の判定結果を示す模式図である。この場合は、判定結果「result」が、充足不可能を示す「unsat」となる。そして、論理式24を充足不可能とする節の一覧が「unsat-core」として出力される。
【0083】
再び図13を参照する。
ファイル生成部37は、充足性判定部36によって充足可能と判断された各々の論理式24に対応したPOMファイル26を生成し、該POMファイル26を記憶部31に格納する処理部である。
【0084】
一例として、ファイル生成部37は、論理式23から削除した節に含まれるライブラリが記述されたexclusion要素をPOMファイル1に追加することによりPOMファイル26を生成する。
【0085】
出力部38は、記憶部31に格納された各POMファイル26をCD-ROM、DVD、及びUSBメモリ等の記録媒体に出力する処理部である。なお、出力部38は、LANやインターネット等のネットワークとの通信を介してPOMファイル26を外部の装置に出力してもよい。
【0086】
次に、本実施形態に係るファイル出力方法について説明する。
図15は、本実施形態に係るファイル出力方法のフローチャートである。
【0087】
まず、入力部33がPOMファイル1の入力を受け付けてそれを記憶部31に格納する(ステップS10)。
【0088】
次いで、衝突検出部34が、そのPOMファイル1に基づいてライブラリ同士の衝突を検出すると共に、衝突の有無を示すリスト21を生成する(ステップS11)。
【0089】
次に、論理式生成部35が、リスト21とPOMファイル1とに基づいて論理式24(図11(a)、(b)参照)を生成する(ステップS12)。
【0090】
本実施形態では、論理式生成部35が、リスト21において相互に衝突する複数のライブラリから一つのライブラリを選択し、そのライブラリを含む節を論理式23から削除することにより論理式24を生成する。例えば、図8の例では、相互に衝突するライブラリ「libB-1.0」とライブラリ「libB-2.0」から論理式生成部35がライブラリ「libB-1.0」を選択し、論理式23(図10(b)参照)からライブラリ「libB-1.0」を削除することにより論理式24(図11(a)、(b)参照)を生成する。
【0091】
次いで、充足性判定部36が論理式24の充足可能性を判定する(ステップS13)。
【0092】
そして、論理式24が充足可能でない場合(ステップS14:否定)は、ステップS12に戻る。この場合は、リスト21において相互に衝突する複数のライブラリのうち、まだ選択されていないライブラリについてステップS12を実行する。
【0093】
一方、論理式24が充足可能である場合(ステップS14:肯定)はステップS15に移る。
【0094】
ステップS15においては、ファイル生成部37が、充足可能な論理式24に対応したPOMファイル26を生成し、該POMファイル26を記憶部31に格納する。例えば、ファイル生成部37は、図12に示したように、相互に衝突する複数のライブラリのうちでステップS12で選択したライブラリが記述されたexclusion要素をPOMファイル1に追加することによりPOMファイル26を生成する。
【0095】
この後は、相互に衝突する複数のライブラリからまだ選択されていないライブラリについてステップS12~S15を繰り返す。
【0096】
そして、出力部38が、記憶部31に格納された各POMファイル26を出力する(ステップS16)。
【0097】
以上により、本実施形態に係るファイル出力方法の基本的な処理を終える。
【0098】
上記した本実施形態によれば、複数のライブラリが衝突している場合に、ソースプログラムが一のライブラリに依存し残りのライブラリには依存しないことを示す論理式24を論理式生成部35が生成する。そして、その論理式24が充足可能であるときに、出力部38が、該論理式24の内容を反映したPOMファイル26を出力する。そのPOMファイル26においてはライブラリ同士の衝突が解消されているため、該POMファイル26に基づいてソースプログラムをコンパイルすることにより、単体で動作可能な実行可能プログラムを得ることができる。
【0099】
しかも、論理式24に基づいてファイル出力装置20が自動でPOMファイル26を出力するため、プログラム開発者が手作業でPOMファイル26を記述する必要がなく、プログラム開発者の負担軽減を図ることもできる。
【0100】
(第2実施形態)
図16は、本実施形態に係るファイル出力装置の処理を示す模式図である。なお、図16において、第1実施形態で説明したのと同じ要素には第1実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
【0101】
本実施形態では、まず、ファイル出力装置20が、POMファイル1とヒント情報41の入力を受け付ける(P11)。POMファイル1は、図1で説明したビルド定義ファイルである。
【0102】
図17(a)は、ヒント情報41の一例を示す模式図である。
ヒント情報41は、プログラム開発者の意向や知恵を記述したファイルである。図17(a)の例では、ヒント情報41は、ライブラリ「libB」に関するヒントであることを示すartifactId要素41aと、その内側に記述されたsubstitutable要素41bとを有する。
【0103】
そのsubstitutable要素41bは、バージョンが「1.x」(1.0≦x<2.0)のライブラリ「libB」は、バージョンが「2.x」(2.0≦x<3.0)のライブラリ「libB」に代替可能であるというプログラム開発者の知恵を示す。
【0104】
図17(b)は、ヒント情報41の他の例を示す模式図である。
そのヒント情報41のsubstitutable要素41bにおいては、バージョンが「2.x」(2.0≦x<3.0)のライブラリ「libB」はバージョンが「1.x」(1.0≦x<2.0)のライブラリ「libB」に代替可能というプログラム開発者の知恵が示されている。
【0105】
再び図16を参照する。
次に、ファイル出力装置20が、POMファイル1に基づいてリスト21を生成する(P12)。図8に示したように、リスト21は、ライブラリと衝突の有無とを対応付けたリストである。
【0106】
次いで、ファイル出力装置20が、POMファイル1、リスト21、及びヒント情報41に従って論理式24を生成する(P13)。例えば、ファイル出力装置20は、リスト21に基づいて、相互に衝突している二つのライブラリを特定する。図8の例では、ライブラリ「libB-1.0」とライブラリ「libB-2.0」が衝突していることをファイル出力装置20が特定する。
【0107】
そして、これらのライブラリの一方が他方で代替可能であることをヒント情報41が示している場合、ファイル出力装置20は、ライブラリの一方を論理式23から削除し、他方のみを論理式23に残すことで論理式24を生成する。
【0108】
例えば、図17(a)のヒント情報41は、ライブラリ「libB-1.0」がライブラリ「libB-2.0」で代替可能であることを示している。よって、図17(a)のヒント情報41を用いる場合、ファイル出力装置20は、ライブラリ「libB-1.0」を含む節23j、23g、23f(図11(b)参照)を論理式23から削除することで論理式24を生成する。
【0109】
図18(a)は、このように図17(a)のヒント情報41を用いた場合に得られた論理式24を示す模式図である。
【0110】
図18(a)に示すように、その論理式24は、図11(b)と同様にライブラリ「libB-1.0」を含む節23f、23g、23jを論理式23から削除した論理式である。第1実施形態で説明したように、この論理式24は充足可能である。
【0111】
一方、図18(b)は、図17(b)のヒント情報41を用いた場合にファイル出力装置20が生成する論理式24を示す模式図である。
【0112】
図17(b)のヒント情報41は、ライブラリ「libB-2.0」がライブラリ「libB-1.0」で代替可能であることを示している。この場合は、図11(a)と同様に、ファイル出力装置20は、ライブラリ「libB-2.0」を含む節23d、23e、23fを論理式23から削除し、かつライブラリ「libB-1.0」を含む節23j、23gを残した論理式24を生成する。また、その論理式24においては、相互に衝突するライブラリ「libC-1.0」、「libC-1.1」のいずれかを含む節23g、23h、23iが残される。
【0113】
再び図16を参照する。
次に、ファイル出力装置20は、論理式24の充足可能性を判定し、充足可能なら当該論理式24に対応したPOMファイル26を出力する(P14)。
【0114】
例えば、図17(a)のヒント情報41に基づいた論理式24(図18(a)参照)は充足可能であるため、この論理式24に対応したPOMファイル26をファイル出力装置20が出力する。
【0115】
図19は、図18(a)の論理式24に対応したPOMファイル26の模式図である。
【0116】
このPOMファイル26は、図12で説明したのと同様であって、プロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示すdependency要素26aを有する。更に、このPOMファイル26は、図18(a)の論理式24において節23jを削除したことに相当するexclusion要素26bと、該論理式24において節23gを削除したことに相当するexclusion要素26cとを有する。
【0117】
再び図16を参照する。
一方、論理式24が充足不可能である場合には、ファイル出力装置20は、修正したヒント情報41と衝突情報42とを出力する(P15)。
【0118】
例えば、図17(b)のヒント情報41に基づいた図18(b)の論理式24は充足不可能である。よって、この場合は、ファイル出力装置20は修正したヒント情報41と衝突情報42とを出力する。
【0119】
図20は、図17(b)のヒント情報41を用いた場合にファイル出力装置20が出力する衝突情報42の模式図である。
【0120】
図18(b)の論理式24ではライブラリ「libC-1.0」、「libC-1.1」の各々を含む節23g、23hが残っており、プロジェクト「prjA」がこれらのライブラリ「libC-1.0」、「libC-1.1」の各々に依存することが示されている。そこで、ファイル出力装置20は、これらのライブラリ「libC-1.0」、「libC-1.1」が原因で図18(b)の論理式24が充足不可能になっていると判断し、衝突情報42を出力する。
【0121】
衝突情報42は、上記のライブラリ「libC-1.0」とライブラリ「libC-1.1」が衝突していることを示すテキストファイルである。図20の例では、「conflicting libraries」として「libC-1.0」と「libC-1.1」が記述されており、これらが衝突していることが明示されている。更に、「required by」に続く文字列により、これらの依存先のライブラリが記述されている。
【0122】
プログラム開発者は、この衝突情報42に基づいて、衝突しているライブラリを特定することができる。
【0123】
図21は、修正したヒント情報41を示す模式図である。
本実施形態では、上記の衝突情報42で衝突することが示された二つのライブラリの一方を他方で代替することが可能であることを示す情報がヒント情報41に追加される。
【0124】
図21の例では、ライブラリ「libC」に関するヒントであることを示すartifactId41cと、その内側のsubstitutable属性41dとをヒント情報41に追加することにより該ヒント情報41を修正する。
【0125】
そのsubstitutable属性41dは、バージョンが「1.0」のライブラリ「libC」が、バージョンが「1.1」のライブラリ「libC」に代替可能であることを示す。
【0126】
このように修正したヒント情報41を利用することで論理式24が実際に充足可能になるかどうかまではファイル出力装置20は判断しないが、論理式24を充足可能にする手掛かりとしてヒント情報41を出力する。
【0127】
これにより、プログラム開発者は、バージョンが「1.0」のライブラリ「libC」をバージョンが「1.1」のライブラリ「libC」で代替することでこれらのライブラリの衝突が解消される可能性があることを把握できる。
【0128】
次に、本実施形態に係るファイル出力方法について、図13の機能構成図と図22とを参照して説明する。
【0129】
図22は、本実施形態に係るファイル出力方法のフローチャートである。
まず、入力部33が、POMファイル1とヒント情報41の入力を受け付け、これらを記憶部31に格納する(ステップS21)。
【0130】
次に、衝突検出部34が、POMファイルに基づいてライブラリ同士の衝突を検出すると共に、衝突の有無を示すリスト21を生成する(ステップS22)。
【0131】
次いで、論理式生成部35が、POMファイル1、リスト21、及びヒント情報41に従って論理式24を生成する(ステップS23)。例えば、論理式生成部35は、POMファイル1に基づいてライブラリ間の依存関係を示す論理式23を生成する。そして、論理式生成部35は、リスト21において相互に衝突しているライブラリを特定する。更に、これらのライブラリの一方が他方で代替可能であることをヒント情報41が示している場合、ファイル出力装置20は、ライブラリの一方を論理式23から削除し、他方のみを論理式23に残すことで論理式24を生成する。
【0132】
次に、充足性判定部36が論理式24の充足可能性を判定する(ステップS24)。
【0133】
ここで、論理式24が充足可能な場合(ステップS25:肯定)にはステップS26に移る。ステップS26においては、ファイル生成部37が、論理式24に対応したPOMファイル26を生成し、該POMファイル26を記憶部31に格納する。例えば、ファイル生成部37は、ステップS23において削除したライブラリが記述されたexclusion要素をPOMファイル1に追加することによりPOMファイル26を生成する。
【0134】
その後に、出力部38が、記憶部31に格納されたPOMファイル26を出力する(ステップS27)。
【0135】
一方、論理式24が充足不可能な場合(ステップS25:否定)にはステップS28に移る。ステップS28においては、ファイル生成部37が、修正したヒント情報41と衝突情報42とを生成し、これらを記憶部31に格納する。
【0136】
その後、出力部38が、記憶部31にある修正されたヒント情報41と衝突情報42を出力する(ステップS29)。
【0137】
以上により、本実施形態に係るファイル出力方法の基本的な処理を終える。
【0138】
上記した本実施形態によれば、論理式生成部35がヒント情報41に従って論理式24を生成し、該論理式24の内容を反映したPOMファイル26を出力部38が出力する。ヒント情報41は、プログラム開発者の意向や知恵を反映した情報であり、例えばあるライブラリが別のライブラリで代替可能であるというプログラム開発者の意向が反映されている。よって、プログラム開発者の意向が反映されたPOMファイル26を出力部38が出力できるようになる。
【0139】
また、論理式24が充足不可能な場合には、出力部38は、衝突情報42と修正されたヒント情報41とを出力する。衝突情報42(図20参照)は、衝突しているライブラリを示す情報であるため、これに基づいてプログラム開発者が衝突している各ライブラリを特定できる。また、修正されたヒント情報41に追加されたsubstitutable属性41d(図21参照)に基づいて、プログラム開発者は、あるライブラリを他のライブラリで代替することでライブラリの衝突を解消できる可能性があることを把握できる。
【0140】
(ハードウェア構成)
次に、第1実施形態と第2実施形態の各々に係るファイル出力装置20のハードウェア構成について説明する。
【0141】
図23は、ファイル出力装置20のハードウェア構成図である。
図23に示すように、ファイル出力装置20は、記憶装置20a、メモリ20b、プロセッサ20c、通信インターフェース20d、表示装置20e、入力装置20f、及び媒体読取装置20gを有する。これらの各部は、バス20hにより相互に接続される。
【0142】
このうち、記憶装置20aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージであって、本実施形態に係るファイル出力プログラム100を記憶する。
【0143】
なお、ファイル出力プログラム100をコンピュータが読み取り可能な記録媒体20kに記録し、媒体読取装置20gを介してプロセッサ20cにそのファイル出力プログラム100を読み取らせるようにしてもよい。
【0144】
そのような記録媒体20kとしては、例えばCD-ROM、DVD、及びUSBメモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体20kとして使用してもよい。これらの記録媒体20kは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【0145】
更に、公衆回線、インターネット、及びLAN等に接続された装置にファイル出力プログラム100を記憶させてもよい。その場合は、プロセッサ20cがそのファイル出力プログラム100を読み出して実行すればよい。
【0146】
一方、メモリ20bは、DRAM(Dynamic Random Access Memory)等のようにデータを一時的に記憶するハードウェアであって、その上にファイル出力プログラム100が展開される。
【0147】
プロセッサ20cは、ファイル出力装置20の各部を制御するCPU(Central Processing Unit)やGPU(Graphical Processing Unit)等のハードウェアである。また、プロセッサ20cは、メモリ20bと協働してファイル出力プログラム100を実行する。
【0148】
このようにメモリ20bとプロセッサ20cとが協働してファイル出力プログラム100を実行することにより、ファイル出力装置20の制御部32(図13参照)が実現される。その制御部32には、入力部33、衝突検出部34、論理式生成部35、充足性判定部36、ファイル生成部37、及び出力部38が含まれる。
【0149】
また、記憶部31(図13参照)は、記憶装置20aとメモリ20bによって実現される。
【0150】
更に、通信インターフェース20dは、ファイル出力装置20をLANやインターネット等のネットワークに接続するためのNIC(Network Interface Card)等のハードウェアである。
【0151】
そして、表示装置20eは、各種の情報を表示するための液晶ディスプレイやタッチパネル等のハードウェアである。
【0152】
また、入力装置20fは、プログラム開発者がファイル出力装置20に各種のデータを入力するためのキーボードやマウス等のハードウェアである。
【0153】
媒体読取装置20gは、記録媒体20kを読み取るためのCDドライブ、DVDドライブ、及びUSBインターフェース等のハードウェアである。
【0154】
以上説明した各実施形態に関し、更に以下の付記を開示する。
(付記1) 複数のライブラリのうちの第1のライブラリと第2のライブラリとにプログラムが依存することを示す第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出し、
前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する、
処理をコンピュータに実行させることを特徴とするファイル出力プログラム。
(付記2) 前記論理式は、複数の節の論理積をとった和積標準形であり、
複数の前記節のいずれかに前記第1のライブラリが命題変数として含まれており、かつ、複数の前記節のいずれにも前記第2のライブラリが命題変数として含まれていないことを特徴とする付記1に記載のファイル出力プログラム。
(付記3) 複数の前記ライブラリのうちの一のライブラリが別のライブラリに依存している場合、前記節は、一の前記ライブラリを示す命題変数の否定と、別の前記ライブラリを示す命題変数との論理和であることを特徴とする付記2に記載のファイル出力プログラム。
(付記4) 複数の前記節のいずれかに、複数の前記ライブラリのうちの第3のライブラリを示す命題変数の否定と、複数の前記ライブラリのうちで前記第3のライブラリに衝突する第4のライブラリを示す命題変数の否定との論理和が含まれることを特徴とする付記2に記載のファイル出力プログラム。
(付記5) 前記論理式が充足不可能と判定された場合、前記プログラムが前記第2のライブラリに依存し、かつ前記プログラムが前記第1のライブラリに依存しないことを示す別の論理式を生成し、
前記別の論理式が充足可能と判定された場合、前記プログラムが前記第2のライブラリに依存し、かつ前記プログラムが前記第1のライブラリに依存しないことを示す第3の定義ファイルを出力する、
処理を前記コンピュータに実行させることを特徴とする付記1に記載のファイル出力プログラム。
(付記6) 前記第2のライブラリが前記第1のライブラリで代替可能であることを示すヒント情報の入力を受け付ける処理を前記コンピュータに実行させ、
前記論理式を生成する処理は、前記ヒント情報に従って、実行される、
ことを特徴とする付記1に記載のファイル出力プログラム。
(付記7) 前記論理式は、複数の前記ライブラリのうちの前記第1のライブラリ、第3のライブラリ、及び第4のライブラリの各々に前記プログラムが依存し、かつ前記第2のライブラリに前記プログラムが依存しないことを示し、
前記コンピュータに、前記論理式が充足不可能となるときに、前記第3のライブラリと前記第4のライブラリとが衝突していることを示す衝突情報を出力する、
処理を実行させるための付記6に記載のファイル出力プログラム。
(付記8) 前記論理式は、複数の節の論理積をとった和積標準形であり、
前記第1のライブラリ、前記第3のライブラリ、及び前記第4のライブラリの各々を示す命題変数が複数の前記節の各々に含まれており、かつ、前記第2のライブラリを示す命題変数が複数の前記節のいずれにも含まれていないことを特徴とする付記7に記載のファイル出力プログラム。
(付記9) 前記コンピュータに、
前記論理式が充足不可能となるときに、前記第3のライブラリと前記第4のライブラリのいずれか一方を他方で代替可能なことを示す情報を前記ヒント情報に追加する、
処理を実行させるための付記7に記載のファイル出力プログラム。
(付記10) 複数のライブラリのうちの第1のライブラリと第2のライブラリとにプログラムが依存することを示す第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出し、
前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する、
処理をコンピュータが実行することを特徴とするファイル出力方法。
(付記11) 複数のライブラリのうちの第1のライブラリと第2のライブラリとにプログラムが依存することを示す第1の定義ファイルに基づいて、前記プログラムにおける前記第1のライブラリと前記第2のライブラリとの衝突を検出する検出部と、
前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す論理式を生成する生成部と、
前記論理式が充足可能と判定された場合、前記プログラムが前記第1のライブラリに依存し、かつ前記プログラムが前記第2のライブラリに依存しないことを示す第2の定義ファイルを出力する出力部と、
を有することを特徴とするファイル出力装置。
【符号の説明】
【0155】
1、26…POMファイル、2…依存グラフ、8…JARファイル、20…ファイル出力装置、21…リスト、23、24…論理式、31…記憶部、32…制御部、33…入力部、34…衝突検出部、35…論理式生成部、36…充足性判定部、37…ファイル生成部、38…出力部、41…ヒント情報、41a…要素、41b…要素、41d…属性、42…衝突情報、100…ファイル出力プログラム。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23