2016-10-03 3 views
3

jarマニフェストを設定して、そのフォルダの隣にあるすべてのライブラリ(jar)をロードしようとしています。フォルダ内のすべてのjarを使用するjarマニフェストを持つことは可能ですか?

マニフェストは次のようになります。

Manifest-Version: 1.0 
Class-Path: libs/ 
Main-Class: path.to.my.class.Main 

次のようにレイアウトは次のとおりです。

- MyJar.jar 
- libs/ 
-----lib1.jar 
-----lib2.jar 

そして、私はこのように実行しようとしています:

java -jar MyJar.jar 

そして私が手フォルダ内のjar内のクラスに関するNoClassDefinitionエラー。

好奇心が強い人にとっては、このフォルダにはクラス読み込み時に処理されるオプションのjarが含まれている場合があります。それは私がハードコードされたものや自動生成されたものを使用することはできません。

更新 マニフェスト自体からは現在のところ問題が解決されていません。その答えは、瓶を抜き出す必要なしに実用的な唯一のものでしたが、それも機能します。

サマリーとして答えはノーですが、特定できない依存関係がある場合はマニフェストファイルだけからはできません。

+0

AFIK JARのクラスパスは 'JAR'ファイルのルートから始まります。 'Spring Boot'や' OSGI'コンテナのように動的にロードしない限り、クラスやJARをサブディレクトリに置くことはできません。 – 11thdimension

+0

それができます、あなたはJAR名でパスを指定する必要があります。このリンクをチェックしてくださいhttp://todayguesswhat.blogspot.com/2011/03/jar-manifestmf-class-path-referencing.html?_sm_au_=ivVTSRf571T1SvZP – 11thdimension

+0

私はそのリンクを早期に実行しましたが、上記の私のマニフェストはそれに基づいていますが、仕事はありません。クラスパスに定義されているフォルダ内のファイルのみが検索されます。フォルダだけでは動作しないようです。 (すなわちlibs /または./libs/) – javydreamercsw

答えて

0

javaは、libsディレクトリ内のjarファイルを認識しません。 は、Java 1.6以上を使用している場合は、あなたが

Class-Path: libs/lib1.jar libs/lib2.jar 

は、Oracleのマニュアルを参照してくださいとあなたのマニフェストクラスパスを定義する必要があるのlib/* -jar MyJar.jar

+0

書いたとおりに動作しませんでした。これを行う必要がありました:java -cp libs/-jar MyJar.jar。残念ながら、これは私がマニフェストから可能かどうかを確かめようとしているので、私が尋ねたことではありません。 – javydreamercsw

+0

私はそれを動作させるためにこのバージョンを使いました:java -cp libs/* path.to.my.class.Main – javydreamercsw

+0

唯一のベータ版の回答としてこれを受け入れるための質問が更新されました。 – javydreamercsw

1

-cp

Javaなどのプログラムを実行することができます詳細についてはhttps://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

+0

もしあなたが手前にそのフォルダが持つジャーを知っていれば。これは、アプリケーションがクラスパス内にあるときに検出するオプションのjarを対象としています。 – javydreamercsw

+0

Class-Pathを試しましたか:libs/*。jar? –

+0

試してもまだ動作しませんでした。 – javydreamercsw

1

これらのjarを抽出してみてください。ディレクトリからすべてのjarを追加できないようですが、すべてのクラスを追加できます。あなたは明らかにマニフェスト内のすべての設定を失いますが、jarのコードコンテンツだけに興味があるなら、それはうまくいくかもしれません。

私は、これらの単純なクラスになりました

import pkg.B; 

public class A { 
    public static void main(String[] args) { 
    System.out.println(B.class.getName()); 
    } 
} 

package pkg; 

public class B {} 

と私はクラスを分離しようとすることをテストしました。私はそれらを詰め込みました

$ jar tf libA.jar 
META-INF/ 
META-INF/MANIFEST.MF 
A.class 
$ jar tf libB.jar 
META-INF/ 
META-INF/MANIFEST.MF 
pkg/B.class 

どのマニフェストでもクラスパスがありません。 java -cp libB.jar:libA.jar AでAを実行できます。今、私は今、私は右、jarファイルが

$ java -jar empty.jar 
Error: Could not find or load main class A 

絶望してみてください

$ ls -R 
.: 
A.java empty.jar lib lib.jar manifest pkg 

./lib: 
libA.jar libB.jar 

./pkg: 
B.java 

ように見えるlib/

$ cat manifest 
Class-Path: lib/ 
$ jar cfm empty.jar manifest 

私のディレクトリツリーに設定クラスパスを持つ別のjarファイルを作成しますか?次に、libA.jarとlibBを抽出しました。jarをlibに変換する([this guy] [2]と同じ)。今すぐすべてが良いです

$ java -jar empty.jar 
pkg.B 
+0

技術的ではないユーザーがこれを行うことができないため、これは私のシナリオでは機能しません。ジャーをディレクトリに置くように頼むのは難しいです。ありがとう – javydreamercsw

関連する問題