3

私は非常に一般的な問題で立ち往生しています。

jar (サードパーティベンダーに多くの依存関係がある) をアプリケーションサーバーの lib ディレクトリにプラグインしています。jar をその依存関係と共にサーバー lib にコピーするだけでは、サーバーのクラスパスが長くなり、サーバーが機能しなくなります。したがって、サーバーのクラスパスが長くなりすぎないように、この Jar をすべての依存関係と共に単一の jar にパッケージ化したいと考えています。これを行うためのユーティリティ、つまり OneJar があることをさまざまなフォーラムで見つけました。ただし、このユーティリティは実行可能な jar で動作します。私の場合、最終的な jar は実行できません。

また、ANT が提供する ZIPFileSetGroup ユーティリティも試しましたが、マニフェスト ファイルでセキュリティの問題が発生しています。

この問題を解決するために私を助けてもらえますか?

ありがとう!

4

3 に答える 3

3

Mavenを使用してビルドする場合は、Maven依存関係プラグインを使用して、コピー依存関係タスクを使用できます。作成時にすべての依存関係をjarファイルにコピーします。

jarファイルにjarを手動で追加する場合は、jarファイルにManifest.mfファイルが含まれていることを確認し、その中にメインクラスとクラスパスを指定する必要があります。

Manifest-Version: 1.0
Main-Class: com.mypackage.MainClass
Class-Path: my.jar log4j.jar

もう1つのオプションは、.earファイルを作成することです。これは通常、特定のjarファイルをパッケージ化するときにエンタープライズアプリまたはWebアプリの.warファイルを表示する方法です。サーバーを使用しているようですので、これらの形式のいずれかが適している可能性があります。

于 2012-12-29T16:11:37.333 に答える
0

あなたが言う時

子プロセスはserver/libディレクトリからクラスパスを取得します

これはあなたの管理下にあるプロセスですか?親プロセスがクラスパスを次のように指定する場合

server/lib/*

(つまり、リテラル*)次に、ターゲットjavaプロセスはディレクトリ自体のjarファイルを列挙します。libこれらはすべてクラスパスで名前を付ける必要はありません。

ただし、親プロセスが値server/lib/*.jarを作成するために明示的に列挙している場合は、JARが「実行可能」でない場合でも、JARマニフェスト内のが有効-cpになるという事実を利用できます。Class-Pathこのようなスタンザを使用して、マニフェストのみのJARファイルを作成できます。

<!-- location of your 300 dependency JAR files, file1.jar ... file300.jar -->
<property name="lib.dir" location="lib" />
<fileset id="dependencies" dir="${lib.dir}" includes="*.jar" />

<pathconvert property="manifest.classpath" dirsep="/" pathsep=" "
             refid="dependencies">
  <map from="${lib.dir}" to="myapp" />
</pathconvert>

<jar destfile="myapp-manifest.jar">
  <manifest>
    <attribute name="Class-Path" value="${manifest.classpath}" />
  </manifest>
</jar>

myapp-manifest.jarこれにより、マニフェストに含まれるという名前のJARファイルが生成されます

Class-Path: myapp/file1.jar myapp/file2.jar ... myapp/file300.jar

このファイルをserver/lib新しいディレクトリに、300の依存関係を新しいディレクトリに配置しserver/lib/myappます。これで、生成-cpされたファイルには1つのファイル()のみが含まれますが、結果のJavaプロセスでは300個のJARファイルmyapp-manifest.jarがすべて使用可能になります。myapp

于 2012-12-29T21:32:32.917 に答える
0

zipgroupfilesetANTのjarタスクで使用するのが最も簡単なアプローチです。

<jar destfile="MyApplication.jar" filesetmanifest="mergewithoutmain">
  <zipgroupfileset dir="lib" includes="*.jar" /> 
  <!-- other options -->
  <manifest>
    <attribute name="Main-Class" value="Main.MainClass" />
  </manifest>
</jar>

mergewithoutmainに設定されたfilesetmanifestフラグは、マニフェストのメインセクション以外のすべてをマージすることに注意してください。

署名されたjarが原因で、手動で処理する必要のあるSecurityExceptionが発生しています。署名されたjarに関連付けられたクラスが、jar全体の署名を検証する場合、それらは実行時に失敗します。特定のファイルに対するダイジェスト署名は、問題なくマニフェストに追加されます。問題はクラスパスが大きくなりすぎることであるため、すべてのjarを1つのjarにバンドルできない場合がありますが、それらのほとんどをマージしてCLASSPATHを管理しやすくします。

もあります:http ://code.google.com/p/jarjar/

すべての依存jarを含むターゲットディレクトリを作成します。次に、10個のjarを一時ディレクトリに移動し、10個のバッチでjarを移動し続け、そのたびにそのグループから1つのjarを作成しようとします。セキュリティ例外が発生した場合、問題の原因となっているものを特定できます。分割統治法を試してください。300個のjarがある場合は、これを30回実行するだけで済みます。

于 2012-12-29T15:44:37.087 に答える