Javaプロジェクトの浮浪者:VMまたはホストのどちらでコンパイルする必要がありますか?


92

ここに質問があります:Javaプロジェクト(またはそのためにコンパイルされた言語プロジェクト)にVagrantを使用する場合、VMまたはホストでコンパイルする必要がありますか?また、IDEとすべての開発ツールをVM内から実行したり、ホスト上で実行したりしますか?

Java IDEとコンパイル/デプロイプロセスがVagrant VMでどのように機能するかは、あまり明確に定義されていないようです。一般に、私の印象は、コードがホスト上で編集され、VMで実行されることです。これは、コンパイルされていない言語に最適です。Stackoverflowに関する他の回答は、追加のコンパイル手順のために、Vagrantはコンパイル済み言語にはあまり役に立たないことを示唆していますが、何ができるかをまだ知りたいです。

私がすでに考えてきたいくつかのこと:

VMでコンパイルする理由

  • ホストでコンパイルする場合、javaはインストールするもう1つのソフトウェアです
  • ホストでコンパイルする場合は、ホストのJavaバージョンをVMのバージョンと手動で最新に保つ必要があります
  • ホスト上の対応するJavaバージョンが使用できない可能性があります(たとえば、Macの場合)

VMにIDEがある理由

  • 環境とIDE間の緊密な統合、ショートカットを使用してアプリケーションを実行できます
  • リモートデバッグなしでJavaアプリケーションのデバッガーを接続できます(1ステップの実行/デバッグ)

ホストでコンパイルする理由

  • コンパイル時間の短縮
  • VMを可能な限り本番環境に近づけたい

ホストにIDEがある理由

  • ホストでコードを編集し、VMで実行するのは怠惰な規則です
  • UIパフォーマンスの向上(X転送とVNCが遅い)

あなたの考えは何ですか:私はVMまたはホストの内部からIDEを実行する必要がありますか?VMまたはホストの内部からコンパイルする必要がありますか?

回答:


61

熟考と実験の結果、私はVagrantをどこで使用するか、どのようにJava開発ワークフローと統合するかを決定しました。

JavaEE /デプロイされたアプリケーションの場合、Webサーバーとデータベースサーバーの構成は、Vagrantの使用を保証するのに「十分」な複雑さを持つものです。2つのサーバーとそれらを構成する無数の方法を使用すると、ある開発者から別の開発者への構成が簡単に同期しなくなり、「私のマシンで動作する」症候群を引き起こします。この種のソフトウェアの場合、ホストでコードを編集およびコンパイルし、本番環境を模倣するVagrant VMにデプロイするのが最適です。Webサーバーのデプロイメントフォルダーをホストのコンパイルターゲットにシンボリックリンクすることもでき、手動で再デプロイする必要がなくなります。したがって、Vagrantは開発ライフサイクルの重要な部分になる可能性があります。

スタンドアロンのJavaアプリケーション(ライブラリやデスクトップアプリケーションなど)の場合、状況は少し変わります。この場合、ホストマシン上で編集、コンパイル、および実行することが最も理にかなっており、Vagrantの使用を完全に回避します。大きなJava IDE(Eclipse、Netbeans、IntelliJ ...)のいずれかを使用している場合は、マシンにJavaがすでにインストールされています。その時点では、Vagrantを使用するオーバーヘッドと比較して利点はほとんどなく、開発プロセスに追加の複雑なレイヤーを配置するためにのみ役立ちます。これは、IDEでJavaを編集できるようになるまでに、とにかくホスト上ですべてを実行できるためです。1つの問題は、プロジェクトに必要なJavaのバージョンが、ホストでIDEを実行しているバージョンと一致しない可能性があることです。一般的に(うまくいけば)これはそれほど問題にはなりません。これを書いている時点で、JDK6は廃止されており、JDK8はまだリリースされていません(それが私たちに残る場所を推測します)。ただし、複数のバージョンを実行する必要がある場合は、必要に応じてホストにJAVA_HOMEを設定できるはずです。これにより複雑さが増しますが、Javaの異なるバージョンを使用するプロジェクトで作業するためだけにVagrantランタイムを維持するよりも複雑さが少なくなります。

興味深い質問は、コンテナレスWebアプリケーションをどうするかです。外部Webサーバーの場合と同様に、Webサーバー(この場合はアプリケーションの内部)をVM内で実行する必要がありますか?または、スタンドアロンアプリケーションの場合と同様にホストで実行しますか?コンテナレスWebアプリケーションの場合、心配する外部Webサーバーはありませんが、データベースがまだ存在する可能性があります。この状況では、ハイブリッドなアプローチをとることができます。コンテナレスのウェブアプリを実行することは、基本的にスタンドアロンアプリケーションを実行することと同じであるため、ホストマシンでコードをコンパイルして実行すると効果的です。ただし、データベースが関与する場合でも、データベースサーバーを独自のVagrant VM上に配置することは理にかなっているので、十分な複雑さと構成があります。

うまくいけば、これがVagrantに興味のあるJava開発者に、その使用方法に関するいくつかのコンテキストを提供します。


Windows OSホストおよびLinux OS VMの場合、LinuxVMでIntelliJを実行し、ホスト(Windows)でX11を実行することについてどう思いますか?
ケビンメレディス14

3
すばらしい質問:言及しませんでしたが、Vagrant VM内でIDEを実行して多くのテストを行いましたが、パフォーマンスがひどいことがわかりました。メニューをクリックするときのように、応答に約12秒かかりました。私は次のようなことを試しました:より速い暗号を指定し、X11の圧縮を使用し、VMビデオRAMを増やして、応答時間を4秒にして、まだ使用できませんでした。したがって、私の考えは、VagrantはIDEを実行するためのものではないということです。
Jay

私はあなたがそれを試してみるべきだと思います-私はVirtualBox 2Dアクセラレーションを有効にしませんでした。これはWindowsホスト用であり、Windowsホストがなかったためです。私が試すことができなかった他のパフォーマンスのアイデアには、VMWareのプロバイダーが特別なグラフィック最適化を持っていると噂されており、X11よりもパフォーマンスが優れているVRDPを試すことができます。 space.org。うまく機能しているものがあれば、こちらに投稿してください。
Jay

2
私はゲストVM内でIntelliJをテストしていません(ゲストでの動作が遅いという同僚の経験はありません)。しかし、私は「Vagrant-Up and Running」で以下を読みました:Shared folders incur a heavy performance penalty within the virtual machine when there is heavy I/ O, so they should only be used for source files. Any compilation step, database files, and so on should be done outside the shared folder filesystem inside the guest filesystem itself.この本の声明(Vagrant作成者によって書かれた)は、ホストVMでのコンパイルに反対しているようです。
ケビンメレディス14年

4
引用は「仮想マシン内のパフォーマンスの大幅なペナルティ」について言及しており、ホストのグローバルパフォーマンスのペナルティについては言及していないため、ここでのコンテキストはVM内のパフォーマンス/操作に関するものだと思います。その文脈では、この引用は、ゲストでのコンパイルとホストでのコンパイルを推奨するのではなく、実行されたコンパイル手順がゲスト内で行われるときのパフォーマンスを予測すると解釈します。この引用のコンテキストについて詳しく教えていただけますか?本はこのシナリオを具体的に扱っていますか?もちろん、これはすべて実際のテストの対象となります:)
Jay

3

私は昨年、このトピックに興味を持っていました:)

私の解決策は、フラグで構成可能な迷惑なマシンを持つことです。たとえば、このフラグの1つはデスクトップGUIを有効にします。これは、一部の開発者はホストマシンでコーディングすることを好み、他の開発者はデスクトップとIDEを備えたより統合された環境を好むためです。

デスクトップの遅さに直面するには、非常に便利なvagrantプラグインをインストールする必要があります(ええと... vagrantには開発環境を大幅に改善するプラグインがあります)。vagrant plugin install vagrant-vbguest virtualboxインターフェースの使用中に使用できるようにします。次に、GUIを有効にするには、次のようにVagrantfileを編集します。

config.vm.provider "virtualbox" do | vb | vb.gui = true end

代わりに、共有フォルダーのパフォーマンスをスピードアップするには、rsyncを使用することをお勧めします:config.vm.synced_folder "./git"、 "/ home / vagrant / git"、type: "rsync"、rsync__exclude: ".git /"この中にホストでソースコードを編集してから、ゲストにrsyncする方法。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.