2016-09-15 2 views
2

問題の原因に関するアイデアが不足しています。私はJavaのjarファイルを持っています(もし重要であれば、intelijの下にgradleから構築されています)。Java Jar - クラスパスの問題

  • Jarにはマニフェストがあります。 jarファイルを含むディレクトリからjava -jar MyJar.jarを起動

  • は、Javaがmainclass2にjarファイル内のマニフェストファイルを編集するとマニフェストから読んでいる

  • 「メインクラスcompanyname.mainclassを検索またはロードできませんでした」を与えるエラーで名前を変更しますメッセージ

  • マニフェストは、ライン上の唯一のバージョンでは、ライン上のメインクラス属性なので、ジャーに

  • すべての依存関係は、/ libフォルダに相対している2行の空白行が含まれていますマニフェストに指定されているクラスパスがありません

  • zipファイルプログラムでjarファイルを開くと、mainclassというファイルがあるフォルダcompanynameが表示され、修飾名がjar構造に反映されます。大文字は正しい。

  • 手動でクラス名java -cp MyJar.jar companyname.mainclassを指定することができます同じクラスが見つからないというエラー

  • 問題のクラスがメインメソッドを持っている、とパッケージされていないとき、IDEの下で正常に動作ありません。

私の欠点は何ですか(私の頭から髪の毛がますます離れています)。

編集追加の詳細: - Javaの8

ジャー構造使用:

-META-INF 
    MANIFEST.MF 
-companyname 
    -module 
    -interfaces 
     interface1.class 
    -commands 
     baseCommand.class 
     register.class 
     specialCommand.class 
    moduleSpec.class 
    moduleProcessor.class 
    mainclass.class 
log4j.xml 
springconfig1.xml 
springconfig2.xml 

マニフェストファイル:

Manifest-Version: 1.0 
Main-Class: companyname.mainclass 
(newline char here) 
(newline char here) 
+0

jarファイル –

+0

のファイルの構造と場所を編集で共有します。 – SeeMoreGain

+0

マニフェストのコンテンツも追加したいのですが? –

答えて

2

まず、実行可能なjarを正しく作成していることを確認してください。 gradleを使用して実行可能なjarを作成する方法については、this answerを参照してください。

jarを正しく作成してパッケージ化している場合、メインクラスが見つからない依存関係があるため、メインクラスをロードできない可能性があります。あなたは言った:

すべての依存関係はそうあなたがlibフォルダがASファイルシステム上の同じフォルダ内にあることを意味している場合、マニフェスト

に指定されていませんクラスパスをjarファイルないために/ libフォルダに相対しています。 jarファイルを作成すると、依存関係が見つかりません。そのlibフォルダの内容は自動的にjarのクラスパスに追加されません。 javaコマンドのクラスパスに手動で追加することも、マニフェストに追加することもできます。あなたがクラスパスに追加する場合は、ワイルドカードを使用することができます。

java -cp "MyJar.jar;lib/*" com.mycompany.MyMainClass 

あなたがマニフェストに追加した場合は、you can't use wildcardsので、あなたのlibディレクトリの下に、個々のjar依存関係を指定する必要があります。

libディレクトリがjar( "fat jar")内にある場合、デフォルトのクラスローダーは実行可能なjarファイルからの依存関係を読み込まないようなクラスパスはありません。 。しかし、すべての依存関係を含むfat jarファイルを作成し、それを単一の実行可能なjarファイルとして配布できるツールが複数あります。あなたはgradleを使用しているので、gradle shadow pluginが役に立つかもしれません。

+0

私はクラスパスと/ libディレクトリからの読解のどこかで、正反対の部分を読んだので、コメントです。私がインターネットで読んだすべてを信用しないことを覚えておく必要がある! – SeeMoreGain

0

マニフェストは、ここに使用されるであろうが。また、試してみると

java -jar -verbose:class MyJar | grep mainclass 

クラスがロードされているかどうかを確認します。ああ - また、ここにJVMが混在していますか?

これは、Intellij/Gradleが構築していることをjavaのバージョンが示しているためです。

+0

パイプはエラーメッセージだけを表示しました。冗長出力全体を見ると、間違いなくjava 8 jreがロードされています。しかし、私のクラスの何もロードしていない。 Javaクラス(すべて.jar)をロードすると、エラーメッセージが表示され、最後の2つのJavaライブラリ( 'java.lang.Shutdown')が読み込まれます。だから、手がかりは? – SeeMoreGain

0

メインクラスに実行時にエラーをスローする静的初期化ブロックがある場合に、原因が考えられます。

+0

これは、サイトが探している答えの種類ではありませんが、これは最高のコメントであり、貧しいものです。 –

関連する問題