使用IntelliJ + Maven + Tomcat在Clojure中创建Web应用程序

17

我正在使用基于Compojure的Clojure Web应用程序,并在IntelliJ中使用Maven作为我的依赖管理器。 它基于我在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 ring服务器,我可以成功地在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 新手,我只能获得两个链接 :/


我查看过的其他资源:
  • https://dev59.com/p1XTa4cB1Zd3GeqP01o1
  • http://assenkolov.blogspot.com/2011/11/sample-clojurecompojure-web-application.html
  • http://alexott.net/en/clojure/ClojureMaven.html
  • http://stuartsierra.com/2009/09/03/mavens-not-so-bad
- MplsAmigo
我认为我知道发生了什么事情,我将仔细研究一下。我相当确定这与Clojure的gen-class功能有关,但需要挖掘一下才能给你提供解决方案。 - deterb
你找出问题的根本原因了吗? - Rob Kielty
你如何构建war文件(那个出错的)?如果你使用Leiningen,一个project.clj可能会有所帮助。 - Rasputnik
1
你检查过 tracker.core 类是否已经生成了吗?这似乎是与 genclass 声明有关的问题(:gen-class :extends javax.servlet.http.HttpServlet)。 - Denis Fuenzalida
这个问题已经存在多年了。不幸的是,我现在正在使用不同的技术,无法对可能或不可能起作用的答案进行解释。我从未找到解决办法,但@ordnungswidrig的答案听起来很有希望。 - MplsAmigo
1个回答

1
你需要预先编译你的Clojure命名空间tracker.core(AOT)。我不确定如何使用Maven插件完成此操作,但它可以为你提供正确的方向。
请确保在你的命名空间中有一个gen-class声明:
(ns tracker.core
  ;; ...
  (:gen-class :extends javax.servlet.http.HttpServlet))

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

如果有人能够为我验证这个答案,我就可以标记它了。 - MplsAmigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接