2

如何在 tomcat 中添加定制的 jar,以便 servlet 可以使用它的功能。

澄清一下:我创建了一个名为 kos.lib.jar 的单独 Java 项目,导出为一个 jar,有一个 TimeUtil 类,公共方法 now() 返回一个字符串。作为一个独立的工作正常。现在我想从一个 servlet 中使用它的力量。所以:

eclipse indigo > New > Project > Dynamic Web Project > Apache tomcat v6.0,dynamic web version 2.5,默认配置为apache tomcat v6.0;从http://www.vogella.com/articles/EclipseWTP/article.html (从第 5 节开始)复制 Filecounter,然后 rmb > servlet1.java > run> on server> tomcat 正确显示 servlet。

现在我在 servlet1.java 的 public void init() 下添加简单的一行TimeUtil.now();,所以只是一个表达式。当我使用 TimeUtil.n 时,Eclipse 会自动完成,就类路径而言,Eclipse 很高兴。

运行 servlet(运行方式 > 在服务器上运行)但是会给出一个 tomcat 500:

java.lang.NoClassDefFoundError: kos/lib/time/TimeUtil
    kos.servlets.servlet1.init(servlet1.java:28)

是的,确实表达式在第 28 行的源代码中。但是如何修复它呢?在哪里添加我的 lib 以便 tomcat-run-from-eclipse 接受TimeUtil.now()?我尝试了很多,将它添加到调试配置类路径源中,在WEB-INF里面,在WebContent/WEB-INF里面,总是一样的500。然后我评论了这个表达式,tomcat再次运行页面正常。然后添加TimeUtil.now();到 FileDao 的 getcount() 方法中,同样是 500。

有相关的问题,但那些是关于分离的 eclipse 和 tomcat(通过用户代理端口),我只想从 eclipse 中使用它。随着 eclipse 和 tomcat 的分离,我只是将 jar 放在 tomcats libs 旁边,例如“servlet-api.jar”,但这在这种情况下没有效果。

我明白了

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

    javax.servlet.ServletException: Servlet.init() for servlet servlet1 threw exception
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        java.lang.Thread.run(Unknown Source)


    root cause 

    java.lang.NoClassDefFoundError: kos/lib/time/TimeUtil
        kos.servlets.servlet1.init(servlet1.java:28)
        javax.servlet.GenericServlet.init(GenericServlet.java:212)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        java.lang.Thread.run(Unknown Source)


    root cause 

    java.lang.ClassNotFoundException: kos.lib.time.TimeUtil
        org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
        org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
        kos.servlets.servlet1.init(servlet1.java:28)
        javax.servlet.GenericServlet.init(GenericServlet.java:212)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        java.lang.Thread.run(Unknown Source)


    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.


    --------------------------------------------------------------------------------

    Apache Tomcat/6.0.26
4

3 回答 3

1

在 Java Web 应用程序中,第三方库必须放在WEB-INF/lib目录中。如果没有这样的目录,只需创建它,Tomcat(或另一个 Java 应用程序服务器)将自动处理它,以使用其中的 jar 作为应用程序构建路径的一部分。

简而言之,在WEB-INF中创建一个文件夹lib并将您的外部 jar 放在那里。

于 2013-06-08T14:59:06.337 回答
0

我解决了。事实证明,tomcat-under-eclipse 指向一个特定的 tomcat,在我的例子中是 C:\dev\webserver\tomcat\6.0.32\lib,唯一需要做的就是将自定义库放在那里。(如果我停止服务器,重命名 jar,然后从 servlet 重新启动,我会得到 noclassdeffound 运行时) Web 服务器的确切路径可以在运行时配置 > 类路径中检查。为了更有趣,在“source”中设置自定义库的源代码(奖励:现在即使代码到达您的自定义源,您也可以设置断点!)

它与 web-inf 答案完全无关。

无论如何,感谢您的尝试。

于 2013-06-08T19:32:16.740 回答
0

把你的罐子放进去

网页内容/WEB-INF/lib

文件夹而不是

网页内容/WEB-INF

正如tomcat文档所说:

/WEB-INF/lib/ - 此目录包含 JAR 文件,其中包含应用程序所需的 Java 类文件(和相关资源),例如第三方类库或 JDBC 驱动程序。

阅读更多信息:http: //tomcat.apache.org/tomcat-4.1-doc/appdev/deployment.html

于 2013-06-08T15:02:52.833 回答