注
この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つしかありません。
あなたの意見では、これらのうちどれがケースですか?それとも別のものですか?
編集:
Warファイルの作成は、Maven/Leiningenを使用するのは簡単であり、私が言っていることではないことに注意してください。 CompojureをTomcatで動作させるには、静的ファイルサービスやコンテキストルート認識などの基本的なものをそのままで動作させる必要があるように、多くのコードを記述する必要があるのではないかと思います。
人々はCompojureアプリをJetty以外のサーブレットコンテナにデプロイしています。
チェックアウト:
レインウォーもチェック
私はこれをかなり苦痛なくするために以下の組み合わせを使用します:
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ファイルを集めました。
leiningen-war を使用して一般的なwarファイルを生成することにある程度成功しました(もちろん、leiningenを使用している場合)。静的htmlの場所、web.xmlの場所、およびproject.cljファイル内の他のリソースの場所を指定できます。
JBossにデプロイできる汎用のwarファイルを作成するのはそれほど難しくありません(サーブレットコンテナーとしてTomcatを実行)が、web.xml形式に精通している必要があると思います。私は自分のweb.xmlをより快適に作成できるので、このアプローチのほうが好きです。
Leiningen-warの背後にいる人が lein-ring を推奨しているようです。私はそれを検討し始めましたが、これまでのところ、そこから一般的なwarファイルを簡単に取得することはできません。
ただし、本番環境への配備を考慮することがここの弱点であることに同意します。
私は 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
の下にあります。
私はCompojure + Vaadinアプリケーションを(6か月以上の間)製品版でリリースしました。パッケージングは、lein-warプラグインを使用して行われており、大きな問題は発生していません。
アプリケーションはhalo.warファイルに含まれるhaloという名前で、コンテキストは/ haloで、TomcatサーバーもHudsonを実行しており、別のカスタムアプリケーションも実行されています。 Vaadinはすべての静的ファイル、CSS、画像を適切に解決しています...私は主にそれを使用しました ブログ投稿 それに必要な小さな接着剤を書くために。
別のメモとして、私は Noir on Herok も実行しており、パッケージ化と展開に関して何の問題もありませんでした。これも本番環境です。
これはあなたのCompojureの質問とは直接関係ありませんが、Webアプリケーションでの運用におけるClojureは確かにそうです。
Google App Engineにデプロイしている場合は、素晴らしいブログ http://compojureongae.posterous.com/ をご覧ください。
GAEにデプロイしていない場合でも、役立つヒントが得られる場合があります。
リングベースのサーバー(compojure、noir/lib-noir、luminusなど)を使用していて、uberjarとしてデプロイする場合は、
"Failed to load Main-Class manifest attribute from your-uberjar.jar"
単にlein ring uberjar
でuberjarを作成します。レインuberjarへの「リング」の追加に注意してください。これは、lein-ringプラグインを使用していることを前提としています。