web-dev-qa-db-ja.com

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

質問は次のとおりです。VagrantをJavaプロジェクト(またはそのためにコンパイルされた言語プロジェクト)に使用する場合、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は遅い)

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

91
Jay

よく考えて実験した結果、Vagrantの使用場所と、VagrantをJava開発ワークフローと統合する方法を決定しました。

JavaEE /デプロイされたアプリケーションの場合、Webサーバーとデータベースサーバーの構成は間違いなくVagrantの使用を保証する「十分な」複雑さを持っています。 2つのサーバーとそれらを構成する無数の方法により、構成が開発者間で簡単に同期しなくなり、「私のマシンで動作する」シンドロームが発生します。この種のソフトウェアの場合、ホストでコードを編集およびコンパイルし、実稼働環境を模倣するVagrant VMにデプロイするのが最適です。Webサーバーのデプロイメントフォルダーは、ホスト上のコンパイルターゲットにシンボリックリンクされるため、Vagrantは開発ライフサイクルの重要な部分ですが、ホストからのコード/コンパイル/デプロイのサイクルタイムはVM with Javaはホスト上のコードのサイクルタイムより長くなり、PHP/Rubyで見られるVM/Node/etc。

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

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

Vagrantに興味のある開発者に、それを使用する方法についてのコンテキストをJava開発者に提供することを願っています。

60
Jay

私は昨年このトピックに興味がありました:)

私の解決策は、フラグで構成可能な浮浪者マシンを持つことです。たとえば、このフラグの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"、タイプ: "rsync"、rsync__exclude: ".git /"ソースコードがホストで編集され、ゲストにrsyncされる方法。

3
Saverio Ferrara