1

コマンドラインから実行可能なjarを構築しようとしています( ant または OneJar を使用したくありません)。これが私のfile.jarの内容です:

jar tvf file.jar
     0 Mon Sep 20 17:16:12 CEST 2010 lib/
 45396 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.logging_1.0.4.v201005080501.jar
321330 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar
 55003 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar
     0 Mon Sep 20 19:15:00 CEST 2010 META-INF/
   265 Mon Sep 20 19:12:44 CEST 2010 META-INF/MANIFEST.MF
530609 Mon Sep 20 17:16:12 CEST 2010 ped.jar

META-INF/MANIFEST.MF の内容:

Manifest-Version: 1.0
Class-Path: ped.jar lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar lib/org.apache.commons.logging_1.0.4.v201005080501.jar
Main-Class: fr.inserm.umr915.bomcat.ped.PedigreeDrawer

ped.jar doにはメインクラスが含まれています

jar tvf ped.jar | grep PedigreeDrawer.class
 39541 Mon Sep 20 17:16:10 CEST 2010 fr/inserm/umr915/bomcat/ped/PedigreeDrawer.class

しかし、file.jar を実行しようとすると、エラーが発生しました。

java -jar file.jar
Exception in thread "main" java.lang.NoClassDefFoundError: fr/inserm/umr915/bomcat/ped/PedigreeDrawer
Caused by: java.lang.ClassNotFoundException: fr.inserm.umr915.bomcat.ped.PedigreeDrawer
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

だから、私はここに何かが欠けています。依存関係を含めるだけで、実行可能な jar をパッケージ化できませんか?

ご協力いただきありがとうございます

ピエール

4

5 に答える 5

1

特別なパッケージ (OneJar など) のない Jar の中に Jar を含めることはできません。

本当に OneJar (または他の同様のツール) を使用したくない場合は、配布可能ファイルに複数の Jar ファイルを含める必要があります。

于 2010-09-20T17:46:54.207 に答える
1

すでに述べたように、Class-Path:属性内の jar は、jar ファイル内ではなく、jar ファイルの場所に関連しています。これはおそらく、Java がアプレットを実行することを意図していた時代の名残りです。

Maven uberjar のようなツールを使用して、必要なすべてのクラスを 1 つの jar にまとめて、スタンドアロンの実行可能 jar を作成する必要があります。

もちろん、ツールの使用を絶対に避けたい場合は、すべての jar を 1 つのディレクトリに解凍し、META-INF とマニフェストを追加して、すべてを再度圧縮することもできます。

于 2010-09-20T17:53:00.217 に答える
1

ファイル内の値「Class-Path」は、パラメータmanifest.mfなしでアプリケーションを起動するかのように、クラスパスを指定-jar-classpath lib/...ます。パスはローカルで解釈され、jar ファイル内では解釈されません。

別の方法として、one-jarを使用するか、外部の jar ファイルに含まれる jar ファイルを調べる特別なクラスローダーを使用します。

JCLを使用すると、次のように、埋め込まれた jar からクラスを直接ロードできます。

  JarClassLoader jcl=new JarClassLoader();
  jcl.add("myjar.jar"); // Add some class source

  jcl.getSystemLoader().setOrder(1); // Look in system class loader first
  jcl.getLocalLoader().setOrder(2); // if not found look in local class loader
  jcl.getParentLoader().setOrder(3); // if not found look in parent class loader
  jcl.getThreadLoader().setOrder(4); // if not found look in thread context class loader
  jcl.getCurrentLoader().setOrder(5); // if not found look in current class loader

  // A custom class loader that extends org.xeustechnologies.jcl.ProxyClassLoader
  MyLoader loader=new MyLoader();
  loader.setOrder(6);

  jcl.addLoader(loader); //Add custom loader

ただし、代わりに jcl をクラスパスに追加する必要があります... または展開された jcl を jar に追加します。

于 2010-09-20T17:44:08.880 に答える
1

file.jarとは何ですか?
次のように set class-path を試すことができます。

Class-Path: lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar lib/org.apache.commons.logging_1.0.4.v201005080501.jar

次のようにjarファイルを実行します。

java -jar ped.jar
于 2010-09-20T17:41:03.450 に答える
0

OneJar は、この種の問題を解決するためのものです。同じ効果を持つカスタム クラスローダーを作成することもできます。

于 2010-09-20T17:54:38.987 に答える