(57)【要約】【課題】ライブラリの衝突を回避すること。【解決手段】  複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイル１に基づいて、プログラムにおける第１のライブラリと第２のライブラリとの衝突を検出し、プログラムが前記第１のライブラリに依存し、かつプログラムが第２のライブラリに依存しないことを示す論理式２４を生成し、論理式２４が充足可能と判定された場合、プログラムが第１のライブラリに依存し、かつプログラムが第２のライブラリに依存しないことを示す第２の定義ファイル２６を出力する、処理をコンピュータに実行させるファイル出力プログラムによる。【選択図】図７
2022002047.tif 000002
【特許請求の範囲】
【請求項１】
複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出し、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する、
処理をコンピュータに実行させることを特徴とするファイル出力プログラム。
【請求項２】
前記論理式が充足不可能と判定された場合、前記プログラムが前記第２のライブラリに依存し、かつ前記プログラムが前記第１のライブラリに依存しないことを示す別の論理式を生成し、
前記別の論理式が充足可能と判定された場合、前記プログラムが前記第２のライブラリに依存し、かつ前記プログラムが前記第１のライブラリに依存しないことを示す第３の定義ファイルを出力する、
処理を前記コンピュータに実行させることを特徴とする請求項１に記載のファイル出力プログラム。
【請求項３】
前記第２のライブラリが前記第１のライブラリで代替可能であることを示すヒント情報の入力を受け付ける処理を前記コンピュータに実行させ、
前記論理式を生成する処理は、前記ヒント情報に従って、実行される、
ことを特徴とする請求項１に記載のファイル出力プログラム。
【請求項４】
複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出し、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する、
処理をコンピュータが実行することを特徴とするファイル出力方法。
【請求項５】
複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出する検出部と、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成する生成部と、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する出力部と、
を有することを特徴とするファイル出力装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ファイル出力プログラム、ファイル出力方法、及びファイル出力装置に関する。
【背景技術】
【０００２】
プログラム開発においては、複数のクラスと関数の集合からなるライブラリを使用することがある。そのライブラリをプログラムが参照することにより、ライブラリに存在するクラスや関数をプログラムで使用することが可能となる。
【０００３】
ライブラリは度々更新されることがあり、同一名称のライブラリで異なるバージョンのライブラリが存在することがある。以下では、同一名称で異なるバージョンの複数のライブラリを一つのプログラムが参照することをライブラリの衝突と呼ぶ。
【０００４】
ソースプログラムにおいてライブラリが衝突していると、複数のライブラリのうちのどのライブラリのクラスを呼び出せばよいのかがコンパイラが判断できないため、コンパイラが実行可能プログラムを生成できない。そのため、ライブラリの衝突がある場合には、コンパイラ等のビルドツールは、ツールに依存した方法でライブラリの取捨選択を行い、ライブラリの衝突を解消する。
【０００５】
しかし、これではプログラムの開発者が意図するライブラリが選択されるとは限らず、開発者の意図とは異なる実行可能プログラムが生成されてしまう。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−７９５３４号公報
【特許文献２】国際公開第２０１６／１７４７４３号
【特許文献３】特開平１１−１１０１９５号公報
【特許文献４】米国特許出願公開第２０１７／００７５６８４号明細書
【特許文献５】米国特許出願公開第２０１５／０２６８９４８号明細書
【非特許文献１】Apache Maven Project, [online], [令和２年５月７日検索]、インターネット< https://maven.apache.org/>
【非特許文献２】OSGi Alliance, [online], [令和２年５月７日検索], インターネット< https://www.osgi.org/>
【非特許文献３】M. Schroeder, “Using SAT for solving package dependencies”, [online], [令和２年５月７日検索], インターネット<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.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
一側面によれば、ライブラリの衝突を回避することを目的とする。
【課題を解決するための手段】
【０００８】
一側面によれば、複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出し、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成し、前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する、処理をコンピュータに実行させるファイル出力プログラムが提供される。
【発明の効果】
【０００９】
一側面によれば、ライブラリの衝突を回避することができる。
【図面の簡単な説明】
【００１０】
【図１】図１は、POMファイルの記述例を示す模式図である。
【図２】図２は、MavenがPOMファイルに基づいて生成した依存グラフの模式図である。
【図３】図３は、グラフ探索の模式図である。
【図４】図４は、修正後のPOMファイルの模式図である。
【図５】図５は、図４のPOMファイルに基づいてMavenが生成した依存グラフの模式図である。
【図６】図６は、図４のPOMファイルに基づいてMavenが生成したJARファイルの模式図である。
【図７】図７は、第１実施形態に係るファイル出力装置の処理を示す模式図である。
【図８】図８は、第１実施形態に係るリストの模式図である。
【図９】図９は、第１実施形態において、ライブラリの依存関係を論理式にエンコーディングするときのルールを示す模式図である。
【図１０】図１０（ａ）は、第１実施形態においてPOMファイルに対応した依存グラフの模式図であり、図１０（ｂ）は、この依存グラフとリストとに対応した論理式の模式図である。
【図１１】図１１（ａ）は、第１実施形態において論理式を修正して得られた一つの論理式の模式図であり、図１１（ｂ）は、第１実施形態において論理式を修正して得られた別の論理式の模式図である。
【図１２】図１２は、図１１（ｂ）の論理式に対応したPOMファイルの模式図である。
【図１３】図１３は、第１実施形態に係るファイル出力装置の機能構成図である。
【図１４】図１４（ａ）、（ｂ）は、第１実施形態に係る充足性判定部の判定結果の一例を示す模式図である。
【図１５】図１５は、第１実施形態に係るファイル出力方法のフローチャートである。
【図１６】図１６は、第２実施形態に係るファイル出力装置の処理を示す模式図である。
【図１７】図１７（ａ）は、第２実施形態に係るヒント情報の一例を示す模式図であり、図１７（ｂ）は、第２実施形態に係るヒント情報の他の例を示す模式図である。
【図１８】図１８（ａ）は、図１７（ａ）のヒント情報を用いた場合に得られた論理式を示す模式図であり、図１８（ｂ）は、図１７（ｂ）のヒント情報を用いた場合に得られた論理式を示す模式図である。
【図１９】図１９は、図１８（ａ）の論理式に対応したPOMファイルの模式図である。
【図２０】図２０は、図１７（ｂ）のヒント情報を用いた場合に第２実施形態に係るファイル出力装置が出力する衝突情報の模式図である。
【図２１】図２１は、第２実施形態において修正したヒント情報を示す模式図である。
【図２２】図２２は、第２実施形態に係るファイル出力方法のフローチャートである。
【図２３】図２３は、第１実施形態と第２実施形態の各々に係るファイル出力装置のハードウェア構成図である。
【発明を実施するための形態】
【００１１】
本実施形態の説明に先立ち、本願発明者が検討した事項について説明する。
【００１２】
まず、ライブラリの衝突について、Java（登録商標）向けのビルドツールであるMavenでビルドを行う場合を例にして説明する。
【００１３】
Mavenでビルドを行う場合、ビルド定義ファイルであるPOM(Project Object Model)ファイルとJava（登録商標）のソースプログラムとに基づいてビルドが実行される。
【００１４】
図１は、POMファイルの記述例を示す模式図である。
POMファイル１は、Java（登録商標）のソースプログラムが依存するライブラリを定義したビルド定義ファイルである。図１の例では、artifactId要素１ａにおいて、Java（登録商標）のソースプログラムの名称がプロジェクト「prjA」であることが特定される。
【００１５】
プロジェクト「prjA」は、あるライブラリで定義されているクラスや関数を参照する場合にそのライブラリに依存するという。このようなライブラリとプロジェクトとの依存関係はdependency要素１ｂ〜１ｄで特定される。例えば、dependency要素１ｂにおいては、プロジェクト「prjA」が、バージョンが「2.0」のライブラリ「libA」に依存することが特定される。
【００１６】
同様に、dependency要素１ｃでは、バージョンが「2.0」のライブラリ「libB」にプロジェクト「prjA」が依存することが特定される。そして、dependency要素１ｄでは、バージョンが「1.1」のライブラリ「libC」にプロジェクト「prjA」が依存することが特定される。
【００１７】
図２は、MavenがPOMファイル１に基づいて生成した依存グラフの模式図である。
【００１８】
この依存グラフ２では、依存元から依存先に向かう有向グラフで依存関係を示す。例えば、プロジェクト「prjA」は、前述のようにライブラリ「libA」、「libB」、及び「libC」の各々に依存することが依存グラフ２により示される。
【００１９】
また、各ライブラリは、更に別のライブラリに依存することがある。この例では、バージョンが「2.0」のライブラリ「libA」が、バージョンが「1.0」のライブラリ「libB」に依存している。この場合、バージョンが「2.0」のライブラリ「libA」は、バージョンが「1.0」のライブラリ「libB」の関数やクラスを参照しているということになる。
【００２０】
このようなライブラリ間の依存関係は、各ライブラリに含まれるPOMファイルで定義される。前述の例では、バージョンが「2.0」のライブラリ「libA」に含まれるPOMファイルにおいて、バージョンが「1.0」のライブラリ「libB」との依存関係が定義される。
【００２１】
ところで、図２の例では、バージョンが「1.0」と「2.0」で相違する二つのライブラリ「libB」にプロジェクト「prjA」が依存している。前述のように、名称が同一でバージョンが異なる複数のライブラリをあるプログラムが参照しているとき、そのプログラムにおいてライブラリの衝突が発生しているという。プロジェクト「prjA」においては、ライブラリ「libB」の衝突が発生している。同様に、ライブラリ「libC」の衝突もプロジェクト「prjA」において発生している。
【００２２】
ライブラリが衝突している場合、Mavenにおいては、衝突している複数のライブラリのうちの一つのみをグラフ探索を利用して選択する。
【００２３】
図３は、そのグラフ探索の模式図である。
図３に示すように、Mavenにおいては、深さ優先探索で依存グラフ２を探索したときに最初に見つかったライブラリを選択し、後に見つかった名称が同一のライブラリは選択しない。
【００２４】
この例で深さ優先探索を行うと、バージョンが「2.0」のライブラリ「libA」、バージョンが「1.0」のライブラリ「libB」、バージョンが「1.0」のライブラリ「libC」がこの順に見つかる。これらのライブラリは衝突していないため、プロジェクト「prjA」が参照するライブラリとしてMavenが選択する。
【００２５】
一方、バージョンが「2.0」のライブラリ「libB」は、バージョンが「1.0」のライブラリ「libB」と衝突しており、かつバージョンが「1.0」のライブラリ「libB」よりも後に発見される。そのため、Mavenは、バージョンが「2.0」のライブラリ「libB」を選択しない。同様の理由により、Mavenは、バージョンが「1.1」のライブラリ「libC」も選択しない。
【００２６】
これによりライブラリ同士の衝突が一応は解決される。但し、これでは開発者が意図しないライブラリが選択されてしまい、開発者が意図したプログラムが得られないことがある。例えば、上記の例では、バージョンが「2.0」のライブラリ「libB」にのみ定義された関数やクラス等の資源をプロジェクト「prjA」が参照していると、その資源をプロジェクト「prjA」が参照できなくなるという問題が生じる。
【００２７】
このような問題は、開発者がPOMファイル１を修正することにより回避できる。
【００２８】
図４は、修正後のPOMファイル１の模式図である。
この例では、開発者は、プロジェクト「prjA」がライブラリ「libA」に依存することを特定するためのdependency要素１ｂの内側にexclusion要素１ｆ、１ｇを記述する。
【００２９】
exclusion要素１ｆは、ライブラリ「libA」がライブラリ「libB」に依存する場合であっても、ライブラリ「libA」の内部でライブラリ「libB」を使用しないことを示す要素である。同様に、exclusion要素１ｇは、ライブラリ「libA」がライブラリ「libC」に依存する場合であっても、ライブラリ「libA」の内部でライブラリ「libC」を使用しないことを示す要素である。
【００３０】
図５は、図４のPOMファイル１に基づいてMavenが生成した依存グラフの模式図である。
【００３１】
前述のようにexclusion要素１ｆ、１ｇでライブラリ「libA」からライブラリ「libB」、「libC」を排除したため、この依存グラフ２においてはライブラリ「libA」の子ノードに対応するライブラリ「libB」、「libC」が選択されない。
【００３２】
これにより、バージョンが「2.0」のライブラリ「libB」をMavenが選択するようになるため、バージョンが「2.0」のライブラリ「libB」にのみ定義された資源をプロジェクト「prjA」が参照できるようになる。
【００３３】
なお、このようにexclusion要素１ｆ、１ｇを使用するのに代えて、POMファイル１において「libA」の記載を「libB」と「libC」の各々の記載よりも後に移動してもよい。これによっても、図５と同様に、ライブラリ「libA」の子ノードに対応するライブラリ「libB」、「libC」をMavenが排除するようになる。
【００３４】
図６は、図４のPOMファイル１に基づいてMavenがプロジェクト「prjA」をビルドして得られたJARファイルの模式図である。
【００３５】
JARファイル８は、Mavenが生成する実行可能プログラムであって、図５の依存グラフ２で選択されたライブラリ「libA」、「libB」、「libC」を内包する。このJARファイル８は、ライブラリの衝突が解決されているため、他のJARファイルをクラスパスに加える必要がない単体で動作可能な実行可能プログラムとなる。
【００３６】
前述のように、開発者が図４のようにPOMファイル１を修正することによりライブラリ同士の衝突を解消でき、単体で動作可能な実行可能プログラムを得ることができる。しかし、ライブラリの依存関係が複雑な場合は、図４のようにPOMファイルを人手で修正するのは煩雑な作業となり、プログラム開発を効率化するうえでの障害となる。
【００３７】
（第１実施形態）
図７は、本実施形態に係るファイル出力装置の処理を示す模式図である。
【００３８】
このファイル出力装置２０は、サーバやPC(Personal Computer)等のコンピュータであって、以下のようにしてPOMファイルを修正してライブラリ同士の衝突を解決する。
【００３９】
まず、ファイル出力装置２０がPOMファイル１の入力を受け付ける（Ｐ１）。POMファイル１は、図１を参照して説明したように、Java（登録商標）のソースプログラムが依存するライブラリを定義したビルド定義ファイルである。なお、POMファイル１の中身は図１におけるのと同じなのでその説明は省略する。また、POMファイル１は第１の定義ファイルの一例である。
【００４０】
次いで、ファイル出力装置２０が、POMファイル１に基づいて、Java（登録商標）のソースプログラムが使用する各ライブラリが衝突しているかを示すリスト２１を生成する（Ｐ２）。
【００４１】
図８は、そのリスト２１の模式図である。
本実施形態では、後述のように論理式の命題変数としてライブラリを使用するため、リスト２１の命題変数の欄にはライブラリが格納される。ここでは、ライブラリの書式として、ライブラリの名称とバージョンとをハイフンで連結した書式を採用する。例えば、「libA-2.0」は、バージョンが「2.0」のライブラリ「libA」を示す。更に、この例ではソースプログラムを示すプロジェクト「prjA」も命題変数として格納する。
【００４２】
また、衝突の有無の欄には、ライブラリが他のライブラリと衝突しているかを示す文字列が格納される。例えば、他のライブラリと衝突していないライブラリ「libA-2.0」は、文字列「衝突なし」と対応付けてリスト２１に格納される。一方、ライブラリ「libB-1.0」とライブラリ「libB-2.0」は相互に衝突しているため、これらのライブラリと文字列「衝突あり」とが対応付けられてリスト２１に格納される。
【００４３】
再び図７を参照する。
次いで、ファイル出力装置２０が、プロジェクト「prjA」とライブラリとの依存関係を示す論理式２４を生成する（Ｐ３）。
【００４４】
図９は、ライブラリの依存関係を論理式にエンコーディングするときのルールを示す模式図である。
【００４５】
図９に示すように、論理式「A」は、ライブラリAがプログラムで使用されていることを示す。また、論理式「¬A」は、ライブラリAがプログラムで使用されていないことを示す。
【００４６】
そして、論理式「¬A∨B」は、ライブラリAがライブラリBに依存することを示す。更に、論理式「¬A∨¬B」は、ライブラリAとライブラリBが衝突することを示す。
【００４７】
図１０（ａ）は、POMファイル１に対応した依存グラフ２の模式図である。そして、図１０（ｂ）は、この依存グラフ２とリスト２１とに対応した論理式２３の模式図である。
【００４８】
図１０（ｂ）に示すように、論理式２３は、複数の節の論理積をとった和積標準形(Conjunctive Normal Form: CNF)の論理式である。この例では、論理式２３は、依存グラフ２を表す式２３ａと、リスト２１を表す式２３ｂとを有する。
【００４９】
このうち、式２３ａにおいては、論理積「∧」で区切られた個々の節がライブラリの依存関係を表す。図９に示したように、各々の節においては、ライブラリを示す命題変数の否定と、これとは別のライブラリを示す命題変数との論理和をとることにより、これらのライブラリ同士の依存関係を表す。例えば、節「¬prjA ∨ libA-2.0」はプロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示し、節「¬libA-2.0 ∨ libB-1.0」はライブラリ「libA-2.0」がライブラリ「libB-1.0」に依存することを表す。これらの節は、ファイル出力装置２０が、POMファイル１（図１参照）に基づいてライブラリの依存関係を特定し、依存元のライブラリを示す命題変数の否定と、依存先のライブラリを示す命題変数の論理和をとることで生成する。
【００５０】
一方、式２３ｂにおいては、論理積「∧」で区切られた個々の節がライブラリ同士の衝突を表す。この例では、節「¬libB-1.0 ∨ ¬libB-2.0」が、ライブラリ「libB-1.0」とライブラリ「libB-2.0」とが衝突することを表す。そして、節「¬libC-1.0 ∨ ¬libC-1.1」が、ライブラリ「libC-1.0」とライブラリ「libC-1.1」とが衝突することを表す。これらの節は、ファイル出力装置２０が、リスト２１（図８参照）を参照することにより相互に衝突しているライブラリを特定し、これらのライブラリを示す命題変数の否定の論理和をとることで生成する。
【００５１】
また、本実施形態では、ファイル出力装置２０がこの論理式２３を修正した複数の論理式２４を生成する。
【００５２】
図１１（ａ）は、論理式２３を修正して得られた一つの論理式２４の模式図である。
【００５３】
本実施形態では、論理式２３において互いに衝突しているライブラリ「libB-1.0」とライブラリ「libB-2.0」に着目する。なお、ライブラリ「libB-1.0」とライブラリ「libB-2.0」のうちの一方は第１のライブラリの一例であり、他方は第２のライブラリの一例である。そして、これらのライブラリのうち、ライブラリ「libB-2.0」を含む節２３ｄ、２３ｅ、２３ｆを論理式２３から削除し、ライブラリ「libB-1.0」を含む節２３ｊを残すことにより論理式２４を得る。
【００５４】
この論理式２４は、プロジェクト「prjA」がライブラリ「libB-1.0」に依存し、かつライブラリ「libB-2.0」に依存しないことを示す論理式である。また、この論理式２４には、相互に衝突するライブラリ「libC-1.0」とライブラリ「libC-1.1」の各々の否定の論理和をとった節２３ｉも残される。これらのライブラリ「libC-1.0」とライブラリ「libC-1.1」の一方は第３のライブラリの一例であり、他方は第４のライブラリの一例である。
【００５５】
図１１（ａ）の例では、「libC-1.0」と「libC-1.1」の各々の真理値の任意の組み合わせに対し、三つの節２３ｇ、２３ｈ、２３ｉの少なくとも一つの真理値が偽となる。よって、論理式２４は充足不可能となり、論理式２４が表すPOMファイルではライブラリの衝突は解消されない。
【００５６】
図１１（ｂ）は、論理式２３を修正して得られた別の論理式２４の模式図である。
【００５７】
この論理式２４は、ライブラリ「libB-1.0」を含む節２３ｆ、２３ｇ、２３ｊを論理式２３から削除し、かつライブラリ「libB-2.0」を含む節２３ｄ、２３ｅを残した論理式である。この論理式２４は充足可能であるため、論理式２４が表すPOMファイルを使用することでライブラリの衝突を解消することができる。なお、この論理式２４を充足可能とする各命題変数の値は次の通りである。
【００５８】
「prjA」：真
「libA-2.0」：真
「libB-2.0」：真
「libC-1.1」：真
「libC-1.1」：偽
【００５９】
本実施形態では、このように衝突する複数のライブラリ「libB-1.0」、「libB-2.0」ごとにファイル出力装置２０が論理式２４（図１１（ａ）、図１１（ｂ）参照）を生成する。これらの論理式２４の各々は、衝突する複数のライブラリ「libB-1.0」、「libB-2.0」のうちの一つのみにプログラムが依存し、残りのライブラリにはプログラムが依存しないことを表す論理式となる。
【００６０】
再び図７を参照する。
次いで、ファイル出力装置２０が、複数の論理式２４のうちで充足可能となる論理式を特定し、その論理式２４に対応したPOMファイル２６を出力する（Ｐ４）。例えば、ファイル出力装置２０は、論理式２４の充足可能性をSAT(satisfiability)ソルバで特定する。SATソルバは高速に処理が可能なソルバであり、複数の論理式２４のうちで充足可能となる論理式をファイル出力装置２０が素早く特定することができる。
【００６１】
図１２は、図１１（ｂ）の論理式２４に対応したPOMファイル２６の模式図である。
【００６２】
図１２に示すように、このPOMファイル２６はdependency要素２６ａと、その内側に記述されたexclusion要素２６ｂ、２６ｃを有する。
【００６３】
このうち、dependency要素２６ａは、プロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示す要素である。
【００６４】
一方、exclusion要素２６ｂは、ライブラリ「libA-2.0」の内部でライブラリ「libB」を使用しないことを示す要素であって、図１１（ｂ）の論理式２４において節２３ｊを削除したことに相当する。
【００６５】
また、exclusion要素２６ｃは、ライブラリ「libA-2.0」の内部でライブラリ「libC」を使用しないことを示す要素であって、図１１（ｂ）の論理式２４において節２３ｇを削除したことに相当する。
【００６６】
ファイル出力装置２０は、複数の論理式２４のうちで充足可能となる論理式ごとにこのようなPOMファイル２６を出力する。なお、複数のPOMファイル２６のうちの一つは第２の定義ファイルの一例であり、これとは別のPOMファイル２６は第３の定義ファイルの一例である。
以上により、ファイル出力装置２０が行う基本的な処理を終える。
【００６７】
上記した本実施形態によれば、ファイル出力装置２０が論理式２４を生成し、その論理式２４のうちで充足可能な論理式に対応したPOMファイル２６を出力する。そのPOMファイル２６においてはライブラリの衝突が解消されているため、POMファイル２６を用いてプロジェクト「prjA」をビルドすることで、単体で動作可能な実行可能プログラムを得ることができる。
【００６８】
しかも、ファイル出力装置２０は、充足可能な複数の論理式２４の各々に対応した複数のPOMファイル２６を出力する。そのため、プログラム開発者が、複数のPOMファイル２６のうちで自らの意図に合うものを選択することが可能となる。
【００６９】
次に、本実施形態に係るファイル出力装置２０の機能構成について説明する。
【００７０】
図１３は、ファイル出力装置２０の機能構成図である。
図１３に示すように、ファイル出力装置２０は、記憶部３１と制御部３２とを有する。
【００７１】
このうち、記憶部３１は、前述のPOMファイル１、リスト２１、及びPOMファイル２６を記憶する。
【００７２】
一方、制御部３２は、ファイル出力装置２０の各部を制御する処理部であって、入力部３３、衝突検出部３４、論理式生成部３５、充足性判定部３６、ファイル生成部３７、及び出力部３８を有する。
【００７３】
入力部３３は、POMファイル１の入力を受け付け、該POMファイル１を記憶部３１に格納する処理部である。一例として、入力部３３は、CD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の記録媒体に記録されたPOMファイル１の入力を受け付ける。なお、入力部３３は、LAN(Local Area Network)やインターネット等のネットワークとの通信を介して外部の装置からPOMファイル１の入力を受け付けてもよい。
【００７４】
また、衝突検出部３４は、POMファイル１に基づいてリスト２１を生成し、リスト２１に基づいてライブラリの衝突を検出する。一例として、衝突検出部３４は、POMファイル１と、そのPOMファイル１に記述されているライブラリが参照するPOMファイルとを読み込む。そして、衝突検出部３４は、これらのPOMファイルに記述されている全てのライブラリの名称とバージョンとを特定し、名称が同一でバージョンが異なるライブラリが衝突していることを検出する。そして、その検出結果に基づいて、衝突検出部３４は、各ライブラリに対して「衝突あり」と「衝突なし」のいずれかの文字列を対応させたリスト２１（図８参照）を生成し、それを記憶部３１に格納する。
【００７５】
論理式生成部３５は、リスト２１とPOMファイル１とに基づいて論理式２４を生成する処理部である。例えば、論理式生成部３５は、リスト２１に基づいて、相互に衝突しているライブラリを特定する。図８の例では、ライブラリ「libB-1.0」とライブラリ「libB-2.0」が、相互に衝突しているライブラリとして論理式生成部３５によって特定される。
【００７６】
そして、論理式生成部３５は、図１０（ｂ）に示したように、POMファイル１の依存グラフ２（図１０（ａ）参照）を表す式２３ａと、相互に衝突しているライブラリを表す式２３ｂとを論理積で結合した論理式２３を生成する。
【００７７】
このうち、式２３ａは、論理式生成部３５がPOMファイル１におけるライブラリの依存関係を解析し、二つのライブラリの依存関係を示す節の論理積をとることで生成し得る。また、式２３ｂは、論理式生成部３５が、衝突している二つのライブラリの各々を示す命題変数の否定の論理和からなる節を求め、これらの節の論理積をとることで生成し得る。
【００７８】
次いで、論理式生成部３５は、この論理式２３を修正した複数の論理式２４（図１１（ａ）、（ｂ））を生成する。例えば、論理式生成部３５は、相互に衝突する個々のライブラリごとに、当該ライブラリを含む節を論理式２３から削除することにより論理式２４を生成する。前述のように、これらの論理式２４は、衝突する複数のライブラリのうちの一つのみにプログラムが依存し、残りのライブラリにはプログラムが依存しないことを表す論理式である。
【００７９】
充足性判定部３６は、例えばSATソルバであって、複数の論理式２４の各々が充足可能かどうかを判定する。
【００８０】
図１４（ａ）、（ｂ）は、充足性判定部３６の判定結果の一例を示す模式図である。
【００８１】
このうち、図１４（ａ）は、論理式２４が充足可能の場合の判定結果を示す模式図である。この場合は、判定結果「result」が、充足可能を示す「sat」となる。そして、論理式２４を真にする命題の組み合わせの例が「model」として出力される。
【００８２】
一方、図１４（ｂ）は、論理式２４が充足不可能の場合の判定結果を示す模式図である。この場合は、判定結果「result」が、充足不可能を示す「unsat」となる。そして、論理式２４を充足不可能とする節の一覧が「unsat-core」として出力される。
【００８３】
再び図１３を参照する。
ファイル生成部３７は、充足性判定部３６によって充足可能と判断された各々の論理式２４に対応したPOMファイル２６を生成し、該POMファイル２６を記憶部３１に格納する処理部である。
【００８４】
一例として、ファイル生成部３７は、論理式２３から削除した節に含まれるライブラリが記述されたexclusion要素をPOMファイル１に追加することによりPOMファイル２６を生成する。
【００８５】
出力部３８は、記憶部３１に格納された各POMファイル２６をCD-ROM、DVD、及びUSBメモリ等の記録媒体に出力する処理部である。なお、出力部３８は、LANやインターネット等のネットワークとの通信を介してPOMファイル２６を外部の装置に出力してもよい。
【００８６】
次に、本実施形態に係るファイル出力方法について説明する。
図１５は、本実施形態に係るファイル出力方法のフローチャートである。
【００８７】
まず、入力部３３がPOMファイル１の入力を受け付けてそれを記憶部３１に格納する（ステップＳ１０）。
【００８８】
次いで、衝突検出部３４が、そのPOMファイル１に基づいてライブラリ同士の衝突を検出すると共に、衝突の有無を示すリスト２１を生成する（ステップＳ１１）。
【００８９】
次に、論理式生成部３５が、リスト２１とPOMファイル１とに基づいて論理式２４（図１１（ａ）、（ｂ）参照）を生成する（ステップＳ１２）。
【００９０】
本実施形態では、論理式生成部３５が、リスト２１において相互に衝突する複数のライブラリから一つのライブラリを選択し、そのライブラリを含む節を論理式２３から削除することにより論理式２４を生成する。例えば、図８の例では、相互に衝突するライブラリ「libB-1.0」とライブラリ「libB-2.0」から論理式生成部３５がライブラリ「libB-1.0」を選択し、論理式２３（図１０（ｂ）参照）からライブラリ「libB-1.0」を削除することにより論理式２４（図１１（ａ）、（ｂ）参照）を生成する。
【００９１】
次いで、充足性判定部３６が論理式２４の充足可能性を判定する（ステップＳ１３）。
【００９２】
そして、論理式２４が充足可能でない場合（ステップＳ１４：否定）は、ステップＳ１２に戻る。この場合は、リスト２１において相互に衝突する複数のライブラリのうち、まだ選択されていないライブラリについてステップＳ１２を実行する。
【００９３】
一方、論理式２４が充足可能である場合（ステップＳ１４：肯定）はステップＳ１５に移る。
【００９４】
ステップＳ１５においては、ファイル生成部３７が、充足可能な論理式２４に対応したPOMファイル２６を生成し、該POMファイル２６を記憶部３１に格納する。例えば、ファイル生成部３７は、図１２に示したように、相互に衝突する複数のライブラリのうちでステップＳ１２で選択したライブラリが記述されたexclusion要素をPOMファイル１に追加することによりPOMファイル２６を生成する。
【００９５】
この後は、相互に衝突する複数のライブラリからまだ選択されていないライブラリについてステップＳ１２〜Ｓ１５を繰り返す。
【００９６】
そして、出力部３８が、記憶部３１に格納された各POMファイル２６を出力する（ステップＳ１６）。
【００９７】
以上により、本実施形態に係るファイル出力方法の基本的な処理を終える。
【００９８】
上記した本実施形態によれば、複数のライブラリが衝突している場合に、ソースプログラムが一のライブラリに依存し残りのライブラリには依存しないことを示す論理式２４を論理式生成部３５が生成する。そして、その論理式２４が充足可能であるときに、出力部３８が、該論理式２４の内容を反映したPOMファイル２６を出力する。そのPOMファイル２６においてはライブラリ同士の衝突が解消されているため、該POMファイル２６に基づいてソースプログラムをコンパイルすることにより、単体で動作可能な実行可能プログラムを得ることができる。
【００９９】
しかも、論理式２４に基づいてファイル出力装置２０が自動でPOMファイル２６を出力するため、プログラム開発者が手作業でPOMファイル２６を記述する必要がなく、プログラム開発者の負担軽減を図ることもできる。
【０１００】
（第２実施形態）
図１６は、本実施形態に係るファイル出力装置の処理を示す模式図である。なお、図１６において、第１実施形態で説明したのと同じ要素には第１実施形態におけるのと同じ符号を付し、以下ではその説明を省略する。
【０１０１】
本実施形態では、まず、ファイル出力装置２０が、POMファイル１とヒント情報４１の入力を受け付ける（Ｐ１１）。POMファイル１は、図１で説明したビルド定義ファイルである。
【０１０２】
図１７（ａ）は、ヒント情報４１の一例を示す模式図である。
ヒント情報４１は、プログラム開発者の意向や知恵を記述したファイルである。図１７（ａ）の例では、ヒント情報４１は、ライブラリ「libB」に関するヒントであることを示すartifactId要素４１ａと、その内側に記述されたsubstitutable要素４１ｂとを有する。
【０１０３】
そのsubstitutable要素４１ｂは、バージョンが「1.x」（1.0≦x＜2.0）のライブラリ「libB」は、バージョンが「2.x」（2.0≦x＜3.0）のライブラリ「libB」に代替可能であるというプログラム開発者の知恵を示す。
【０１０４】
図１７（ｂ）は、ヒント情報４１の他の例を示す模式図である。
そのヒント情報４１のsubstitutable要素４１ｂにおいては、バージョンが「2.x」（2.0≦x＜3.0）のライブラリ「libB」はバージョンが「1.x」（1.0≦x＜2.0）のライブラリ「libB」に代替可能というプログラム開発者の知恵が示されている。
【０１０５】
再び図１６を参照する。
次に、ファイル出力装置２０が、POMファイル１に基づいてリスト２１を生成する（Ｐ１２）。図８に示したように、リスト２１は、ライブラリと衝突の有無とを対応付けたリストである。
【０１０６】
次いで、ファイル出力装置２０が、POMファイル１、リスト２１、及びヒント情報４１に従って論理式２４を生成する（Ｐ１３）。例えば、ファイル出力装置２０は、リスト２１に基づいて、相互に衝突している二つのライブラリを特定する。図８の例では、ライブラリ「libB-1.0」とライブラリ「libB-2.0」が衝突していることをファイル出力装置２０が特定する。
【０１０７】
そして、これらのライブラリの一方が他方で代替可能であることをヒント情報４１が示している場合、ファイル出力装置２０は、ライブラリの一方を論理式２３から削除し、他方のみを論理式２３に残すことで論理式２４を生成する。
【０１０８】
例えば、図１７（ａ）のヒント情報４１は、ライブラリ「libB-1.0」がライブラリ「libB-2.0」で代替可能であることを示している。よって、図１７（ａ）のヒント情報４１を用いる場合、ファイル出力装置２０は、ライブラリ「libB-1.0」を含む節２３ｊ、２３ｇ、２３ｆ（図１１（ｂ）参照）を論理式２３から削除することで論理式２４を生成する。
【０１０９】
図１８（ａ）は、このように図１７（ａ）のヒント情報４１を用いた場合に得られた論理式２４を示す模式図である。
【０１１０】
図１８（ａ）に示すように、その論理式２４は、図１１（ｂ）と同様にライブラリ「libB-1.0」を含む節２３ｆ、２３ｇ、２３ｊを論理式２３から削除した論理式である。第１実施形態で説明したように、この論理式２４は充足可能である。
【０１１１】
一方、図１８（ｂ）は、図１７（ｂ）のヒント情報４１を用いた場合にファイル出力装置２０が生成する論理式２４を示す模式図である。
【０１１２】
図１７（ｂ）のヒント情報４１は、ライブラリ「libB-2.0」がライブラリ「libB-1.0」で代替可能であることを示している。この場合は、図１１（ａ）と同様に、ファイル出力装置２０は、ライブラリ「libB-2.0」を含む節２３ｄ、２３ｅ、２３ｆを論理式２３から削除し、かつライブラリ「libB-1.0」を含む節２３ｊ、２３ｇを残した論理式２４を生成する。また、その論理式２４においては、相互に衝突するライブラリ「libC-1.0」、「libC-1.1」のいずれかを含む節２３ｇ、２３ｈ、２３ｉが残される。
【０１１３】
再び図１６を参照する。
次に、ファイル出力装置２０は、論理式２４の充足可能性を判定し、充足可能なら当該論理式２４に対応したPOMファイル２６を出力する（Ｐ１４）。
【０１１４】
例えば、図１７（ａ）のヒント情報４１に基づいた論理式２４（図１８（ａ）参照）は充足可能であるため、この論理式２４に対応したPOMファイル２６をファイル出力装置２０が出力する。
【０１１５】
図１９は、図１８（ａ）の論理式２４に対応したPOMファイル２６の模式図である。
【０１１６】
このPOMファイル２６は、図１２で説明したのと同様であって、プロジェクト「prjA」がライブラリ「libA-2.0」に依存することを示すdependency要素２６ａを有する。更に、このPOMファイル２６は、図１８（ａ）の論理式２４において節２３ｊを削除したことに相当するexclusion要素２６ｂと、該論理式２４において節２３ｇを削除したことに相当するexclusion要素２６ｃとを有する。
【０１１７】
再び図１６を参照する。
一方、論理式２４が充足不可能である場合には、ファイル出力装置２０は、修正したヒント情報４１と衝突情報４２とを出力する（Ｐ１５）。
【０１１８】
例えば、図１７（ｂ）のヒント情報４１に基づいた図１８（ｂ）の論理式２４は充足不可能である。よって、この場合は、ファイル出力装置２０は修正したヒント情報４１と衝突情報４２とを出力する。
【０１１９】
図２０は、図１７（ｂ）のヒント情報４１を用いた場合にファイル出力装置２０が出力する衝突情報４２の模式図である。
【０１２０】
図１８（ｂ）の論理式２４ではライブラリ「libC-1.0」、「libC-1.1」の各々を含む節２３ｇ、２３ｈが残っており、プロジェクト「prjA」がこれらのライブラリ「libC-1.0」、「libC-1.1」の各々に依存することが示されている。そこで、ファイル出力装置２０は、これらのライブラリ「libC-1.0」、「libC-1.1」が原因で図１８（ｂ）の論理式２４が充足不可能になっていると判断し、衝突情報４２を出力する。
【０１２１】
衝突情報４２は、上記のライブラリ「libC-1.0」とライブラリ「libC-1.1」が衝突していることを示すテキストファイルである。図２０の例では、「conflicting libraries」として「libC-1.0」と「libC-1.1」が記述されており、これらが衝突していることが明示されている。更に、「required by」に続く文字列により、これらの依存先のライブラリが記述されている。
【０１２２】
プログラム開発者は、この衝突情報４２に基づいて、衝突しているライブラリを特定することができる。
【０１２３】
図２１は、修正したヒント情報４１を示す模式図である。
本実施形態では、上記の衝突情報４２で衝突することが示された二つのライブラリの一方を他方で代替することが可能であることを示す情報がヒント情報４１に追加される。
【０１２４】
図２１の例では、ライブラリ「libC」に関するヒントであることを示すartifactId４１ｃと、その内側のsubstitutable属性４１ｄとをヒント情報４１に追加することにより該ヒント情報４１を修正する。
【０１２５】
そのsubstitutable属性４１ｄは、バージョンが「1.0」のライブラリ「libC」が、バージョンが「1.1」のライブラリ「libC」に代替可能であることを示す。
【０１２６】
このように修正したヒント情報４１を利用することで論理式２４が実際に充足可能になるかどうかまではファイル出力装置２０は判断しないが、論理式２４を充足可能にする手掛かりとしてヒント情報４１を出力する。
【０１２７】
これにより、プログラム開発者は、バージョンが「1.0」のライブラリ「libC」をバージョンが「1.1」のライブラリ「libC」で代替することでこれらのライブラリの衝突が解消される可能性があることを把握できる。
【０１２８】
次に、本実施形態に係るファイル出力方法について、図１３の機能構成図と図２２とを参照して説明する。
【０１２９】
図２２は、本実施形態に係るファイル出力方法のフローチャートである。
まず、入力部３３が、POMファイル１とヒント情報４１の入力を受け付け、これらを記憶部３１に格納する（ステップＳ２１）。
【０１３０】
次に、衝突検出部３４が、POMファイルに基づいてライブラリ同士の衝突を検出すると共に、衝突の有無を示すリスト２１を生成する（ステップＳ２２）。
【０１３１】
次いで、論理式生成部３５が、POMファイル１、リスト２１、及びヒント情報４１に従って論理式２４を生成する（ステップＳ２３）。例えば、論理式生成部３５は、POMファイル１に基づいてライブラリ間の依存関係を示す論理式２３を生成する。そして、論理式生成部３５は、リスト２１において相互に衝突しているライブラリを特定する。更に、これらのライブラリの一方が他方で代替可能であることをヒント情報４１が示している場合、ファイル出力装置２０は、ライブラリの一方を論理式２３から削除し、他方のみを論理式２３に残すことで論理式２４を生成する。
【０１３２】
次に、充足性判定部３６が論理式２４の充足可能性を判定する（ステップＳ２４）。
【０１３３】
ここで、論理式２４が充足可能な場合（ステップＳ２５：肯定）にはステップＳ２６に移る。ステップＳ２６においては、ファイル生成部３７が、論理式２４に対応したPOMファイル２６を生成し、該POMファイル２６を記憶部３１に格納する。例えば、ファイル生成部３７は、ステップＳ２３において削除したライブラリが記述されたexclusion要素をPOMファイル１に追加することによりPOMファイル２６を生成する。
【０１３４】
その後に、出力部３８が、記憶部３１に格納されたPOMファイル２６を出力する（ステップＳ２７）。
【０１３５】
一方、論理式２４が充足不可能な場合（ステップＳ２５：否定）にはステップＳ２８に移る。ステップＳ２８においては、ファイル生成部３７が、修正したヒント情報４１と衝突情報４２とを生成し、これらを記憶部３１に格納する。
【０１３６】
その後、出力部３８が、記憶部３１にある修正されたヒント情報４１と衝突情報４２を出力する（ステップＳ２９）。
【０１３７】
以上により、本実施形態に係るファイル出力方法の基本的な処理を終える。
【０１３８】
上記した本実施形態によれば、論理式生成部３５がヒント情報４１に従って論理式２４を生成し、該論理式２４の内容を反映したPOMファイル２６を出力部３８が出力する。ヒント情報４１は、プログラム開発者の意向や知恵を反映した情報であり、例えばあるライブラリが別のライブラリで代替可能であるというプログラム開発者の意向が反映されている。よって、プログラム開発者の意向が反映されたPOMファイル２６を出力部３８が出力できるようになる。
【０１３９】
また、論理式２４が充足不可能な場合には、出力部３８は、衝突情報４２と修正されたヒント情報４１とを出力する。衝突情報４２（図２０参照）は、衝突しているライブラリを示す情報であるため、これに基づいてプログラム開発者が衝突している各ライブラリを特定できる。また、修正されたヒント情報４１に追加されたsubstitutable属性４１ｄ（図２１参照）に基づいて、プログラム開発者は、あるライブラリを他のライブラリで代替することでライブラリの衝突を解消できる可能性があることを把握できる。
【０１４０】
（ハードウェア構成）
次に、第１実施形態と第２実施形態の各々に係るファイル出力装置２０のハードウェア構成について説明する。
【０１４１】
図２３は、ファイル出力装置２０のハードウェア構成図である。
図２３に示すように、ファイル出力装置２０は、記憶装置２０ａ、メモリ２０ｂ、プロセッサ２０ｃ、通信インターフェース２０ｄ、表示装置２０ｅ、入力装置２０ｆ、及び媒体読取装置２０ｇを有する。これらの各部は、バス２０ｈにより相互に接続される。
【０１４２】
このうち、記憶装置２０ａは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージであって、本実施形態に係るファイル出力プログラム１００を記憶する。
【０１４３】
なお、ファイル出力プログラム１００をコンピュータが読み取り可能な記録媒体２０ｋに記録し、媒体読取装置２０ｇを介してプロセッサ２０ｃにそのファイル出力プログラム１００を読み取らせるようにしてもよい。
【０１４４】
そのような記録媒体２０ｋとしては、例えばCD-ROM、DVD、及びUSBメモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体２０ｋとして使用してもよい。これらの記録媒体２０ｋは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【０１４５】
更に、公衆回線、インターネット、及びLAN等に接続された装置にファイル出力プログラム１００を記憶させてもよい。その場合は、プロセッサ２０ｃがそのファイル出力プログラム１００を読み出して実行すればよい。
【０１４６】
一方、メモリ２０ｂは、DRAM(Dynamic Random Access Memory)等のようにデータを一時的に記憶するハードウェアであって、その上にファイル出力プログラム１００が展開される。
【０１４７】
プロセッサ２０ｃは、ファイル出力装置２０の各部を制御するCPU(Central Processing Unit)やGPU(Graphical Processing Unit)等のハードウェアである。また、プロセッサ２０ｃは、メモリ２０ｂと協働してファイル出力プログラム１００を実行する。
【０１４８】
このようにメモリ２０ｂとプロセッサ２０ｃとが協働してファイル出力プログラム１００を実行することにより、ファイル出力装置２０の制御部３２（図１３参照）が実現される。その制御部３２には、入力部３３、衝突検出部３４、論理式生成部３５、充足性判定部３６、ファイル生成部３７、及び出力部３８が含まれる。
【０１４９】
また、記憶部３１（図１３参照）は、記憶装置２０ａとメモリ２０ｂによって実現される。
【０１５０】
更に、通信インターフェース２０ｄは、ファイル出力装置２０をLANやインターネット等のネットワークに接続するためのNIC(Network Interface Card)等のハードウェアである。
【０１５１】
そして、表示装置２０ｅは、各種の情報を表示するための液晶ディスプレイやタッチパネル等のハードウェアである。
【０１５２】
また、入力装置２０ｆは、プログラム開発者がファイル出力装置２０に各種のデータを入力するためのキーボードやマウス等のハードウェアである。
【０１５３】
媒体読取装置２０ｇは、記録媒体２０ｋを読み取るためのCDドライブ、DVDドライブ、及びUSBインターフェース等のハードウェアである。
【０１５４】
以上説明した各実施形態に関し、更に以下の付記を開示する。
（付記１）  複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出し、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する、
処理をコンピュータに実行させることを特徴とするファイル出力プログラム。
（付記２）  前記論理式は、複数の節の論理積をとった和積標準形であり、
複数の前記節のいずれかに前記第１のライブラリが命題変数として含まれており、かつ、複数の前記節のいずれにも前記第２のライブラリが命題変数として含まれていないことを特徴とする付記１に記載のファイル出力プログラム。
（付記３）  複数の前記ライブラリのうちの一のライブラリが別のライブラリに依存している場合、前記節は、一の前記ライブラリを示す命題変数の否定と、別の前記ライブラリを示す命題変数との論理和であることを特徴とする付記２に記載のファイル出力プログラム。
（付記４）  複数の前記節のいずれかに、複数の前記ライブラリのうちの第３のライブラリを示す命題変数の否定と、複数の前記ライブラリのうちで前記第３のライブラリに衝突する第４のライブラリを示す命題変数の否定との論理和が含まれることを特徴とする付記２に記載のファイル出力プログラム。
（付記５）  前記論理式が充足不可能と判定された場合、前記プログラムが前記第２のライブラリに依存し、かつ前記プログラムが前記第１のライブラリに依存しないことを示す別の論理式を生成し、
前記別の論理式が充足可能と判定された場合、前記プログラムが前記第２のライブラリに依存し、かつ前記プログラムが前記第１のライブラリに依存しないことを示す第３の定義ファイルを出力する、
処理を前記コンピュータに実行させることを特徴とする付記１に記載のファイル出力プログラム。
（付記６）  前記第２のライブラリが前記第１のライブラリで代替可能であることを示すヒント情報の入力を受け付ける処理を前記コンピュータに実行させ、
前記論理式を生成する処理は、前記ヒント情報に従って、実行される、
ことを特徴とする付記１に記載のファイル出力プログラム。
（付記７）  前記論理式は、複数の前記ライブラリのうちの前記第１のライブラリ、第３のライブラリ、及び第４のライブラリの各々に前記プログラムが依存し、かつ前記第２のライブラリに前記プログラムが依存しないことを示し、
前記コンピュータに、前記論理式が充足不可能となるときに、前記第３のライブラリと前記第４のライブラリとが衝突していることを示す衝突情報を出力する、
処理を実行させるための付記６に記載のファイル出力プログラム。
（付記８）  前記論理式は、複数の節の論理積をとった和積標準形であり、
前記第１のライブラリ、前記第３のライブラリ、及び前記第４のライブラリの各々を示す命題変数が複数の前記節の各々に含まれており、かつ、前記第２のライブラリを示す命題変数が複数の前記節のいずれにも含まれていないことを特徴とする付記７に記載のファイル出力プログラム。
（付記９）  前記コンピュータに、
前記論理式が充足不可能となるときに、前記第３のライブラリと前記第４のライブラリのいずれか一方を他方で代替可能なことを示す情報を前記ヒント情報に追加する、
処理を実行させるための付記７に記載のファイル出力プログラム。
（付記１０）  複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出し、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成し、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する、
処理をコンピュータが実行することを特徴とするファイル出力方法。
（付記１１）  複数のライブラリのうちの第１のライブラリと第２のライブラリとにプログラムが依存することを示す第１の定義ファイルに基づいて、前記プログラムにおける前記第１のライブラリと前記第２のライブラリとの衝突を検出する検出部と、
前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す論理式を生成する生成部と、
前記論理式が充足可能と判定された場合、前記プログラムが前記第１のライブラリに依存し、かつ前記プログラムが前記第２のライブラリに依存しないことを示す第２の定義ファイルを出力する出力部と、
を有することを特徴とするファイル出力装置。
【符号の説明】
【０１５５】
１、２６…POMファイル、２…依存グラフ、８…JARファイル、２０…ファイル出力装置、２１…リスト、２３、２４…論理式、３１…記憶部、３２…制御部、３３…入力部、３４…衝突検出部、３５…論理式生成部、３６…充足性判定部、３７…ファイル生成部、３８…出力部、４１…ヒント情報、４１ａ…要素、４１ｂ…要素、４１ｄ…属性、４２…衝突情報、１００…ファイル出力プログラム。
【図１】
2022002047.tif 000003
【図２】
2022002047.tif 000004
【図３】
2022002047.tif 000005
【図４】
2022002047.tif 000006
【図５】
2022002047.tif 000007
【図６】
2022002047.tif 000008
【図７】
2022002047.tif 000009
【図８】
2022002047.tif 000010
【図９】
2022002047.tif 000011
【図１０】
2022002047.tif 000012
【図１１】
2022002047.tif 000013
【図１２】
2022002047.tif 000014
【図１３】
2022002047.tif 000015
【図１４】
2022002047.tif 000016
【図１５】
2022002047.tif 000017
【図１６】
2022002047.tif 000018
【図１７】
2022002047.tif 000019
【図１８】
2022002047.tif 000020
【図１９】
2022002047.tif 000021
【図２０】
2022002047.tif 000022
【図２１】
2022002047.tif 000023
【図２２】
2022002047.tif 000024
【図２３】
2022002047.tif 000025