0

Eclipse プラグインを開発しようとしています。このプラグインはjgitを使用して、ubuntu のユーザー名とパスワードを使用して ssh 経由で git リポジトリにアクセスします。( Java でユーザー名とパスワードを使用して ssh 経由で git リポジトリのクローンを作成します) NetbBeans で jgit を使用すると、問題なく動作します。問題なく、プロジェクトのクローン、コミット、およびプッシュを行うことができます。ただし、同じコード フラグメントを jgit プラグインの Eclipse jsch に移動すると、プロジェクトに追加した jsch が競合します。追加したものを削除すると、コードをコンパイルできません (クラスに com.jcraft.jsch.Session をインポートする必要があります)。一方、追加すると、次のエラーが発生します

java.lang.LinkageError: 
  loader constraint violation: loader 
    (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader)
    previously initiated loading for a different type with name 
    "com/jcraft/jsch/Session"

この混乱から抜け出す方法はありますか?

jgit-3.2.0 と jsch-0.1.5.0 を使用しています。Eclipse のバージョンは Kepler です。

私のプラグインマニフェスト

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ****
Bundle-SymbolicName: ****;singleton:=true
Bundle-Version: 1.1.0513
Bundle-Activator: ****.Activator
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.ui.browser;bundle-version="3.4.100",
 org.eclipse.core.resources;bundle-version="3.8.100",
 org.eclipse.ui.ide;bundle-version="3.9.0",
 org.eclipse.jdt.core;bundle-version="3.9.0",
 org.eclipse.core.filesystem;bundle-version="1.4.0",
 org.eclipse.team.core;bundle-version="3.7.0",
 org.eclipse.jgit;bundle-version="3.2.0",
 org.eclipse.jdt.launching;bundle-version="3.7.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
 lib/commons-io-2.4.jar,
 lib/zip4j_1.3.2.jar,
 lib/jsch-0.1.50.jar
4

1 に答える 1

1

ほとんどの場合、クラス com.jcraft.jsch.Session (および JSch の他のクラス) には 2 つのバージョンがあるため、LinkageError が発生します。1 つはバンドル内の組み込みライブラリから取得され、もう 1 つは OSGi ランタイムに存在する可能性が非常に高い com.jcraft.jsch バンドルによって提供されます。

bundle-classpath に JSch を配置しないでください。bundle-classpath の JSch クラスは、JSch バンドル 'outside' と競合します。

Require-Bundleorを使用Import-Packageして依存関係を宣言します。例えば:

Require-Bundle: com.jcraft.jsch;bundle-version="[0.1.50,0.2.0)"
于 2014-09-29T15:35:07.293 に答える