17

Maven を依存関係マネージャーとして使用して、IntelliJ で Compojure ベースの Clojure Web アプリケーションを使用しています。これは、この例で参照されているこのgitリポジトリで見つけたアプリケーションに基づいています。IntelliJ の Tomcat6 構成を使用してアプリケーションを実行しようとすると、サーブレット例外を引用するたびに失敗します。

javax.servlet.ServletException: Wrapper cannot find servlet class tracker.core or a class it depends on

さらに web.xml を見ると、IntelliJ はサーブレット クラスを認識しません (tr​​acker.core が強調表示されています)。

少し背景:

このアプリケーションはもともと、クライアント向けの概念実証として作成されたもので、最近会社を辞めた同僚によって作成されました。個人的には、この 2 日間このプロジェクトに取り組んだ以外に、clojure に関する経験はありません。Leiningen リング サーバーを使用すると、アプリケーションを jetty で正常に実行できます。leiningen ring uberwar を使用すると、結果の war は tomcat で正常にデプロイおよび実行されます。

元のファイル構造は次のようになります。

/tracker-webapp  
    /classes
    /lib
    /resources
    /src
        /tracker
            /core.clj (and other *.clj files)
    /test
    project.clj

Maven 化された新しいファイル構造は、前述の git リポジトリの例を反映するようになりました。

/tracker-webapp
    /src
        /main
            /clojure
                /tracker
                    /core.clj (and other *.clj files)
            /webapp
                /WEB-INF
                    /web.xml
    /pom.xml

私のweb.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

  <display-name>Simple Clojure WebApp</display-name>
  <servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>tracker.core</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

</web-app>

その他のリソース

このセクションで調べた他のリソースを投稿するつもりでしたが、私は Stack Overflow Newb であるため、2 つのリンクしか取得できません :/

4

1 に答える 1

1

clojure 名前空間 tracker.core を事前に (AOT) コンパイルする必要があります。これがmavenプラグインでどのように行われるかはわかりませんが、正しい方向性が得られます.

名前空間に gen-class 宣言があることを確認してください。

(ns tracker.core
  ;; ...
  (:gen-class :extends javax.servlet.http.HttpServlet))

Intellij/Maven が実際にファイル tracker/core.class をターゲット ディレクトリに生成することを確認します。

于 2013-04-20T18:53:13.340 に答える