web-dev-qa-db-ja.com

ApacheでClojure Webアプリケーションを統合する方法

このOPが約2年前に書かれたとすると、同じ質問をもう一度するのではなく、Noirまたは他のClojure Webアプリケーションを統合できるように、段階的な手順が存在するかどうか疑問に思っていますApache(Jetty、Tomcat、その他)。 Djangoにも同様の手順が存在し、PythonがDjangoのケースではリングフレームワークではなくエンジンとして実行されているため、Clojure Webアプリケーションではさらに複雑になります。

End Note

私はClojureに深く惚れ込んでおり、CompojureはきちんとしたWebフレームワークのように見えます。

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

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

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

あなたの意見では、これらのうちどれがケースですか?それとも別のものですか?

編集:

Warファイルの作成は、Maven/Leiningenを使用するのは簡単であり、私が言っていることではないことに注意してください。 CompojureをTomcatで動作させるには、静的ファイルサービスやコンテキストルート認識などの基本的なものをそのままで動作させる必要があるように、多くのコードを記述する必要があるのではないかと思います。

56
futlib

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

チェックアウト:

レインウォーもチェック

9
Don Jackson

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

Cake (デプロイコマンドを含む)

Lau Jensenが開発したwebprojectsのCakeテンプレート。

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

VPS(Slicehostから)

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

cake new webdev *projectname*

テンプレートには、log4jとJavaメールが含まれていますが、不要であれば除外できる/除外する必要があります。さらに、EnliveとMoustacheを使用していると想定しますが、それをCompojure/Hiccupに変更するのは簡単です。あなたの毒。

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

Devboxフォルダーには、Virtualboxを作成するために必要なVagrantfileとクックブックが含まれていますVM Tomcatがインストールされています。ケーキを使用して.warファイルを/home/vagrant dir(これは、project.cljのdevコンテキストの定義から制御されます)。 .warファイルは、Tomcatのwebapps dir(/var/lib/Tomcat6/webapps)ROOT.warとして。 Vagrantの使用方法の詳細については、Vagrant site を参照してください。

この Gist は、project.cljをCakeデプロイコマンドを使用するように調整する方法の例を示しています。この例では、使用にデプロイできる2つのコンテキスト@devと@prodを作成します。

cake deploy @dev / cake delpoy @prod

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

11
mac

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

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

Leiningen-warの背後にいる人が lein-ring を推奨しているようです。私はそれを検討し始めましたが、これまでのところ、そこから一般的なwarファイルを簡単に取得することはできません。

ただし、本番環境への配備を考慮することがここの弱点であることに同意します。

6
stand

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

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}

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

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

3
user954311

私はCompojure + Vaadinアプリケーションを(6か月以上の間)製品版でリリースしました。パッケージングは​​、lein-warプラグインを使用して行われており、大きな問題は発生していません。

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

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

これはあなたのCompojureの質問とは直接関係ありませんが、Webアプリケーションでの運用におけるClojureは確かにそうです。

2
Nicolas Modrzyk

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

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

2
Matthew Boston

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

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

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

1
Greg B