私はこれが "ベストプラクティス"ではないことを知っていますが、1つの大きなジャーにすべての依存関係を含めることはできますか?すべてのjar依存関係を1つの大きなjarファイルにパッケージ化することは可能ですか?
答えて
One-Jarと呼ばれるユーティリティがありますが、私はそれに対して助言したいと思いますが、あなたが望むものを実行します。パフォーマンスは通常ひどいです。
よくあることがありますが、ときどき珍しいことがあります。法律またはテクニカル理由はありません。法的
:はたとえば、私たちは、一度に我々は、我々は我々のアプリの残りの部分と一つの大きなパッケージにまとめたJavaMail jarファイルをバンドルできなかったと思ったことを発見したが、ライセンス契約は、我々が言いましたそれらを別々に保たなければならなかった。技術
:もう一つの問題は、カスタムクラスローダが特定のjarファイル内の特定のリソースまたはクラスを探している可能性があります。これは、アプリケーションサーバーまたはESBのコンテナのコンテキストでよく発生します。
方法:すべてを1つのディレクトリに解凍してから、そこからjarを再構築してください。 META-INFフォルダーのいくつかの設定を調整して、追加のjarをロードする要求を削除し、異なるJARのそれぞれが実行するデフォルトクラスを持つ場合を処理する必要があります。いくつかのサードパーティ製のユーティリティがありますが、が何をしているのか分からない限り、彼らは何をしているのですか、気をつけたいのです。
あなたはそれをどのように行うのですか? – Eric
は私が
あなたはあなたが使用することができます
[uberjar]使用することができます
+1です。 Mavenはこの種のものを世話するのにはとても素晴らしいものです。ただし、デフォルトのjar-with-dependenciesを使用するのではなく、カスタムアセンブリを作成することをお勧めします。 また、最新のアセンブリプラグインは多少バグがあり、依存関係の複数のコピーを追加することに注意してください。それが修正されるまで以前のバージョンを使用することをお勧めします。 – dborba
あなたがファイルをunjarし、コマンドラインを使用してそれらを再梱包することができjar-with-dependenciesディスクリプタにmaven assembly pluginを使用fatjar
fatjarは他の場所で言及されているone-jarを使用します –
古き良きAntを使用:ちょうどこれがすべて含まれたjarライブラリのコンテンツを平らにしますZip task
<zip destfile="out.jar">
<zipgroupfileset dir="lib" includes="*.jar"/>
</zip>
のAntでzipgroupfileset
を使用しています。
jarファイルで複数のManifestファイルをどのように扱うべきですか? –
これには、 'org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'が動作する必要があります。 'org.eclipse.jdt.internal.jarinjarloader'パッケージが使用されていない限り、インクルードされたjarファイルはクラスパス上で利用できません。 –
Eclipse 3.4以降でこれを行うことができます。プロジェクトを右クリックし、「抽出」を選択して、「Runnable Jar」オプションにナビゲートします。次へを選択します。適切な設定とオフと実行を選択します。また、私はこの機能が、FatJar(上記)が使用するのと同じまたは同様のライブラリを使用して実現されていることを思い出しているようです。
これは基本的にはVladimirの答えと同じです。Eclipseはこれを実装するためにAnt zipタスクを作成するためです。 – finnw
Eclipseはこれを達成するために 'org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'を使います。 –
完全性のために、ProGuardはこれを行うだけでなく、必要に応じて難読化して縮小するJARを行います。後者の機能は、最終的なデプロイメントJARの作成に特に役立ちます。
.jarファイルは、zipファイルをカバーしています。お気に入りのZipツールを使って(再)パッケージ化することができます。この場合、マニフェストファイルを自分で処理する必要があります。
私の気持ちは、One-Jarのパフォーマンスをひどく貧しいものにするのは不公平です。適度なサイズのアプリケーションでは、起動に2〜3秒かかることがあります(ただし、JVMのスプラッシュ画面には影響しません)。数十メガバイトのメモリオーバーヘッドは、おそらく組み込みシステムを除いて、ほとんどの環境ではごくわずかです。また、One-Jarはファイルシステムへのファイルの自動抽出が可能で、私の場合はインストーラを開発する必要がありません。
以下は、One-Jarがアプリケーションにもたらすパフォーマンスの影響を定量化する試みです。これはSwingベースのGUIアプリケーションで、ProGuard 4.5b2で難読化された352クラスから構成されています。 One-Jar 0.96は、結果のクラスを12MB相当のライブラリ(ODFDOM、Saxon HE、Xerces、Jaxen、VLDocking、Apache Commonsなど)でバンドルするために使用されます。私は難読化された瓶の性能をOne-Jarが処理した同じ瓶と比較しました。
- JVMの開始からmain()メソッドの開始まで:One-Jarを使用しない場合は0.5、One-Jarの場合は1.7秒。 JVMから画面上のアプリケーションウィンドウの表示まで:One-Jarなしで2.3秒、One-Jarで3.4秒。したがって、One-Jarは起動時に1.1秒を追加します。
- One-JarはJVMの起動と画面上に表示されるスプラッシュイメージ(jarマニフェストで実装されている場合)との間の遅延を増加させないため、起動時間の増加は対話型アプリケーションではあまり煩わしくありません。
- クラスローダーについては、ダイナミッククラスローディングを広範囲に使用している場合を除き、コード実行速度には影響しません。
- JVMの統計情報(jconsole経由)を見ると、One-Jar'redバージョンのヒープメモリが多くなります。私のアプリケーションでは、オーバーヘッドは数十MB程度です。アプリケーションが扱っている多くのユーザーデータに応じて、現在はガベージコレクタが実行されてから、16MBと40MB、306MBと346MB、131MBと138MBのような数字が見えました。
上記のタイミングは、Linuxシェル、main()メソッドの開始時、および自分のアプリケーションウィンドウのwindowOpened()イベントハンドラからJVMを起動する直前のタイムスタンプを取ることによって取得されました。測定は、Ubuntu 8.04を実行しているデュアルコア1GHz CPUと2GまたはRAMを搭載した特に高速のD820ラップトップで行われました。
希望します。
One-JARは、起動時にすべての依存関係jarをメモリにロードします。 2004年にリリースされて以来、私に不満を感じている人はいません。クラスローダーがクラスパスを繰り返しスキャンする必要がないため、プリロードの可能性があるのはアプリケーションのクラスローディングの全体的な高速化ですアプリケーションが実行されるときのリソースとクラスのために、すべてがハッシュマップされます。
オンデマンドで読み込むレイジーローダーを作成するのはかなり簡単です:しかし、私は "ビルド、それを測定し、必要なら改善します"と言っている学校のものです。それを改善する必要があります。
将来のリリースでこれを念頭に置いておきます(または、他の誰かがそれに取り組んでいる場合は、それも素晴らしいでしょう)。測定が非常に大きなアプリケーションなしで、変更が改善されたかどうかを知ることは難しいからです。
彼はそうしなかったのでこれについて言及します:@simontuffsはOne-JARの著者です。 – overthink
- 1. jarと新しいjar内のすべての依存関係をmavenでパッケージ化する方法
- 2. maven jarの依存関係の1つに必要な設定ファイルはどこに置くべきですか?
- 3. 依存関係jarは実行可能であるべきですか?
- 4. aarへのjar依存関係のパッケージ化を避ける
- 5. パッケージ化されたJARにローカル依存関係を含める
- 6. 依存関係を持つjarファイルを作成するには
- 7. 依存関係とテストの依存関係を持つjarを作成する
- 8. 依存関係を変更して複数のJARをMavenにパッケージ化する
- 9. すべての依存関係は、Mavenビルドでjarまたはwarにパッケージ化されますか?
- 10. NetBeansモジュールプロジェクトのJARファイルに依存することは可能ですか?
- 11. Java 1.4のJarファイルの依存関係
- 12. 依存関係を持つ実行可能なjarファイルを作成するためのMavenプラグイン(jarファイルとjarファイル)
- 13. jarファイルの逆依存関係
- 14. jarファイルの親依存関係を取得するには?
- 15. Java Gradleは依存関係のjarファイル名を見つける
- 16. 依存関係情報を持つjarファイルを作成する
- 17. 依存関係jarを持つ実行可能なjarを作成する方法
- 18. ローカルjarファイルにMaven依存関係を設定するには
- 19. コマンドラインから実行可能なJAR(ÜberJAR)とJARの依存関係を束ねる
- 20. mavenビルドjarとマルチモジュールプロジェクトの依存関係
- 21. Javaのjarファイルに依存関係を追加する方法
- 22. IntelliJ - jarファイルを作成するときに依存関係のjarファイルを含める
- 23. 実行可能なjarファイルにJythonプログラムをパッケージ化する
- 24. タスク依存のSBT依存関係を持つことは可能ですか?
- 25. javaのパッケージとjarファイルの関係は何ですか?
- 26. sbt 0.10での依存関係の収集(すべての依存関係jarをターゲット/ scala-version/lib /に置く)
- 27. oracle.forms.handler.IHandlerの依存関係またはjar
- 28. NetBeansのすべての依存関係を含む実行可能なjarを作成します。
- 29. Maven:1つのJarにすべての依存関係をコンパイルするプロジェクトのpomに
- 30. グランツとNPM、すべてのプロダクション依存関係をパッケージ化
ひどいパフォーマンスを詳しく教えてください。私はそれを使用し、フィードバックを感謝します。 –
私は長い間使っていませんが、JARが解凍されたためにクラスローディングのパフォーマンスが非常に悪いことを思い出しています。しかし、私が言うように、それはしばらくしています。 – skaffman