2009-06-29 9 views

答えて

2

One-Jarと呼ばれるユーティリティがありますが、私はそれに対して助言したいと思いますが、あなたが望むものを実行します。パフォーマンスは通常ひどいです。

+2

ひどいパフォーマンスを詳しく教えてください。私はそれを使用し、フィードバックを感謝します。 –

+0

私は長い間使っていませんが、JARが解凍されたためにクラスローディングのパフォーマンスが非常に悪いことを思い出しています。しかし、私が言うように、それはしばらくしています。 – skaffman

2

よくあることがありますが、ときどき珍しいことがあります。法律またはテクニカル理由はありません。法的

  • はたとえば、私たちは、一度に我々は、我々は我々のアプリの残りの部分と一つの大きなパッケージにまとめたJavaMail jarファイルをバンドルできなかったと思ったことを発見したが、ライセンス契約は、我々が言いましたそれらを別々に保たなければならなかった。技術

  • もう一つの問題は、カスタムクラスローダが特定のjarファイル内の特定のリソースまたはクラスを探している可能性があります。これは、アプリケーションサーバーまたはESBのコンテナのコンテキストでよく発生します。

方法:すべてを1つのディレクトリに解凍してから、そこからjarを再構築してください。 META-INFフォルダーのいくつかの設定を調整して、追加のjarをロードする要求を削除し、異なるJARのそれぞれが実行するデフォルトクラスを持つ場合を処理する必要があります。いくつかのサードパーティ製のユーティリティがありますが、が何をしているのか分からない限り、彼らは何をしているのですか、気をつけたいのです。

+2

あなたはそれをどのように行うのですか? – Eric

5

これを行うには、Jar Jar Linksというツールがあります。決して使ったことはありませんが、名前を忘れるのは難しいです。

+5

マイナス1百万円に対しては – skaffman

13

は私が

  • あなたはあなたが使用することができます

  • [uberjar]使用することができます

  • +3

    +1です。 Mavenはこの種のものを世話するのにはとても素晴らしいものです。ただし、デフォルトのjar-with-dependenciesを使用するのではなく、カスタムアセンブリを作成することをお勧めします。 また、最新のアセンブリプラグインは多少バグがあり、依存関係の複数のコピーを追加することに注意してください。それが修正されるまで以前のバージョンを使用することをお勧めします。 – dborba

    2
    +0

    fatjarは他の場所で言及されているone-jarを使用します –

    9

    古き良きAntを使用:ちょうどこれがすべて含まれたjarライブラリのコンテンツを平らにしますZip task

    <zip destfile="out.jar"> 
        <zipgroupfileset dir="lib" includes="*.jar"/> 
    </zip> 
    

    のAntでzipgroupfilesetを使用しています。

    +2

    jarファイルで複数のManifestファイルをどのように扱うべきですか? –

    +0

    これには、 'org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'が動作する必要があります。 'org.eclipse.jdt.internal.jarinjarloader'パッケージが使用されていない限り、インクルードされたjarファイルはクラスパス上で利用できません。 –

    2

    Eclipse 3.4以降でこれを行うことができます。プロジェクトを右クリックし、「抽出」を選択して、「Runnable Jar」オプションにナビゲートします。次へを選択します。適切な設定とオフと実行を選択します。また、私はこの機能が、FatJar(上記)が使用するのと同じまたは同様のライブラリを使用して実現されていることを思い出しているようです。

    +0

    これは基本的にはVladimirの答えと同じです。Eclipseはこれを実装するためにAnt zipタスクを作成するためです。 – finnw

    +0

    Eclipseはこれを達成するために 'org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader'を使います。 –

    2

    完全性のために、ProGuardはこれを行うだけでなく、必要に応じて難読化して縮小するJARを行います。後者の機能は、最終的なデプロイメントJARの作成に特に役立ちます。

    0

    .jarファイルは、zipファイルをカバーしています。お気に入りのZipツールを使って(再)パッケージ化することができます。この場合、マニフェストファイルを自分で処理する必要があります。

    16

    私の気持ちは、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ラップトップで行われました。

    希望します。

    6

    One-JARは、起動時にすべての依存関係jarをメモリにロードします。 2004年にリリースされて以来、私に不満を感じている人はいません。クラスローダーがクラスパスを繰り返しスキャンする必要がないため、プリロードの可能性があるのはアプリケーションのクラスローディングの全体的な高速化ですアプリケーションが実行されるときのリソースとクラスのために、すべてがハッシュマップされます。

    オンデマンドで読み込むレイジーローダーを作成するのはかなり簡単です:しかし、私は "ビルド、それを測定し、必要なら改善します"と言っている学校のものです。それを改善する必要があります。

    将来のリリースでこれを念頭に置いておきます(または、他の誰かがそれに取り組んでいる場合は、それも素晴らしいでしょう)。測定が非常に大きなアプリケーションなしで、変更が改善されたかどうかを知ることは難しいからです。

    +1

    彼はそうしなかったのでこれについて言及します:@simontuffsはOne-JARの著者です。 – overthink

    関連する問題