58

内容が以下のような jar があります。

ここに画像の説明を入力

以下は私のマニフェストファイルです

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: org.sai.com.DerbyDemo
Class-Path: derby.jar derbyclient.jar derbynet.jar derbytools.jar

ClassNotFoundExcceptionjar を実行しようとすると、外側の jar 内の jar を参照していないという意味がスローされました。

属性で、実際の jar 内で jar ( など)を参照するClass-Pathにはどうすればよいですか?derby.jar

4

7 に答える 7

39

これにはカスタム クラス ローダーが必要です。One Jarを参照してください。

One-JAR を使用すると、Java アプリケーションをその依存関係の Jar と一緒に単一の実行可能な Jar ファイルにパッケージ化できます。

構築を簡素化できるantタスクもあります。

REFERENCE (背景から)

ほとんどの開発者は、依存関係の Jar ファイルを独自の Jar ファイルに配置し、Class-Path 属性を META-INF/MANIFEST に追加するとうまくいくと合理的に想定しています


jarname.jar
| /META-INF
| |  MANIFEST.MF
| |    Main-Class: com.mydomain.mypackage.Main
| |    Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| |  Main.class
| commons-logging.jar

残念ながら、これは機能しません。JavaLauncher$AppClassLoaderは、この種の を使用して Jar 内の Jar からクラスをロードする方法を知りませんClass-Path。使おうとするとjar:file:jarname.jar!/commons-logging.jar行き止まりにもなります。このアプローチは、サポートする Jar ファイルを jarname.jar ファイルがインストールされているディレクトリにインストール (分散) する場合にのみ機能します。

于 2012-09-10T18:36:39.090 に答える
24

できません。公式チュートリアルから:

マニフェストで Class-Path ヘッダーを使用すると、Java を呼び出してアプリケーションを実行するときに、長い -classpath フラグを指定する必要がなくなります。

注: Class-Path ヘッダーは、JAR ファイル内の JAR ファイルやインターネット プロトコル経由でアクセス可能なクラスではなく、ローカル ネットワーク上のクラスまたは JAR ファイルを指します。JAR ファイル内の JAR ファイル内のクラスをクラス パスにロードするには、これらのクラスをロードするカスタム コードを記述する必要があります。たとえば、MyJar.jar に MyUtils.jar という別の JAR ファイルが含まれている場合、MyJar.jar のマニフェストの Class-Path ヘッダーを使用して MyUtils.jar のクラスをクラス パスにロードすることはできません。

于 2012-09-10T18:37:15.033 に答える
6

クラスローダのデフォルトの実装は、jar 内の jar からロードできません。そのためには、「サブ jar」全体をメモリにロードする必要があり、jar 形式のランダム アクセスの利点が失われます (保留中の参照 - これをサポートするドキュメントが見つかったら編集します)。

JarSpliceなどのプログラムを使用して、すべてを 1 つのクリーンな実行可能 jar にバンドルすることをお勧めします。

編集:ソース参照が見つかりませんでしたが、この正確な「問題」を説明する Sun Web サイトの未解決の RFE があります: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386

また、ライブラリ jar ファイルを\libディレクトリのサブディレクトリに配置classesし、コマンド ラインから実行することで、プログラムが動作することを「テスト」することもできます。つまり、次のディレクトリ構造を使用します。

classes/org/sai/com/DerbyDemo.class
classes/org/sai/com/OtherClassFiles.class
classes/lib/derby.jar
classes/lib/derbyclient.jar

コマンド ラインから、上記の「classes」ディレクトリに移動し、次のように入力します。

java -cp .:lib/* org.sai.com.DerbyDemo
于 2012-09-10T18:44:57.883 に答える
2

jar ファイルをライブラリに追加し (netbeans を使用している場合)、マニフェストのファイルclasspathを次のように変更します。

Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar

同様の答えがここに存在します

于 2013-12-07T12:52:02.050 に答える