2013-09-04 73 views
6

Tôi có ứng dụng web java sử dụng Spring, Hibernate, Tomcat7 & MySql. Tôi sử dụng Datasource cho các hoạt động cơ sở dữ liệu. Tôi không rõ lắm về vị trí tiêu chuẩn để tải các tệp jar (Tomcat-jdbc.jar & Mysql-connector.jar) từ đâu? Nó hoạt động nếu tôi giữ cả hai lọ trong số CATALINA_HOME/lib/ hoặc webapps/myApp/WEB-INF/lib. Nhưng tôi được yêu cầu chỉ sử dụng Tomcat-jdbc từ CATALINA_HOME/lib/và mysql-connector.jar từ /WEB-INF/lib/, cung cấp một ngoại lệ ClassNotFound cho Sql Driver. Ai đó có thể cho tôi biết đó là vị trí phù hợp cho các lọ này không?Tệp JAR của trình điều khiển JDBC ở đâu sẽ nằm trên triển khai Tomcat với nguồn dữ liệu?

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="${db.url}" /> 
     <property name="username" value="${db.username}" /> 
     <property name="password" value="${db.password}" /> 
     <property name="initialSize" value="${db.initialSize}" /> 
     <property name="minIdle" value="${db.minIdle}" /> 
     <property name="maxActive" value="${db.maxActive}" /> 
     <property name="maxIdle" value="${db.maxIdle}" /> 
     <property name="testWhileIdle" value="${db.testWhileIdle}" /> 
     <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}" /> 
     <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}" /> 
     <property name="validationQuery" value="${db.validationQuery}" /> 
    </bean> 
+0

Bạn có trình điều khiển MySQL trên đường dẫn lớp của mình không? – NickJ

+0

Có. /WEB-INF/lib/mysql-connector.jar – PeterGriffin

+0

Cũng đọc [Apache Tomcat 6.0 Class Loader HOW-TO] (https://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html) –

Trả lời

0

Khi nói đến vị trí của lọ sẽ được quyết định, quy tắc ngón tay cái là:

  1. Sử dụng một lọ trong máy chủ vị trí lib.
  2. Nếu bình không có sẵn, hãy đưa vào trong thư mục lib của ứng dụng.
  3. Để tìm một Chum phù hợp, hệ thống sẽ tìm trong các kho sau, theo thứ tự:

Bootstrap lớp của JVM của bạn

Hệ thống lớp lớp loader (mô tả ở trên)

/WEB-INF/lớp ứng dụng web của bạn /WEB-INF/lib/*.jar của

ứng dụng web của bạn $ CATALINA_HOME/common/classes

$ CATALINA_HOME/common/tán/*. Jar

$ CATALINA_HOME/common/i18n/*. Jar

$ CATALINA_HOME/common/lib/*. Jar

$ CATALINA_BASE/chia sẻ/lớp

$ CATALINA_BASE/chia sẻ/lib/*. jar

+0

Danh sách trong câu trả lời này đã lỗi thời như các phiên bản sau của Tomcat. Đối với Phiên bản 8.0, hãy xem [Hướng dẫn tải lớp học] (https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html) và [Câu trả lời này] (http://stackoverflow.com)/a/265552/642706) cho một câu hỏi tương tự. –

9

đó phụ thuộc vào ai đang quản lý nguồn dữ liệu.

Nếu bạn đang xây dựng và quản lý nguồn dữ liệu theo cách thủ công trong ứng dụng web của riêng mình như vậy new SomeDataSource(), v.v ... thì tệp JAR trình điều khiển JDBC có thể được đặt trong /WEB-INF/lib của webapp. Nhưng nếu máy chủ ứng dụng xảy ra để cung cấp cùng một tệp JAR trình điều khiển JDBC trong chính nó /lib, thì bạn cũng có thể sử dụng nó.

Tuy nhiên, nếu bạn hướng dẫn appserver để quản lý các nguồn dữ liệu tất cả của chính nó và bạn đang chỉ cách sử dụng nó trong webapp của bạn qua @Resource, vv, thì JDBC tệp trình điều khiển JAR phải được đặt trong appserver của riêng /lib , vì lý do rất đơn giản bởi vì nguồn dữ liệu được chuẩn bị trên khởi động của máy chủ hoàn toàn độc lập với bất kỳ ứng dụng web nào (được) triển khai. Nguồn dữ liệu này lần lượt có thể chia sẻ giữa tất cả các ứng dụng web. Về mặt kỹ thuật, nó sẽ không hoạt động nếu tệp JAR của trình điều khiển JDBC nằm trong một trong các ứng dụng web chưa được triển khai.

+0

Điều gì xảy ra nếu mỗi ứng dụng sử dụng các nhà cung cấp cơ sở dữ liệu khác nhau? – PeterGriffin

+2

Bạn chỉ có thể tạo nhiều nguồn dữ liệu. – BalusC

+0

FYI… Xem [câu trả lời hữu ích chi tiết này cũng bởi BalusC] (http://stackoverflow.com/a/2299870/642706) cho một câu hỏi tương tự. –