0

これは本当に私を困惑させます。

シナリオ:

  • Windows 7 64 ビット
  • ロータス ノーツ (8.5.2)
  • エクリプスヘリオス
  • Java 6 Update 33 (64 ビット) と JDK 7
  • プラグイン プロジェクト用にインストールされた JRE は、Notes の下にインストールされた JVM (つまり、C:\NotesDev\Notes\jvm) を使用するように設定されています。
  • Target Platform は、上記でインストールされた JRE を使用し、 [場所] タブにframework\rcp\eclipseおよびframework\shared\eclipseサブフォルダーをインポートします。2 つのフォルダー間で合計 713 個のプラグインが利用可能であることがわかります。
  • 実行構成には、選択された合計 714 個のプラグインが表示されます (これには、ターゲット プラットフォームの 713 個と私のものが含まれます)。org.eclipse.swt.win32.win32.x86_3.5.2.v34557f-RCP20100710-0200.jarこのリストにはとの両方が含まれていることがわかりますcom.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar

問題:

  1. 前述の 2 つの JAR ファイルをビルド パスに明示的に含めないと、アプリケーションはコンパイルに失敗します (および をインポートしようとしますorg.eclipse.swt.widgets.Display) com.ibm.rcp.swt.swidgets.SToolItem
  2. 前述の JAR ファイルをビルド パスに含めると、アプリケーションはコンパイルされますが、NoClassDefFound例外のために実行されません。

質問:

  1. そもそもなぜこれらのファイルを含める必要があるのですか? それらはワークスペースの一部であり、私が参照している他の JAR ファイルは明示的に参照する必要がないようです。
  2. 実行時にこれが失敗するのはなぜですか? 私の理解ではNoClassDefFound、クラスはコンパイル時に使用可能でしたが、実行時には使用できなかったために発生します。しかし、これは同じマシンで発生しています。(ローカルでデバッグしようとしていて、JAR ファイルをエクスポート用にマークしました!)

ファイルがランタイム構成のロードされたプラグインタブにリストされている場合、それらを明示的に参照する必要はないように思えます。これに関して私は間違っていますか?(親切にしてください!私は確かにこれの専門家ではありません。)

前もって感謝します。

PSビルドパスにファイルを含めるMANIFEST.MFと、ファイルと.CLASSPATHファイルの両方で適切に参照されていることがわかります。

マニフェスト.MF コンテンツ

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Plugin
Bundle-SymbolicName: com.satuit.crm.plugin;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.satuit.crm.plugin.Activator
Bundle-Vendor: Satuit Technologies, Inc.
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.apache.axis,
 org.eclipse.ui;bundle-version="3.4.2",
 org.eclipse.core.runtime;bundle-version="3.4.0",
 org.eclipse.ui.views;bundle-version="3.3.1",
 com.ibm.rcp.jfaceex;bundle-version="6.2.2"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Export-Package: com.satuit.crm.plugin,
 com.satuit.crm.plugin.document,
 com.satuit.crm.plugin.ui,
 com.satuit.crm.webservice.agent
Bundle-ClassPath: .,
 /NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar,
 /NotesDev/Notes/framework/rcp/eclipse/plugins/com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar,
 /NotesDev/lib/activation-1.1.1.jar,
 /NotesDev/lib/mail.jar,
 /NotesDev/lib/commons-lang3-3.1.jar,
 /NotesDev/lib/SatuitCRM_XML_API2.jar

** .クラスパスの内容 **

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry exported="true" kind="con" path="org.eclipse.pde.core.requiredPlugins"/>  
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/commons-lang3-3.1.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/activation-1.1.1.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/mail.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/SatuitCRM_XML_API2.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/axispatch.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/axis.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/jaxrpc.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/saaj.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/wsdl4j-1.5.1.jar"/>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="output" path="bin"/>
</classpath>
4

3 に答える 3

1

Display または SToolItem によって参照されるクラスが見つからない場合にも、NoClassDefFound エラーが発生する可能性があります。どのクラスが見つからないかを正確に把握する唯一の方法は、-verbose オプションを指定して Java アプリケーションを実行することです。見たいと思っていたよりもはるかに多くのログが取得されますが、これらすべての出力行のどこかに、見つからない特定のクラスを示すエラー メッセージがあります。

于 2012-06-20T19:09:33.160 に答える
1

OSGi MANIFEST は、システム上の jar への絶対パスを受け入れません (これは、バンドル内に jar を含めるためのものです)。また、Java ビルド パスを更新すると、デプロイ時に機能しない可能性があります。

基本的に、OSGi バンドルを作成しているので、クラスパスに注意する必要があります。変更する必要がある2つの異なる問題があるようです。

  1. org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar および com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar はすでに OSGi バンドルです。それらはターゲット プラットフォームにある必要があります。次に、com.ibm.rcp.jfaceex と同様に、それらを Required-Bundles に追加する必要があります。正直なところ、それらは断片のように見えます。その場合、org.eclipse.swt を再エクスポートする org.eclipse.ui を使用するため、org.eclipse.swt.win32.win32.x86 が自動的に選択されます。com.ibm.rcp.swtex に Require-Bundle を追加する必要があるかもしれません (win32 swtex フラグメントのホスト バンドルの可能性があります)。

  2. Bundle-ClassPath に追加したすべての jar。パッケージに不要なクラスは、既にターゲット プラットフォームに含まれていますか? 理想的には、既存の OSGi バンドルからそれらを使用したいと考えています。少なくとも org.apache.axis はすでに OSGi バンドルです。それらの残りについては、それらの jar からのクラスが本当に必要であり、エクスポートされたパッケージとしてターゲット プラットフォームにまだ存在しない場合は、それらを OSGi バンドルに変換してターゲット プラットフォームに含めるか、実際にそれらをターゲット プラットフォームに含める必要があります。 Eclipse プロジェクトを開き、そこから Bundle-ClassPath に追加します (プロジェクト ルートの相対パスになります)。

于 2012-06-21T14:32:00.153 に答える
0

結局のところ、OSGI マニフェストはクラスパスの絶対パスを受け入れます。びっくり、びっくり。

すべきかどうかは別の話です。そして、デプロイされたアプリケーションがどうなるかは誰にもわかりません。しかし、実行時エラーとコンパイル時エラーは消えており、今のところ再発しているようには見えません。

繰り返しますが、私たちが事実と考えていたものと実際の事実は、2 つの非常に異なるものであることが判明しました。

于 2012-07-11T19:59:27.817 に答える