NamingException:无法使用 tomcat7-maven-plugin h2/mysql 数据库创建资源实例
Posted
技术标签:
【中文标题】NamingException:无法使用 tomcat7-maven-plugin h2/mysql 数据库创建资源实例【英文标题】:NamingException: Cannot create resource instance with tomcat7-maven-plugin h2/mysql database 【发布时间】:2014-12-23 13:23:10 【问题描述】:我正在尝试创建 maven Web 应用程序项目,该项目在打包时生成独立的可执行 jar,为此我正在使用 tomcat7-maven-plugin。最初的 hello world 类型的应用程序运行良好,但我正在努力使其与数据库一起使用。 这是我的 pom.xml 的样子:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<contextFile>src/main/resources/tomcat/context.xml</contextFile>
<path>/helloworld</path>
<enableNaming>true</enableNaming>
<finalName>standalone.jar</finalName>
<charset>utf-8</charset>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.183</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
src/main/webapp/WEB-INF/web.xml:
<web-app>
...
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.mycompany.test.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<resource-ref>
<description>H2 DS</description>
<res-ref-name>jdbc/H2DB</res-ref-name>
<res-type>org.apache.tomcat.jdbc.pool.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Mysql DS</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>org.apache.tomcat.jdbc.pool.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
...
</web-app>
src/main/resources/tomcat/context.xml
<Context path="/helloworld">
<Resource type="org.apache.tomcat.jdbc.pool.DataSource"
name="jdbc/H2DB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="org.h2.Driver"
url="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"
username="testuser"
password="testpassword"
initialSize="5"
maxActive="10"
maxIdle="5"
minIdle="2"
/>
<Resource name="jdbc/TestDB" auth="Container" type="org.apache.tomcat.jdbc.pool.DataSource"
url="jdbc:mysql://localhost:3306/testdb"
username="testuser"
password="testpassword"
driverClassName="com.mysql.jdbc.Driver"
initialSize="5"
maxActive="10"
maxIdle="5"
minIdle="2"
/>
</Context>
在我的 java 代码中我正在尝试:
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/TestDB");
或 java:/comp/env/jdbc/H2DB 用于 h2 数据库 当tomcat启动我的servlet时,两种方式我都会遇到同样的异常:
严重:Servlet /helloworld 抛出 load() 异常 javax.naming.NamingException:无法创建资源实例 在 org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:146) 在 javax.naming.spi.NamingManager.getObjectInstance(未知来源) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:843) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:154) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:831) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:154) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:831) ...
如有任何想法,我将不胜感激。 提前致谢。
【问题讨论】:
【参考方案1】:通过将 mysql-connector-java 添加到 tomcat7-maven-plugin 的配置来解决问题,如 here 所述。
【讨论】:
以上是关于NamingException:无法使用 tomcat7-maven-plugin h2/mysql 数据库创建资源实例的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat 8.0.15 Oracle 11 数据库和 jdbc javax.naming.NamingException
doGet() throws NamingException报错
在 ADAM 中,如果 admin 设置 pwdLastSet = 0 ,为啥响应控制为 NULL 尽管绑定抛出 NamingException?
NamingException with message: Name [spring.liveBeansView.mbeanDomain]
spring mvc 500错误Allocate exception for servlet AppService javax.naming.NamingException: Cannot creat