2011-10-26 15 views
2

私は多くのエンタープライズJavaアプリケーションで使用されるユーティリティライブラリを開発しました。このライブラリには、クラスパス上にある必要がある多くの追加の依存関係があります。私は開発者にMANIFEST.MFファイルに膨大な数のエントリを追加することを強いられないようにして、代わりに自分のライブラリを含めるようにしたいと思います。私のライブラリーのMANIFEST.MFファイルがその依存関係を参照し、私のライブラリーを使用するエンタープライズ・アプリケーションによってピックアップされる方法はありますか?JARのMANIFEST.MFファイルはWebアプリケーションで使用されますか?

ファイルシステムの依存関係の完全パスを使用して、私のライブラリのMANIFEST.MFファイルでそれらを参照しようとしました。それはうまくいかなかった。私はすべての依存関係のClassNotFoundExceptionエラーに終わる。私が試してみるべきことが他にありますか?

+0

あなたのアプリサーバーは何ですか?共有ライブラリのソリューションはコンテナに依存する可能性があります。 – McDowell

答えて

2

Webアプリケーションを作成するときは、通常、そのファイルをWARファイルに入れます。 WAR内の/ WEB-INF/libフォルダにjarファイルを追加することにより、WARファイルに必要な依存関係をバンドルするという考え方です。 Webコンテナ(Java EEアプリケーションサーバーのような)はこの構造を認識し、クラスパス上にそれらのjarを含みます。

ライブラリに追加の依存関係がある場合は、そのライセンスについてユーザーに伝え、ライセンスで許可されている場合はライブラリに再配布するか、入手する場所を教えてください。 IDE、Ant、Ivy、Maven(またはこれらの組み合わせ)のようなWebアプリケーションを作成するための適切なツールを使用する場合、依存関係の処理とバンドルは問題ありません。

+0

合意...完璧な世界です。しかし、我々は大企業であり、私たちの共有サービス/図書館は異なるチームによって開発されています。これらのライブラリを中央システムに保存して、WARファイルを再パッケージすることなくバグ修正や更新などを行うことができます。その結果、これらのファイルを参照するためにMANIFEST.MFファイルを使用します。私のライブラリがMANIFEST.MFファイルに依存している十数個のJARファイルを私のライブラリを使用するすべてのWeb開発者に追加する必要はありません。 – Shadowman

+0

しかし、新しいバージョンでjarファイルを置き換えた場合、変更されたクラスを読み込むためには、Webアプリケーションを再起動するか、少なくとも再デプロイする必要があります。私はGlassFishについて何かを読んで、別のクラスや多分libファイルのような、アプリケーションの一部だけを再デプロイできると信じています。 –

0

私はこれをいくつかのツールで行っています。本当に恐ろしいハックですが、確実に動作するようです。

  • 特別マニフェストを使用してください。

    マニフェスト・バージョン:1.0 メインクラス:com.xxx.yyy.zzz.YourSpecialClassThatHacksTheClassPath リアルタイムメインクラス:ような何かcom.ppp.qqq.TheirMainClass

  • あなたの特別なクラスでは、クラスパスで(簡単ではない)ねじ込み、マニフェストの "Real-Main-Class"エントリを読んで(ちょっと簡単)、メインから起動してください。

明らかに、これは.warファイルでは機能しません。など:また

+0

WARファイルで動作しない場合、私の使用例には役立ちません。 – Shadowman

0

、これはあまりにも長い間、あなたが非常に慎重にフォーマットに固執するように動作し、すなわち、各「ファイル」:前正確に二つのスペースに固執

Manifest-Version: 1.0 
Main-Class: package.TestClass 
Class-Path: file:/D:/WebServer/Tomcat/shared/lib/BlueCove.jar 
    file:/D:/WebServer/Tomcat/shared/lib/classes12.jar 
    file:/D:/WebServer/Tomcat/shared/lib/comm.jar 
    file:/D:/WebServer/Tomcat/shared/lib/FTP.jar 
    file:/D:/WebServer/Tomcat/shared/lib/FTP2.jar 
    file:/D:/WebServer/Tomcat/shared/lib/iText.jar 
    file:/D:/WebServer/Tomcat/shared/lib/j2ee.jar 
    file:/D:/WebServer/Tomcat/shared/lib/jmxremote.jar 
    file:/D:/WebServer/Tomcat/shared/lib/jmxri.jar 
    file:/D:/WebServer/Tomcat/shared/lib/jmxtools.jar 
    file:/D:/WebServer/Tomcat/shared/lib/jpos15.jar 
    file:/D:/WebServer/Tomcat/shared/lib/js.jar 
    file:/D:/WebServer/Tomcat/shared/lib/mail.jar 
... 
    file:/C:/WebServer/Tomcat/shared/lib/soap.jar 
    file:/C:/WebServer/Tomcat/shared/lib/sqljdbc.jar 
    file:/C:/WebServer/Tomcat/shared/lib/tools.jar 
+0

クラスパスエントリで独自の構文を使用していますか? URIであれば、 'file:/// D:... 'で始める必要があると思います。 –

+0

@G_H:私が知っているのは、このフォーマットが私の役に立つことです。このフォーマットがあなたのために働かないなら、是非他のものを試してみてください。 – OldCurmudgeon

0

でも、私は同じ問題を抱えていました。上記のように、解決策は、ファイルの後に正確に2つのスペースがあり、最後に.jarファイルの後に1つのスペースがあり、最後にEnterキーを押すことでした。

これはきちんとした解決策ではありませんが、機能します。楽しい。

関連する問題