【问题标题】:Tomcat war deployed via IntelliJ IDEA 13 is returning error通过 IntelliJ IDEA 13 部署的 Tomcat 战争返回错误
【发布时间】:2014-10-29 17:51:22
【问题描述】:

在 IntelliJ 中部署我的第一个 WAR 文件时遇到以下错误。据推测,这是一个本地问题,因为这只是我们部署以测试我们的设置的 WAR 文件。

所有 80 个 Maven 测试都通过了,但是当我浏览到 Web 应用程序时,我收到了这个错误:

java.lang.IllegalArgumentException: javax.naming.NameNotFoundException: Name [jdbc/ipam] is not bound in this Context. Unable to find [jdbc].
    com.myapp1.ipam.rest.JaxRsApplication.<init>(JaxRsApplication.java:26)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1104)
    org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:902)
    org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:872)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:964)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:956)
    org.glassfish.jersey.server.ApplicationHandler.createApplication(ApplicationHandler.java:336)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:315)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:310)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

这似乎是问题所在:

    public JaxRsApplication() {
    DataSource datasource;
    try {
        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        datasource = (DataSource) envCtx.lookup("jdbc/ipam");
    } catch (NamingException e) {
        throw new IllegalArgumentException(e);
    }
    this.init(new SystemConfiguration(datasource));
}

这是我第一次使用 IntelliJ,而且我是 Java 新手,所以我不确定在这里做什么。

这里是 context-fragment.xml

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Resource name="jdbc/ipam"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
              auth="Container"
              type="javax.sql.DataSource"
              initialSize="2"
              maxActive="5"
              maxIdle="5"
              minIdle="1"
              maxWait="10000"
              removeAbandoned="true"
              removeAbandonedTimeout="60"
              logAbandoned="true"
              defaultReadOnly="false"
              username="**********"
              password="**********"
              driverClassName="org.postgresql.Driver"
              validationQuery="select 1"
              validationQueryTimeout="5"
              logValidationErrors="true"
              testOnBorrow="true"
              testWhileIdle="true"
              url="jdbc:postgresql://db1host/ipam_dev_table_here"/>
</Context>

【问题讨论】:

  • 你真的应该检查你的 context.xml 文件。您确定该资源已定义吗?
  • 谢谢,我编辑了我的帖子以显示 context-fragment.xml。我没有看到问题。
  • 确保正确加载 context-fragment.xml
  • @RichardChen 我对此文件进行了更改,所以也许就是这样。文件名是蓝色文本,而其他文件是黑色文本。我不确定如何检查它是否加载正确。
  • 我不确定,但是您可以尝试使用 jdbc_ipam 的资源名称?

标签: java tomcat intellij-idea


【解决方案1】:

确保您已设置 IntelliJ 以在启动 tomcat 时部署 context.xml 文件。你可以这样做

  1. 从“文件”菜单中选择“项目结构”

  2. 从那里选择“构面”选项。确保您已配置 Web 构面。如果没有,请添加一个。

  3. 添加 Web 构面后,选择“添加应用程序服务器特定描述符...”

  4. 从选项中选择 Tomcat 上下文描述符,然后单击确定。

默认情况下,IntelliJ 将指向 META-INF/context.xml。如果这不是上下文文件的位置,则需要编辑文件的路径。

【讨论】:

  • 感谢您的这篇文章。花了七个小时试图找到这些信息。
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 2018-08-30
  • 2013-11-27
  • 2017-07-23
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多