Javaクラスパス内のディレクトリにすべてのjarを含める


1019

クラスパスのディレクトリ内にすべてのjarファイルを含める方法はありますか?

私は試しjava -classpath lib/*.jar:. my.package.Programていますが、確かにそれらのjarにあるクラスファイルを見つけることができません。各JARファイルをクラスパスに個別に追加する必要がありますか?


3
申し訳ありませんが、これを受け入れたことはありません。コミュニティwikiである必要があります。提供された回答のいずれかを使用したことはありません。lib /ディレクトリをスキャンしてファイル名の解析からクラスパスを作成したシェルスクリプトを作成したと思います。
Chris Serra

説明されているように機能しないため、この新しいJava機能にはなんらかのバグがあります。答えの1つで説明されているように、私はあきらめて、Antを使用して回避しました。
Alex R


1
Windowsのワイルドカード処理に問題があります。 stackoverflow.com/questions/11607873/...
Mykhaylo Adamovych

6
短い答え:(1).jarパーツをドロップする、(2)Windows(通常は他の場所)で区切られた2つ以上のパーツ;が必要:です。例:java -classpath ".;lib/*" Program
Evgeni Sergeev 14

回答:


1160

Java 6以降を使用すると、クラスパスオプションはワイルドカードをサポートします。次の点に注意してください。

  • ストレートクォートを使用する("
  • 使用*ではなく、*.jar

ウィンドウズ

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

これはWindowsに似ていますが、の:代わりに使用します;。ワイルドカードを使用できない場合bashは、次の構文を許可します(libすべてのJavaアーカイブファイルを含むディレクトリ)。

java -cp $(echo lib/*.jar | tr ' ' ':')

(クラスパスの使用は-jarオプションと互換性がないことに注意してください。関連項目:コマンドプロンプトから複数のクラスパスライブラリを使用してjarファイルを実行する

ワイルドカードについて

クラスパス文書から:

クラスパスの各エントリには、ベース名のワイルドカード文字含めることができ*拡張子を持つディレクトリ内のすべてのファイルのリストを指定するのと同じと考えられている、.jarまたはを.JAR。たとえば、クラスパスエントリfoo/*は、fooという名前のディレクトリにあるすべてのJARファイルを指定します。単純に構成されるクラスパスエントリ*は、現在のディレクトリにあるすべてのjarファイルのリストに展開されます。

を含むクラスパスエントリは、*クラスファイルと一致しません。単一のディレクトリfoo内のクラスとJARファイルの両方を一致させるには、foo;foo/*またはを使用します foo/*;foo。選択した順序によって、のクラスとリソースfooがのJARファイルの前にロードされるfooか、その逆かが決まります。

サブディレクトリは再帰的に検索されません。たとえば、foo/*のみでJARファイルを探しfoo、いないでfoo/barfoo/bazなど

ディレクトリ内のJARファイルが展開されたクラスパスに列挙される順序は指定されておらず、同じマシンでもプラットフォームによって、また場合によっては変わる場合があります。適切に構築されたアプリケーションは、特定の順序に依存するべきではありません。特定の順序が必要な場合は、JARファイルをクラスパスで明示的に列挙できます。

ワイルドカードの展開は、プログラムのmainメソッドの呼び出しの前ではなく、クラスのロードプロセス自体の間に行われます。ワイルドカードを含む入力クラスパスの各要素は、指定されたディレクトリ内のJARファイルを列挙することによって生成された(空の可能性がある)要素のシーケンスに置き換えられます。ディレクトリは、たとえば、foo含まれているa.jarb.jarc.jar、その後、クラスパスをfoo/*に展開されfoo/a.jar;foo/b.jar;foo/c.jar、その文字列はシステムプロパティの値になります java.class.path

CLASSPATH環境変数から任意の異なる方法で処理されていない-classpath(または-cp)コマンドラインオプション。つまり、これらすべてのケースでワイルドカードが使用されます。ただし、クラスパスのワイルドカードはClass-Path jar-manifestヘッダーでは受け付けられません。

注:Java 8の既知のバグにより、Windowsの例では、エントリの前にアスタリスクを付けてバックスラッシュを使用する必要があります。https//bugs.openjdk.java.net/browse/JDK-8131329


2
この機能は十分に文書化されておらず、意図したとおりに機能するためには、いくつかの明白ではない前提条件が満たされている必要があるようです。
Alex R

1
最後のbash / trトリックの+1。ここでのJava / JamVMは、作業ディレクトリの外のパスにワイルドカードを好まないが、シェルワイルドカードを使用して各JARを明示的に参照することはtr機能します。
2013年

1
java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass引用符なしのコマンドがあり、正常に動作します。シェルがなぜそれを拡張していないのかと思いますか?
yellavon 2014

3
また~、-cp では使用しないでください
Sohail Si

1
Windowsの例はJava 8以前では機能しませんが、このクラスパスでは機能します。 java.net/browse/JDK-8131329
philwalk

226

ウィンドウの下でこれは動作します:

java -cp "Test.jar;lib/*" my.package.MainClass

これは機能しません:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

* .jarに注意してくださいしたがって、*ワイルドカードは単独で使用する必要があります


Linuxでは、次のように動作します。

java -cp "Test.jar:lib/*" my.package.MainClass

区切り文字はセミコロンではなくコロンです。


17
完璧な答えです。注意すべき2つの重要な点:1)引用符を使用し、2)* .jarではなく*のみを使用する
Wim Deblauwe

4
1年と8か月後、UNIXバージョンを含めるために行った編集は、再び私を救いました。:)おかしいそれはどのようにして私のjarファイルを認識しない*.jarだけで*
jmort253 2013

クラスパスの順序が重要であることがわかりました(しかし、理由はわかりません)。クラスパスの順序を切り替えるまで、エラーが発生していました。
user13107 14年

@ jmort253、実はこれはシェル*拡張ではありませんが、ワイルドカードはクラスパスをJavaで解析して*を確認し、ワイルドカードに入力します
Sebastian

1
@SebastianGodelet-ええ、それは私が正規表現のワイルドカードとこの表記の間で混乱しているだけです。これは私が推測しているものとは異なります。ほとんどの場合、私を救ったのは:、あるプラットフォームと;他のプラットフォームの違いを知っていることです。:)私はコマンドラインからJavaを使用してコンパイルします。年に1回程度ですが、どれほど頻繁に迷惑であるかを覚えていなくても十分です。
jmort253 2014年

67

この問題を回避するには、他の必要なjarとともにクラスパスを指定するマニフェスト()ファイルを含むメイン jarファイルmyapp.jarをデプロイし、それを一緒にデプロイします。この場合、コードを実行するときに宣言するだけで済みます。Manifest.mfjava -jar myapp.jar

したがって、メインjarをいくつかのディレクトリにデプロイし、依存するjarをlibその下のフォルダに配置すると、マニフェストは次のようになります。

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

注:これはプラットフォームに依存しません。同じjarを使用して、UNIXサーバーまたはWindows PCで起動できます。


これは多くの人にとってうまくいくようですが、JavaはここのマニフェストファイルのClass-Pathエントリを明らかに無視しているようです。-cpを使用してクラスパスに「lib / *」を手動で追加しないと、アプリケーションを実行できません。何か案は?

6
oxbow_lakesの答えは完全に正しいわけではありません。このjarをjava -jar myapp.jarで開始すると、Class-Pathのものが有効になります(それだけが有効です。-cp/ -classpathは無視されます!)。私はoxbow_lakesが「java -classpath myapp.jar」を書いたときにそれを書くつもりだったと思います。
rzwitserloot 2013年

47

「lib」ディレクトリにすべてのjarを持つjava-sun 1.6.0_24を使用したUbuntu 10.04での私のソリューション:

java -cp。:lib / * my.main.Class

これが失敗した場合、次のコマンドが機能するはずです(libディレクトリ内のすべての* .jarをクラスパスパラメータに出力します)。

java -cp $(for i / lib / *。jar; do echo -n $ i:; done)。my.main.Class

4
面白いメモ。java -cp lib / * my.main.Classは常にlib / *のシェルグロブ展開のため失敗しますが、java -cp。:lib / * my.main.Classは。:lib / *が有効なグロブではないため失敗しません道。しばらく
お待ち

1
これは動作しません; Linuxは。あなたは試すことができます:java -cp '。:lib / 'そしてそれはうまくいきます(一重引用符に注意してください!二重引用符では動作しません!)。実際、コロンが原因で。:lib / *が正当なグロブでない場合は機能する可能性がありますが、少し不自然に感じられます。引用符を追加します。一重引用符は、bashにコンテンツのどの部分にも触れないように指示します。
rzwitserloot 2013年

このコンテキストでは、一重引用符と二重引用符のどちらを使用してもかまいません。シェルが*を展開(グロビング)しないようにしたい、それがすべてです。そして、テキスト「lib / *」を文字通りJVMに渡すと、VMはこれを「特別なパターン」として認識し、それ自体でjarファイルを検索します。
Angel O'Sphere 2016年

36

簡潔な答え: java -classpath lib/*:. my.package.Program

Oracleは、クラスパスにワイルドカードを使用してドキュメントを提供し、ここでJava 6のために、ここでのJava 7のための見出しセクションの下で、理解するクラスパスのワイルドカードを。(私がこれを書いているとき、2つのページには同じ情報が含まれています。)ここではハイライトの要約です:

  • 一般に、特定のディレクトリにすべてのJARを含めるには、ワイルドカード*ではなく *.jar)を使用できます。

  • ワイルドカードはJARのみに一致し、クラスファイルには一致しません。ディレクトリ内のすべてのクラスを取得するには、ディレクトリ名でクラスパスエントリを終了するだけです。

  • 上記の2つのオプションを組み合わせて、すべてのJARファイルとクラスファイルをディレクトリに含めることができます。通常のクラスパス優先規則が適用されます。例えば-cp /classes;/jars/*

  • ワイルドカードは、サブディレクトリでJARを検索しません

  • 上記の箇条書きは、CLASSPATHシステムプロパティまたは-cpまたは-classpathコマンドラインフラグを使用する場合に当てはまります。ただし、Class-Path(antビルドファイルで行うように)JARマニフェストヘッダーを使用する場合、ワイルドカードは使用されません。

はい、私の最初のリンクは、トップスコアの回答で提供されたものと同じです(私は追い越しの望みはありません)が、その回答ではリンク以外の説明はあまりありません。最近このような動作はスタックオーバーフローでは推奨されていないため、詳しく説明すると思います。


私の問題は、lib / *ではなくlib / *。jarにありました。これを修正してくれてありがとう。:と;には違いがあることに気づきました。しかし、それは私の多くの変更を同時に行うようなものかもしれません。
Eyad Ebrahim 2012

*と* .jarの違いを強調していただきありがとうございます
ブラハンアルカン

36


 java -cp file.jar;dir/* my.app.ClassName

Linux

 java -cp file.jar:dir/* my.app.ClassName

思い出させる:
- 、Windowsのパス区切りがある;
- のLinuxパス区切りがある:
-ではWindowsのCP引数に空白が含まれていない場合は、「引用符」はオプションです


Windowsの例では、以前のJava 8との作業をしていません。参照bugs.openjdk.java.net/browse/JDK-8131329
philwalk

オープンJDKでは動作しない可能性があります。これをテストして、ここで話します
Wender

申し訳ありませんが、HotSpotでテストしましたが、openjdkで動作すると思いました。
ヴェンダー

WindowsでのOracle Javaでは、スラッシュではなくアスタリスクの前にバックスラッシュが必要ですが、最新または代替のJavaバージョンを再テストしていません。
philwalk

macosでは機能しません
Greyshack


29

あなたはjava http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlを試すことができ-Djava.ext.dirs=jarDirectory ます

Java実行時の外部jarのディレクトリ


3
これは機能しますが、気をつけて、-Djava.ext.dirs=BEFOREをパスしてください-jar
ジョバンニフンシャル

5
java.ext.dirsは、クラスパス内の通常のjarとは大きく異なります。優先度と権限が高く、bootstamp(rt.jar)のクラスをオーバーライドすることができます
Dennis C

ありがとう。「javaバージョン "1.8.0_221" Java(TM)SEランタイム環境(ビルド1.8.0_221-b27)Java HotSpot(TM)64ビットサーバーVM(ビルド25.221-b27、混合モード)」では、この-Dバージョンのみクラスパスを渡すことはうまくいきました。伝統的な形はしませんでした。
Matt Campbell

23

正解

java -classpath "lib/*:." my.package.Program

不正解:

java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:."     my.package.Program
java -classpath "lib/*.jar:."  my.package.Program
java -classpath  lib/*:.       my.package.Program

9

すべての.jarファイルを動的に指定する必要がある場合は、シェルスクリプトまたはApache Antを使用できます。Commons Launcherと呼ばれるcommonsプロジェクトがあります。これは、基本的に、起動スクリプトをantビルドファイルとして指定できるようにするものです(私が何を意味するのかわかる場合)。

次に、次のように指定できます。

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

起動ビルドファイルで、正しいクラスパスでアプリケーションを起動します。



8

Windows上のJava 7ではワイルドカード拡張が機能しないことに注意してください。

このStackOverflowの問題を確認してくださいについては、をください。

回避策は、ワイルドカードの直後にセミコロンを置くことです。 java -cp "somewhere/*;"


6

ご担当者様、

MSYS / MinGWシェルの下のWindowsでこの奇妙な動作が見つかりました。

作品:

$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java

動作しません:

$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options

ワイルドカードがシェルによって展開されないことは確かです。

$ echo './*'
./*

(組み込みのものではなく、別のプログラムでも試してみましたがecho、結果は同じです。)

私はそれjavacを拡張しようとしているのだと思います、そしてそれは引数にセミコロンがあるかどうかにかかわらず異なったふるまいをします。まず、パスのように見えるすべての引数を展開しようとしている可能性があります。そして、それ-cpだけで、次のトークンのみを使用してそれらを解析します。(これcom.comsol.aco_1.0.0.jarは、そのディレクトリの2番目のJARであることに注意してください。)それはすべて推測です。

これは

$ javac -version
javac 1.7.0

5

上記のすべてのソリューションは、EclipseやNetbeansなどのIDEの外部でJavaアプリケーションを開発して実行する場合にうまく機能します。

Windows 7を使用していて、Javaでの開発にEclipse IDEを使用している場合、コマンドプロンプトを使用してEclipse内でビルドされたクラスファイルを実行すると、問題が発生する可能性があります。

たとえば、Eclipseのソースコードには、次のパッケージ階層があります。edu.sjsu.myapp.Main.java

Main.javaの外部依存関係としてjson.jarがある

Eclipse内からMain.javaを実行しようとすると、問題なく実行されます。

しかし、EclipseでMain.javaをコンパイルした後にコマンドプロンプトを使用してこれを実行しようとすると、「ClassNotDef Error blah blah」といういくつかの奇妙なエラーが発生します。

あなたはあなたのソースコードの作業ディレクトリにいると思います!!

コマンドプロンプトから実行するには、次の構文を使用します。

  1. javac -cp "。; json.jar" Main.java

  2. java -cp "。; json.jar" edu.sjsu.myapp.Main

    [お見逃しなく。上記]

これは、Main.javaをパッケージedu.sjsu.myapp内に配置し、java.exeが正確なパターンを探すためです。

それが役に立てば幸い !!


4

Windowsでは引用符が必要です。セパレータとして使用する必要があります。例えば:

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

短い形式:メインがjar内にある場合、それを機能させるために明示的に宣言された追加の「-jar pathTo / yourJar / YourJarsName.jar」が必要になるでしょう(「YourJarsName.jar」がクラスパス上にあったとしても)(または、5年前に尋ねられた元の質問に答えるために表明されました:各jarを明示的に再宣言する必要はありませんが、java6を使用している場合でも、独自のjarを再宣言する必要があるようです...)


長い形式:(Javaへの侵入者でさえこれを利用できることを願って、これを明示的にしました)

多くのように、ここではEclipseを使用してjarをエクスポートしています(File-> Export-> 'Runnable JAR File')。「ライブラリー処理」Eclipse(Juno)オファーには3つのオプションがあります。

opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"

通常、私はopt2を使用します(そしてopt1は間違いなく壊れていました)。ただし、使用しているjarのネイティブコードは、そのオプションを選択するとEclipseが活用する便利な「jarinjar」トリックで壊れていることを発見しました。私がopt3が必要であることを認識し、このStackOverflowエントリを見つけた後でも、Eclipseの外でメインを起動する方法を理解するにはまだ時間がかかりました。他の人に役立つので、ここで私がうまくいったことを...


jarに "fooBarTheJarFile.jar"という名前を付け、すべてがdir: "/ theFully / qualifiedPath / toYourChosenDir"にエクスポートするように設定されている場合。

(「エクスポート先」フィールドは次のようになります: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

完了を押すと、Eclipseが見つかり、すべてのライブラリーがそのエクスポート・ディレクトリー内の「fooBarTheJarFile_lib」という名前のフォルダーに置かれ、次のようなものが得られます。

/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar

その後、次のコマンドを使用して、システムのどこからでも起動できます。

java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain

(Java初心者の場合: 'package.path_to.the_class_with.your_main'は、 'main(String [] args){.. 。} 'Javaの外部から実行したいことを意味します)


注意すべき落とし穴:宣言したクラスパスのjarのリスト内に 'fooBarTheJarFile.jar'を含めるだけでは不十分です。'-jar'を明示的に宣言し、そのjarの場所を再宣言する必要があります。

例えばこれは壊れます:

 java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain

相対パスで再表現:

cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   

(javaバージョン "1.6.0_27"を使用。ubuntu12.04のOpenJDK 64ビットサーバーVM経由)


3

私がそれをどのようにして行うかを知る唯一の方法は、例えばそれを個別に行うことです:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

お役に立てば幸いです。


これは'08年に戻る唯一の方法だったかもしれませんが、現在はそうではありません。
simo.3792 2014年

これは最悪のことではありません。それはハックですが、私はこれを私のbashrcに設定していますfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

wepappのクラス:

  > mvn clean install

  > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2

2

それらをすべて個別に追加する必要があります。あるいは、本当にディレクトリを指定する必要がある場合は、すべてを1つのディレクトリに解凍し、それをクラスパスに追加できます。ただし、クラスパスのバージョン管理と管理が困難になるという奇妙な問題のリスクがあるため、このアプローチはお勧めしません。


3
これは'08年に戻る唯一の方法だったかもしれませんが、現在はそうではありません。
simo.3792 14年

2

/ *を-cpに設定できる直接的な解決策ではありませんが、次のスクリプトを使用して、動的クラスパスとlibディレクトリの状況を少し緩和できることを願っています。

 libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 

Linux用にスクリプト化されていますが、Windows用にも同様のスクリプトを作成できます。適切なディレクトリが「libDir2Scan4jars」への入力として提供されている場合。スクリプトはすべてのjarをスキャンしてクラスパス文字列を作成し、それを環境変数「tmpCLASSPATH」にエクスポートします。


2

macOS、現在のフォルダー

macOS Mojave上のJava 13の場合…

すべての.jarファイルが同じフォルダにある場合cdは、を使用して現在の作業ディレクトリにします。で確認しpwdます。

まず、アプリのJARファイル-classpathリストする必要があります。コロン文字を区切り文字として使用し、アスタリスクを追加して、同じフォルダー内の他のすべてのJARファイルを取得します。最後に、メソッドでクラスの完全なパッケージ名を渡します。:*main

たとえば、という名前のJARファイル内のアプリのためmy_app.jarmainという名前のクラスのメソッドAppという名前のパッケージにcom.example同じフォルダ内のいくつかの必要なjarファイルと一緒に、:

java -classpath my_app.jar:* com.example.App

Java 8では機能しません
Greyshack


1

複数のjarと現在のディレクトリのクラスファイルに適した方法でクラスパスを設定します。

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH

0

フォルダーに複数のjarがあります。以下のコマンドは私のために働きましたJDK1.8は、フォルダーに存在するすべてのjarを含める。クラスパスにスペースがある場合に引用符で囲むことに注意してください

ウィンドウズ

コンパイル: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

ランニング: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

Linux

コンパイル: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

ランニング: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram


-1

jarまたはUbuntuのクラスとしてJavaファイルを実行しようとしています。私は両方のオプションで失敗しました。次の例外はその出力です。

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

または

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

または

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

私は答えを見つけました:

私の愚かさ。

最初のステップ:対応するJavaを設定する必要があります。Java11がありましたが、8番目のバージョンをJava libパスとして設定しました!-ここからJavaバージョンを設定できます:

  sudo update-alternatives --config java

2番目のステップ:次に、パスとファイル名を対応するパスとファイルに変更して、次のコマンドを実行します。

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

正常に実行されました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.