Maven と Eclipse を使用してプロジェクトを OSGI バンドルに変換中です。Mavenは問題なくビルドしますが、Eclipse内で上記のエラーが発生するだけです。どのプロジェクトがこれを引き起こしているかを調べるにはどうすればよいですか? 特別な見方か何かがありますか?これはどのように起こりますか?mavenも循環依存関係を検出できると思いますか?
アップデート
これは、エクスポートごとにインポートも行う felix maven-bundle-plugin が原因でしょうか?
Maven と Eclipse を使用してプロジェクトを OSGI バンドルに変換中です。Mavenは問題なくビルドしますが、Eclipse内で上記のエラーが発生するだけです。どのプロジェクトがこれを引き起こしているかを調べるにはどうすればよいですか? 特別な見方か何かがありますか?これはどのように起こりますか?mavenも循環依存関係を検出できると思いますか?
アップデート
これは、エクスポートごとにインポートも行う felix maven-bundle-plugin が原因でしょうか?
「A CYCLE WAS DETECTED IN THE BUILD PATH」エラーを回避するために、Eclipse ツールで循環依存関係を「警告」としてマークします。
Eclipse で次の場所に移動します。
Windows -> 設定 -> Java -> コンパイラ -> ビルド -> 循環依存関係
ワークスペースに複数のプロジェクトがある場合、プロジェクト間ではなく、プロジェクト間の参照を設定する必要があります。P1 が P2 を参照する場合、P2 は P3 を参照し、P3 は P1 を参照します。それが循環の原因になります。
解決策は、ワークスペース内のプロジェクト間の参照のダイアグラムを描画することです。各プロジェクトの Java ビルド パスを確認して、[プロジェクト] ウィンドウのタブを確認します。上記の例では、P3 が P1 を参照しているなど、メイン プロジェクトを参照しているプロジェクトを取り出します。
詳細な操作は、RAD OR eclipse で P3 プロジェクトを選択し、プロジェクトを右クリックしてプロパティ オプションを選択すると、P3 のプロパティの新しいウィンドウが表示されます。[Java Build Path] セクションをクリックし、[Projects] オプション タブを選択します。P3 がフィールドで P1 を参照していることがわかります。P1 参照を選択し、ウィンドウの右側にある [削除] ボタンをクリックします。次に、[OK] をクリックします。IDE は自動的にパスのリセットを開始します。
終わり。
ダイアグラム内の各プロジェクトへの正しい参照が得られるまで、すべての各プロジェクトで誤って参照されているすべての参照を見つけ続けます。幸運を!
あるプロジェクトが別のプロジェクトを参照しているため、これがありました。
簡単に言えば、サイクルとは、バンドル A がバンドル A に依存するバンドル B に依存する場合です。これがソース コードである場合、1 つのパスでバンドルを個別に構築する方法はありません。
この問題は Eclipse でのみ発生するため、ソース コードの循環依存ではなく、バイナリの循環依存である可能性があります。
Eclipse の最近のバージョンでは、バイナリ サイクルがサポートされています: Eclipsesource ブログ
循環がコード内にある場合は、コードの一部を 3 番目のバンドルに分割してコードをリファクタリングし、循環依存を削除することをお勧めします。
また、OSGi フラグメント (単体テストの一般的なパターン) を使用している場合は、サイクルを導入するのが非常に簡単なので注意してください。
Eclipse のマニフェスト エディターの [依存関係] タブには、サイクルを探すための機能があります ([依存関係の分析] をクリックする必要があります)。サイクル!
Dictionary インターフェースの 2 つの異なる実装をテストする古いプロジェクトがあります。1 つはソートされていない ArrayList で、もう 1 つは HashTable です。2 つの実装は、比較できるようにタイミングが設定されています。コマンドライン引数からデータ構造を選択できます。今..私はツリー構造である別のデータ構造を持っています。HashTable と比較するために、その時間をテストしたいと思います。新しい dataStructure プロジェクトでは、Dictionary インターフェイスを実装する必要があります。Dictionary プロジェクトでは、新しい dataStructure プロジェクトに固有のコードを追加できる必要があります。循環依存があります。これは、Eclipse がプロジェクト A に依存しているプロジェクトを見つけようとすると、プロジェクト B を見つけることを意味します。依存プロジェクトのサブ依存関係を見つける必要がある場合、Eclipse は A を見つけます。
ビルド パスを構成するときは、依存プロジェクト ([プロジェクト] タブ) を入力する代わりに、[ライブラリ] タブに移動します。[クラス フォルダーを追加...] ボタンをクリックし (参照プロジェクトがワークスペースにあると仮定します)、クラス フォルダーを選択します。私のは \target です。これをライブラリ フォルダとして選択します。プロジェクト A でこれを実行して、プロジェクト B を参照します。プロジェクト B でこれを実行して、プロジェクト A を参照します。再構築を強制するために、依存関係を削除してからリセットする必要がなくなりました。
プロジェクト参照の代わりにクラス ライブラリを使用します。
少し前に同様の問題に直面し、Java プロジェクトの完全なビルド パスの依存関係ツリーを表示する Eclipse プラグインを作成することにしました (グラフィック モードではありませんが、結果はファイルに書き込まれます)。プラグインのソースはこちらhttp://github.com/PetrGlad/dependency-tree
依存関係はツリーでなければならないため、循環が検出されると、Mavenはビルドに失敗します。
pom.xml で定義されているものに加えて、manifest.mf に追加の宣言があることに気付く場合があります。余分な宣言があると、Maven にはわからないサイクルが発生する可能性があります。
依存関係管理のRequire-Bundle形式(Mavenのpom依存関係に最も類似)と同様に、Import-Package依存関係を持つことも可能です。Import-Packageでは、Require-Bundleよりも循環依存関係を導入する方がはるかに簡単ですが、YMMVです。
また、Eclipseプロジェクトには、依存している他のプロジェクトを示す「プロジェクト参照」があります。Eclipseはこれを高レベルで使用して、ビルドするプロジェクトとその順序を決定します。そのため、Manifest.MFにすべてが正しくリストされている可能性がありますが、プロジェクトの参照は適切ではありません。プロジェクトを右クリックして、プロパティに移動します。依存しているプロジェクトが表示されます。あなたがテキストのような人なら、.projectファイルを開いて、そこに依存しているファイルを確認してください-代わりに、プロジェクトの循環リンクがそのレベルで定義されている可能性があります(多くの場合、AB依存関係があり、その後BAから反転しましたが、.project参照を更新していません)。
Eclipseを再起動するだけで、プロジェクトの問題が修正されました
「Mark Circular Dependencies」を使用するとコードをコンパイルできますが、環境が遅くなり、将来の問題が発生する可能性があります。
これは、ある時点で Eclipse がビルド パスの方向性を失ったためです。
1 - プロジェクトとその参照をワークスペースから削除します。2 - 再度インポートします。3 - 参照を確認します。
それが最善の解決策です。
これは、JAR 形式で相互にインクルードする複数のプロジェクトがある場合に発生する可能性があります。私がしたことは、すべてのプロジェクトについて、ビルドパス上のすべてのライブラリとプロジェクトの依存関係を削除することでした。次に、一度に 1 つずつ、プロジェクトの依存関係を [プロジェクト] タブに追加しましたが、必要なものだけを追加しました。これは、それ自体が参照されているプロジェクト、またはこの自己参照の問題で他のプロジェクトを参照している別のプロジェクトを追加できるためです。
これで私の問題は解決しました。
私がこれらの問題を抱えていたとき、それは常に Manifest.mf で表現された依存関係の真のサイクルでした。
問題のプロジェクトのマニフェストを開き、[依存関係] タブで [必要なプラグイン] エントリを確認します。そこから次のプロジェクトへ、という繰り返しを繰り返していくうちにサイクルが明確になっていきます。
[依存関係] タブの右下隅にある [依存関係の分析] リンクを使用すると、このタスクをいくらか簡素化できます。これにより、サイクルの検出と依存関係のナビゲーションが容易になります。
Maven がより寛容な理由もわかりませんが、