【问题标题】:How to tell tomcat to use an external lib while running from within eclipse如何在 Eclipse 中运行时告诉 tomcat 使用外部库
【发布时间】:2013-06-04 17:49:21
【问题描述】:

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

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

eclipse indigo > New > Project > Dynamic Web Project > Apache tomcat v6.0,动态web版本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 行的源代码中。但是如何修复它? 在哪里添加我的库以便tomcat-run-from-eclipse 接受TimeUtil.now()?我尝试了很多,将它添加到调试配置类路径源中,在WEB-INF里面,在WebContent/WEB-INF里面,总是相同的500。然后我评论了这个表达式,tomcat再次运行页面正常。然后在FileDao的getcount()方法中添加TimeUtil.now();,同样是500。

有相关的问题,但那些是关于分离的 eclipse 和 tomcat(通过用户代理端口),我只想从 eclipse 中使用它。将 eclipse 和 tomcat 分开,我只是将 jar 放在 tomcats 库旁边,例如“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

【问题讨论】:

    标签: java eclipse tomcat servlets


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      把你的罐子放进去

      WebContent/WEB-INF/lib

      文件夹而不是

      网页内容/WEB-INF

      正如tomcat文档所说:

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

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

      【讨论】:

      • 要知道,这不仅仅影响Tomcat,它是所有应用服务器的通用规则。
      • @LuiggiMendoza 是的,但是这个问题是针对 tomcat 的,所以我已经谈到了它并相应地提供了参考。感谢您的建议。
      • 另外,请注意 Tomcat 处于第 7 版(第 4 版已经快 10 年了)。同时更新您的资源。
      • 我在 WebContent/WEB-INF 下创建了一个文件夹 lib,这样 lib 就在文件夹 classes 和文件 web.xml 旁边,然后我将 kos.lib.jar 复制到 C:\dev\Java\ eclipse\workspace\web 示例 tomcat 6\WebContent\WEB-INF\lib,同样的错误。我误解了你的建议吗?请帮忙。现在需要在eclipse的运行时配置中进行一些设置吗?
      • 你需要把jar文件放到tomcat/webapp/yourapplication/WEB-INF/lib文件夹下。
      【解决方案3】:

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

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

      【讨论】:

      • 我这样做了,见下文。严重:为 servlet servlet1 java.lang.ClassNotFoundException: kos.lib.time.TimeUtil at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) 分配异常还需要什么?
      • @KosPetoussis 清理您的应用程序,重新构建并重新部署它。它应该工作。如果没有,请编辑您的问题并发布错误的堆栈跟踪。
      • 我已经清理过了。 Stacktrace 现在有问题。
      • @KosPetoussis 该错误非常具有描述性。您放置了 jar,但看起来您的 TimeUtil 类不在包 kos.lib.time 中。确保您的类在那里或从代码中的正确包中导入它。顺便说一句,最好从 Tomcat 中删除 Web 应用程序和临时文件,重新启动 Tomcat,然后重新部署应用程序。
      • Luiggi 如果 timeutil 不在包中 eclipse 会给出编译器错误,更不用说自动完成了。这是一个运行时错误。我从eclipse启动tomcat,那么它的临时文件在哪里?
      猜你喜欢
      • 2014-05-27
      • 2020-08-05
      • 1970-01-01
      • 2014-01-05
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      相关资源
      最近更新 更多