0

わかりました私は一日中インターネットを検索しており、見たものはすべて試したので、誰かが助けてくれるかどうか疑問に思っています.

libフォルダーのワークスペースにコピーしたjarファイルを参照するクラスがあります。jarはClassifier4J.jarです。クラスはコンソールで完全に実行され、エラーはまったくありません。.jar をまとめてパッケージ化し、別のプログラムから .jar を実行しようとすると、次のエラーが表示されます。

    Exception in thread "pool-2-thread-1" java.lang.NoClassDefFoundError: net/sf/classifier4J/bayesian/IWordsDataSource...(10 more)

明らかに、.jarを作成すると、必要なclassifier4jライブラリを参照できません。

私が試したこと:

-ビルドパスを構成する

・マニフェストファイルの変更

-私の.jarで.jarをパッケージ化

-Eclipseでは、ファイル>エクスポート> Java>実行可能な.jarに移動し、ライブラリを参照します

および他の多くのことであり、何も機能しませんでした。

とにかく同様の問題があった場合、またはなぜこれが起こっているのかを知っている場合は、私の頭を本当に壊してください. これは日食の問題ですか?それは日食を通して行うことができますか?

前もって感謝します

ジェイ

4

4 に答える 4

2

何時間も問題を調べた後、最終的に解決策を見つけました。クラスを.jarファイルとして出力すると、マニフェストファイルを指しました。うまくいかなかったので、自分が間違っていたことを見つけることができませんでした。実際に jar に入れられたものを調べることにしましたが、Eclipse が要求した正しいマニフェスト ファイルを jar に入れていないことがわかりました。次のような新しいものを入れていました:

 Manifest-Version: 1.0 

次のようになっているはずです。

 Manifest-Version: 1.0
 Class-Path: ../lib/Classifier4J.jar

libフォルダーは、私のjarがあった場所からディレクトリに戻りました。現在、すべてが完全に機能しています。いつもお世話になっております。

ジェイ

于 2013-02-10T13:21:01.420 に答える
0

特定のライブラリはjarファイルに含まれていません。eclipsesビルド構成を修正してそのライブラリーを含めるか、プログラムの実行時にライブラリーのjarをクラスパスに追加することができます。
後者の方が簡単かもしれません。プログラムを実行するときに、コマンドに次を追加するだけです。

java -cp yourjar.jar;thelibrarysjar.jar com.your.Mainclass
于 2013-02-10T00:46:31.210 に答える
0

あなたが実際に何をしようとしているのか、実際に何を試したのか、そしてあなたが何を期待しているのかを理解するのは難しいですが、手がかりはここにあると思います:

.jarを私の.jarと一緒にパッケージ化しました

これは、依存するすべてのJARをそのまま含む「実行可能JAR」を作成しようとしていることを意味しているようです。これは機能しません。「実行可能JAR」に他のJARを含めることはできません。(まあ、できます...しかし、真剣に複雑なことをしなければ、アプリケーションのクラスパスにそれらを置くことはできません。)

基本的に、2つのオプションがあります。

  • 依存するJARを(実行可能かどうかにかかわらず)アプリケーションJARに含めようとしないでください。それらを別々に保ち、それらを含めるように実行クラスパスを構成します。(実行可能JARの場合、実行クラスパスをマニフェストエントリとして構成する必要があることに注意してください。を使用する場合java -jar ...-cp argumentおよび$CLASS_PATHは無視されます!)

  • アプリケーションJARとすべての依存JARを単一のディレクトリに展開し、ロットから単一のJAR(適切なマニフェストを使用)を作成することにより、いわゆる「uber-JAR」を作成します。ビルドツールまたはIDE、プラグインを介してこれをサポートしている場合があります。

私は個人的に前者のアプローチを好みます...アプリケーションの「インストールディレクトリ」とラッパースクリプトを組み合わせます。後者のアプローチでは、ユーザー(またはデプロイヤー)が依存するJARのバージョンを組み合わせて使用​​することを困難にします。さらに、「uber-JAR」アプローチは、サードパーティのライブラリのライセンスと競合する可能性があります。


ついに、どこかに行けるかも

.... .jarファイルは、Tomcatアプリケーションから実行され、ログファイル用のシンプルなアダプターです。

わかった。これは重要な情報であるため、前に言及しておく必要があります。JARファイルをWebコンテナ内(つまり、Tomcatと同じJVM内)で使用できるようにするには、JARファイルとそれに依存するすべてのJARファイルのコピーがWebコンテナのディレクトリツリーに存在する必要があります。2つの選択肢があります。それらをwebappのlibディレクトリ(つまりwebapp / WEB-INFO / lib)に配置するか、共有ライブラリディレクトリに配置します...使用しているTomcatのバージョンによって異なります。

(「実行可能JAR」アプローチはここでは機能しません。マニフェストに配置したクラスパスのものは関係ありません。また、JARファイルのネストも機能しません。)

于 2013-02-10T01:18:42.240 に答える
0

NoClassDefFoundError が、識別されたクラスが見つからないことを意味することはほとんどないことを理解する必要があります。多くの場合、クラスは見つかりましたが、何かが正常にロードされませんでした。

最も可能性の高い 2 つの問題は次のとおりです。

  • 指定されたクラスが「検証」されるのを妨げるその他の欠落クラス。
  • コンパイルと実行で異なるバージョンのクラス (通常は別のクラス) が使用されているため、互換性がありません。

あなたの場合、問題が発生したときに、コンパイル中の環境とは対照的に、他のjarの別の(そして互換性のない)バージョンを拾っている可能性が最も高いです。

于 2013-02-10T01:46:51.497 に答える