2014-02-17 3 views
0

spring jdbc 연결을 사용하여 postgres db에 연결하려고합니다. 그러나 응용 프로그램이 바람둥이에 배치 될 때 postgres 드라이버를 찾지 못하는 것 같습니다. intellij 클래스를 볼 수 있으며 내 외부 종속성 폴더에 나열되어 있지만 아아 ClassNotFoundException throw됩니다. 다음과 같이 heroku에서 maven과 Postgres 드라이버로드

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

<context:component-scan base-package="com.planit.mvc.*"/> 

<mvc:resources mapping="/resources/**" location="/resources/"/> 
<!--https://github.com/priyatam/springmvc-bootstrap-showcase/tree/master/src/main/webapp base resources off this.--> 
<mvc:annotation-driven/> 

<mvc:view-controller path="/" view-name="hello"/> 


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/pages/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

<!-- DB CONNECTION --> 
<bean class="java.net.URI" id="dbUrl"> 
    <constructor-arg value="#{T(com.ProjectUtils).getDBUrl()}"/> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="#{ 'jdbc:postgresql://' + @dbUrl.getHost() + ':' + @dbUrl.getPort() + @dbUrl.getPath() }"/> 
    <property name="username" value="#{ @dbUrl.getUserInfo().split(':')[0] }"/> 
    <property name="password" value="#{ @dbUrl.getUserInfo().split(':')[1] }"/> 
</bean> 




<util:properties id="socialAuthProperties" location="/WEB-INF/oauth_consumer.properties"></util:properties> 

<bean id="socialAuthConfig" class="org.brickred.socialauth.SocialAuthConfig"> 
    <property name="applicationProperties"> 
     <ref bean="socialAuthProperties"/> 
    </property> 
</bean> 

<bean id="socialAuthManager" class="org.brickred.socialauth.SocialAuthManager" scope="session"> 
    <property name="socialAuthConfig"> 
     <ref bean="socialAuthConfig"/> 
    </property> 
    <aop:scoped-proxy/> 
</bean> 

<bean id="socialAuthTemplate" class="org.brickred.socialauth.spring.bean.SocialAuthTemplate" scope="session"> 
    <aop:scoped-proxy/> 
</bean> 


<bean id="socialAuthWebController" class="org.brickred.socialauth.spring.controller.SocialAuthWebController"> 
    <constructor-arg value="#{T(com.ProjectUtils).getBaseUrl()}"/> 
    <constructor-arg value="authSuccess"/> 
    <constructor-arg value="jsp/accessDenied.jsp"/> 
</bean> 


<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5"/> 
    <property name="maxPoolSize" value="10"/> 
    <property name="WaitForTasksToCompleteOnShutdown" value="true"/> 
</bean> 

그리고 내 POM이다. 그것을 인 IntelliJ에서 빌드시

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>com.springapp</groupId> 
<artifactId>planit-dev</artifactId> 
<packaging>pom</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>planit-dev</name> 

<properties> 
    <spring.version>4.0.0.RELEASE</spring.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>4.0.0.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
     <scope>provided</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${spring.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.2</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

    <dependency> 
     <groupId>org.brickred</groupId> 
     <artifactId>socialauth</artifactId> 
     <version>4.3</version> 
    </dependency> 

    <dependency> 
     <groupId>org.brickred</groupId> 
     <artifactId>socialauth-spring</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <dependency> 
     <groupId>com.restfb</groupId> 
     <artifactId>restfb</artifactId> 
     <version>1.6.12</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.apis</groupId> 
     <artifactId>google-api-services-calendar</artifactId> 
     <version>v3-rev73-1.17.0-rc</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.oauth-client</groupId> 
     <artifactId>google-oauth-client</artifactId> 
     <version>1.17.0-rc</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.oauth-client</groupId> 
     <artifactId>google-oauth-client-servlet</artifactId> 
     <version>1.17.0-rc</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.http-client</groupId> 
     <artifactId>google-http-client-jackson2</artifactId> 
     <version>1.15.0-rc</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.3.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>r09</version> 
    </dependency> 

    <dependency> 
     <groupId>org.optaplanner</groupId> 
     <artifactId>optaplanner-core</artifactId> 
     <version>6.0.1.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.3-1100-jdbc41</version> 
    </dependency> 




</dependencies> 

<build> 

    <finalName>planit-dev</finalName> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
        <include>**/*Tests.java</include> 
       </includes> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals><goal>copy</goal></goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>com.github.jsimone</groupId> 
           <artifactId>webapp-runner</artifactId> 
           <version>7.0.40.0</version> 
           <destFileName>webapp-runner.jar</destFileName> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
항아리는 WEB-INF 디렉토리 아래에있는 libs와 폴더에 존재하지 않는 것 같다, 내가 Class.forName을 호출 ("org.postgresql.Driver"); 예외가 발견되지 않는 클래스를 얻습니다.

어떻게 이것을 메이븐과 올바르게 추가 할 수 있습니까?

도움을 주시면 감사하겠습니다.

편집 :이 또한 내가 방금 추가 한 봄 JDBC의 의존성으로 일어나는 표시

.

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.jdbc.datasource.DriverManagerDataSource] for bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.DriverManagerDataSource 
org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1327) 

maven 출력 폴더에도 없습니다.

이것은 heroku에 배포되므로 생각하지 않는 libs 폴더를 만들 수 없습니다!

드라이버는 $ TOMCAT_HOME/lib에 대신 WEB-INF의 WAR/LIB 내에 배치되도록, 상기 POM에 드라이버 의존성 provided 설정해야 필요

답변

1

필자는 POM에서 패키징 유형을 어떻게 든 바꿀 수 있었던 것으로 나타났습니다. 다시 변경하면 라이브러리가 war 파일에 성공적으로 추가되었습니다!

<packaging>war</packaging> 
1

다음 일반적

<dependency> 
    <groupId>org.postgresql</groupId> 
    <artifactId>postgresql</artifactId> 
    <version>9.3-1100-jdbc41</version> 
    <scope>provided</scope> 
</dependency> 

을 JDBC 드라이버는 항상 응용 프로그램이 아닌 서버 수준에 설치해야합니다. 그 이유는 드라이버가 처음 JVM 클래스의 레벨에서 싱글 톤으로 초기화되고 여러 WAR에 배치하면 메모리 누수가 발생하기 때문입니다.

톰캣이이 상황을 감지하여 메모리 누수를 방지하면서 드라이버를 등록 해제하고 있지만 제대로 초기화되지 않았을 수도 있습니다. 자세한 내용은 answer을보십시오.

+0

이실제로에게 Heroku에 배치되고, 그래서 어떻게 그 보상 할 수 있습니까? – user1089599

+0

그러면 heroku는 기본적으로 PostgreSQL을 선택하거나 온라인 콘솔의 일부 구성을 통해 서버에서 드라이버를 사용할 수 있도록 설정해야합니다. https://devcenter.heroku.com/articles/heroku-postgresql –

+0

해당 가이드를 참조하십시오. 나의 주머니가 그것을 가이드와 같은 방법으로 수입하는 것처럼 나는 실제로 문제를 얻는다. – user1089599

0

저는 프로젝트에서 spring과 postgresql을 사용하고 있습니다.다음은 몇 가지 조각 : 이 (PS : 나는 수동으로 어딘가에 PostgreSQL의 드라이버를 넣어 경우 기억할 수) (전쟁과 같은 받는다는 패키지)

MAVEN

... 
<properties> 
    <postgresql.version>9.2-1003-jdbc4</postgresql.version> 
</properties> 
... 

<dependencies> 
    <!--PostgreSQL driver--> 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>${postgresql.version}</version> 
    </dependency> 
... 

SPRING의 CONFIG 문맥

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="au.com.xxx.core.modules.*.persistence"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false"/> 
      <property name="generateDdl" value="false"/> 
      <property name="database" value="POSTGRESQL"/> 
     </bean> 
    </property> 
</bean> 

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/> 
    </bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

톰캣 문맥

<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource" 
      username="myuser" password="secret" 
      url="jdbc:postgresql://172.16.1.2:5432/db_name" 
      driverClassName="org.postgresql.Driver" 
      initialSize="5" maxWait="5000" 
      maxActive="120" maxIdle="5" 
      validationQuery="select 1" 
      poolPreparedStatements="true"/> 

<ResourceLink name="jdbc/DatabaseName" 
       global="jdbc/DatabaseName" 
       type="javax.sql.DataSource"/> 

관련 문제