2013-02-20 1 views
3

Microsoft SQL Server 데이터베이스 에서 데이터를 가져와이를 MySQL 데이터베이스에 푸시하는 프로젝트를 clojure로 빌드하려고합니다.MySQL 및 SQLServer를 사용하는 프로젝트에 대한 uberjar 만들기

이 프로젝트는 lein 실행을 사용하여 잘 실행,하지만 난 leiningen를 사용 uberjar 로 패키지 및 Java -jar을 사용하여 실행하면 실패 : 스레드 "주요"자바

예외입니다. sql.SQLException : JDBC에 대한 찾을 수 없습니다 적합 드라이버 : SQLSERVER .... 내가 MySQL 데이터베이스와 SQL Server 데이터베이스를 모두 사용하려고 할 때

에만이 오류가 발생합니다. 그 중 하나만 사용하는 경우 jar 파일 은 java -jar를 사용하여 정상적으로 실행됩니다. 다음과 같이

내 project.clj은 다음과 같습니다

(defproject sqlserver-clojure "1.0.0-SNAPSHOT" 
    :description "A minimal example of the MySQL/SQLServer conflict" 
    :dependencies [[org.clojure/clojure "1.4.0"] 
      [com.microsoft/sqljdbc4 "3.0"] 
      [clojureql "1.0.4"] 
      [mysql/mysql-connector-java "5.1.6"]] 
    :main sqlserverclojure.core) 
+3

우버 - 항아리는 악마입니다. 'META-INF'에서 특정 자원이나 항목을 복사하지 않거나 악화 시키십시오 (예 : META-INF/services/java.sql.Driver가 다른 내용을 가진 모든 JDBC 4 호환 드라이버에 있음) –

+0

JDBC를 사용하기 전에 응용 프로그램의 어딘가에서'Class.forName ("driver.class.Name")'을 사용하여 JDBC 드라이버를로드하는 "클래식"메소드로 항상 넘어갑니다. 또는 DriverManager.getConnection() 대신에'DataSource' 객체를 사용할 수 있습니다. – millimoose

+0

@millimoose'META-INF/services/java.sql.드라이버 '는 단지 예일뿐입니다. 예를 들어, 다른 필수 리소스가 복사되지 않았기 때문에 드라이버의로드가 여전히 실패 할 수 있습니다 (클래식 메소드 또는 데이터 소스를 사용하는 경우에도) –

답변

2

문제는 동네 짱 항아리를 만들 때, 당신은 몇 가지 파일을 복사하지 않는 것이 대부분이다 (예를 들어 .properties 또는 XML 설정)에 의해 필요 드라이버를 사용하거나 두 JDBC 드라이버에있는 파일을 겹쳐 쓰는 경우.

덮어 쓰기의 좋은 예는 모든 JDBC 4 드라이버에있는 META-INF/services/java.sql.Driver 파일입니다. 이 파일은 java.sqlDriverManager 클래스가 ServiceLoader을 사용하여 모든 드라이버 구현을 자동으로로드 할 수 있도록 java.sql.Driver을 구현하는 jar의 모든 클래스 목록을 포함합니다.

여러 개의 JDBC 드라이버로 uber-jar를 만드는 경우이 파일에이 모든 파일의 합집합이 포함되어 있는지 확인하거나 응용 프로그램에서 필요한 드라이버를 명시 적으로로드해야합니다 (각 드라이버에 대해 Class.forName("<name of the java.sql.Driver implementation>")). JDBC 4 드라이버 자동 로딩에 의존하지 않습니다.

또한 uber-jar를 만드는 데 사용하는 프로세스가이면서 .class 파일이 아닌 모든 리소스를 복사하는지 확인하십시오! 아직

더 나은는 (제 생각에), 동네 짱 - 항아리를 사용하지만, 종속 .jar 외부 파일을 유지하고 응용 프로그램의 META-INF/MANIFEST.MF 파일의 Class-Path 항목에서 그들을 참조하지 않는, 이것은 당신에게 번거 로움을 많이 절약 uber-jar가 올바르게 작동하게하거나 실제로 제대로 작동하는지 확인하십시오.

+0

위대한 설명 ...하지만 향후 버전의 lein에서 수정할 수 있습니까? (심지어 고칠 수 있습니까?) – joefromct

+0

@joefromct 가장 간단한 해결책은 uber-jar를 만들지 않고 매니페스트에서 필요한 라이브러리를 참조하는 것입니다. 라이브러리를 하나의 병으로 병합 할 때 이러한 모든 문제를 해결하는 솔루션이 있는지 나는 알지 못합니다. 왜냐하면 결코 그렇게하지 않기 때문입니다. 대체로 병합 할 수없는 동일한 이름을 가진 구성 파일을 제외하고 기술적으로 병합의 이러한 문제를 해결할 수 있습니다. –

1

이전에 Java를 사용하지 않았고 Java interop으로 고생 했으므로이 내용을 직접 참조하십시오.

당신의 JDBC Clojure의 함수 호출과 네임 스페이스에서

(. Class (forName "com.microsoft.sqlserver.jdbc.SQLServerDriver")) 

를 추가합니다.