56

ノート

このOPが約2年前に作成されたことを考えると、同じ質問をもう一度するのではなく、ステップバイステップの手順が存在するかどうか疑問に思っています。これにより、Jetty、Tomcatのいずれであっても、Noirまたは他のClojureWebアプリケーションをApacheに統合できます。 、 または、他の何か。Djangoにも同様の手順があり、PythonはDjangoの場合、リングフレームワークではなくエンジンとして実行されているため、ClojureWebアプリケーションでは事態がより複雑になることを理解しています。

エンドノート

私はClojureが大好きで、CompojureはすっきりとしたWebフレームワークのようです。

しかし、Tomcatのような通常のアプリケーションサーバーにアプリケーションをWARとしてデプロイしたいと思ったとき、すべてが崩壊しました。ストックハンドラーが機能しなかったため、実際にはローカルJettyとTomcatの両方で機能する静的ファイルとリソースのカスタムリングハンドラーを作成する必要があり、コンテキストルートを手動でどこにでも追加する必要がありました。

JettyとTomcatの両方で実行できると考えられる最も単純なWebアプリケーションを作成するために、このすべてのコードを記述しなければならなかったことに、私は否定的に驚いています。私はこれについて3つの可能な説明しかありません:

  1. Jettyを使用したローカル開発以外の目的で、つまり本番環境でClojure/Compojureを使用する人は誰もいません。
  2. 誰もがコンテキストルートなしで専用のJettyにClojure/Compojureアプリをデプロイします(人々はNode.jsアプリでそれを行います)
  3. 私が気づかなかった問題を回避するための本当に簡単な方法があります

あなたの意見では、これらのうちどれが当てはまりますか?それとも何か他のものですか?

編集:

WARファイルの作成は、Maven / Leiningenでは簡単であり、私が言っていることではないことに注意してください。CompojureをTomcatで動作させるには、静的ファイルの提供やコンテキストルート認識などの基本的なものをすぐに使用できるようにするために、非常に多くのコードを記述しなければならないのではないかと思います。

4

7 に答える 7

11

私はこれをかなり苦痛のないものにするために以下の組み合わせを使用します:

Cake(deployコマンドを含む)

LauJensenによって開発されたWebプロジェクト用のCakeテンプレート。

Vagrant(ChefまたはPuppetに依存するRuby VM(Virtualbox)管理ツール)

VPS(Slicehostから)

重要な部分は、Lauが作成したwebdevテンプレートです。webdevフォルダーはに配置する必要があります~/.cake/templates。それに基づいて新しいプロジェクトを作成するには、次を使用します。

cake new webdev *projectname*

plsは、テンプレートにlog4jとJavaメールが含まれていることに注意してください。これらは、不要な場合は除外できます。さらに、EnliveとMustacheを使用していることを前提としていますが、それがあなたの毒である場合、Compojure/Hiccupに変更するのは簡単です。

テンプレートは、開発中のjetty(server.cljを評価するだけ)からアプリを提供し、Tomcatで実行すると戦争として機能します。Tomcatの下でROOT.warとしてサーバーにデプロイされた場合、ルートは同じままです。すべての静的ファイルは、リソースディレクトリに配置する必要があります。Jettyはそこからそれらを提供します(Ringファイルミドルウェアのおかげで)。本番環境では、これらはWebアプリケーションのルートに移動され、そこからTomcatによって提供されます(web.xmlがそれを処理します)。

devboxフォルダーには、TomcatがインストールされたVirtualboxVMを作成するために必要なVagrantfileとクックブックが含まれています。私はcakeを使用して.warファイルを/home/vagrantdirにデプロイします(これはproject.cljのdevコンテキストの定義から制御されます)。.warファイルは、Tomcatのwebapps dir(/var/lib/tomcat6/webapps)にROOT.warとしてシンボリックリンクされます。Vagrantの使用方法の詳細については、Vagrantサイトを参照してください。

この要点は、cakedeployコマンドを使用するようにproject.cljを適合させる方法の例を示しています。この例では、次を使用してデプロイできる2つのコンテキスト@devと@prodを作成します。

cake deploy @dev / cake delpoy @prod

CakewebdevテンプレートとVagrantファイルをこのzipに集めました。

于 2011-04-01T17:40:21.853 に答える
9

人々はCompojureアプリをJetty以外のサーブレットコンテナにデプロイしています。

チェックアウト:

lein-warもチェックしてください

于 2011-04-01T15:36:49.537 に答える
6

私はleiningen-warを使用して一般的なwarファイルを生成することにある程度成功しました(もちろん、leiningenを使用していると仮定します)。これにより、静的htmlの場所、web.xmlの場所、およびproject.cljファイル内の他のリソースを指定できます。

JBoss(Tomcatをサーブレットコンテナとして実行)にデプロイできる汎用のwarファイルを作成することはそれほど難しくありませんでしたが、web.xml形式にかなり精通している必要があると思います。私は自分のweb.xmlを作成する方が快適なので、このアプローチがもっと好きであると説明できるかもしれません。

ライニンゲン戦争の背後にいる人が今、ラインリングを勧めているようです。私はそれを見始めましたが、これまでのところ、一般的なwarファイルを簡単に取得することはできませんでした。

私は、本番展開の説明がここでの弱点であることに同意します。

于 2011-04-01T16:01:09.700 に答える
3

RingとCompojureの上に構築されたWebフレームワークであるNoirを使用しています。

を使用してプロジェクトを作成しましlein noir new my-projた。次にmy-proj/web、ディレクトリを作成し、次の行をに追加しました

project.clj:    
    :compile-path "web/WEB-INF/classes"
    :library-path "web/WEB-INF/lib"
    :ring {:handler project.server/handler}

my-proj/webTomcatの開発中に、ディレクトリをコンテキストルートとして設定しました。

静的ファイルの提供については、my-proj/resources/publicディレクトリの下にあるものを置きます。コードを介してファイルにアクセス(読み取り/書き込み)するには:servlet-context、リングリクエストヘッダーから使用できます。上記の設定では、コンテキストパスは次のようになります(.getRealPath (ring-request-header :servlet-context) "/WEB-INF/classes/myfile.txt")。Myfile.txtは。の下にありmy-proj/resourcesます。

于 2011-09-20T11:12:10.813 に答える
2

Google App Engineにデプロイしている場合は、こちらのすばらしいブログhttp://compojureongae.posterous.com/をご覧ください。

GAEにデプロイしていない場合でも、役立つヒントが得られる場合があります。

于 2011-04-01T10:52:37.117 に答える
2

Compojure + Vaadinアプリケーションを本番環境で(現在6か月以上)リリースしました。パッケージ化はlein-warプラグインを使用して行われ、大きな問題は発生しませんでした。

アプリケーションはhaloという名前で、halo.warファイルに含まれています。コンテキストは/ haloで、TomcatサーバーもHudsonと別のカスタムメイドのアプリケーションを実行しています。Vaadinは、すべての静的ファイル、CSS、画像を適切に解決しています...私は主に、そのブログ投稿を使用して、それに必要な小さな接着剤を作成しました。

別の注意点として、私もHerokuでNoirを実行し ており、パッケージ化と展開に関して問題はありませんでした。これも本番環境です。

これはCompojureの質問とは直接関係ありませんが、Webアプリケーションでの本番環境でのClojureは確かにそうです。

于 2011-08-04T05:36:08.810 に答える
1

リングベースのサーバー(compojure、noir / lib-noir、luminusなど)を使用していて、回避するためにuberjarとしてデプロイする場合

"Failed to load Main-Class manifest attribute from your-uberjar.jar"

でuberjarを作成するだけlein ring uberjarです。leinuberjarへの「ring」の追加に注意してください。これは、lein-ringプラグインを使用していることを前提としています。

于 2013-04-08T20:13:24.123 に答える