IntelliJ + Maven + Tomcat 中的 Clojure Webapp

Posted

技术标签:

【中文标题】IntelliJ + Maven + Tomcat 中的 Clojure Webapp【英文标题】:Clojure Webapp in IntelliJ + Maven + Tomcat 【发布时间】:2012-02-26 05:46:25 【问题描述】:

我正在使用 Maven 作为我的依赖管理器在 IntelliJ 中使用基于 Compojure 的 Clojure Web 应用程序。它基于我在this 示例引用的git 存储库中找到的应用程序。当我尝试使用 IntelliJ 的 Tomcat6 配置运行应用程序时,每次都会失败并引用 Servlet 异常:

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

另外查看 web.xml,IntelliJ 无法识别 servlet 类(tracker.core 突出显示)。

一点背景:

此应用程序最初是为客户的概念验证而构建的,由我最近离开公司的同事编写。除了过去两天从事这个项目之外,我个人对 clojure 没有任何经验。使用 Leiningen 环服务器,我可以成功地让应用程序在码头运行。使用 leiningen ring uberwar,生成的 war 成功部署并在 tomcat 中运行。

原始文件结构如下:

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

新的 mavenized 文件结构现在反映了前面提到的 git repo 中的示例:

/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 新手,我只得到两个链接:/

【问题讨论】:

我看过的其他资源:-***.com/questions/5354038/…-assenkolov.blogspot.com/2011/11/…-alexott.net/en/clojure/ClojureMaven.html-stuartsierra.com/2009/09/03/mavens-not-so-bad 我想我知道是怎么回事了,我要仔细看看家里。我很确定这与 Clojure 的 gen-class 功能有关,但需要花点时间才能找到解决方案。 你找到问题的根本原因了吗? 你如何构建warfile(给出错误的那个)?如果您使用 Leiningen,project.clj 可能会有所帮助。 你检查过tracker.core这个类是真的生成了吗?这听起来像是 genclass 声明的问题 (:gen-class :extends javax.servlet.http.HttpServlet) 【参考方案1】:

您需要提前 (AOT) 编译您的 clojure 命名空间 tracker.core。我不确定如何使用 maven 插件完成此操作,但它为您提供了正确的方向。

确保您的命名空间中有一个 gen-class 声明:

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

检查 Intellij/Maven 是否确实在目标目录中生成了文件 tracker/core.class。

【讨论】:

如果有人能为我验证这个答案,我可以继续标记它。

以上是关于IntelliJ + Maven + Tomcat 中的 Clojure Webapp的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA + Maven + Tomcat + Jersey搭建RESTful服务

linux下的Java开发 intellij idea+tomcat+maven

IntelliJ IDEA 2017.2.6 x64 配置 tomcat 启动 maven 项目

IntelliJ IDEA 记学习笔 - Tomcat 启动调试,支持:Maven profiles 区分环境

IntelliJ IDEA 记学习笔 - Tomcat 启动调试,支持:Maven profiles 区分环境

Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目