如何告诉tomcat在eclipse中运行时使用外部lib

时间:2013-06-08 14:55:46

标签: java eclipse tomcat servlets

如何在tomcat中添加自定义jar,以便servlet可以使用其功能。

澄清一下:我创建了一个名为kos.lib.jar的独立java项目,导出为jar,具有类TimeUtil,public方法now()返回一个String。作为独立工作正常。现在我想从servlet中使用它的强大功能。所以:

eclipse indigo>新>项目>动态Web项目> Apache tomcat v6.0,动态网络版2.5,默认配置为apache tomcat v6.0; 复制了Filecounter,来自http://www.vogella.com/articles/EclipseWTP/article.html(从第5节开始),然后是rmb> servlet1.java>运行>在服务器上> tomcat正确显示了servlet。

现在我在public void init()下添加servlet1.java简单行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放在像'servlet-api.jar'这样的tomcats libs旁边,但是在这种情况下没有效果。

我明白了

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

把你的罐子放进去

  

的WebContent / WEB-INF / lib中

文件夹而不是

  

的WebContent / WEB-INF

正如tomcat文档所说:

  

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

请阅读以下内容:http://tomcat.apache.org/tomcat-4.1-doc/appdev/deployment.html

答案 2 :(得分:0)

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

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

无论如何,谢谢你们的尝试。