설정 - 새로운 메소드가 1.7의 javax.sql.CommonDataSource에 추가되었습니다.




예제 sample (4)

먼저 @Override 주석없이 요청 된 새 메소드를 추가하십시오.

새로운 메소드를 지원하고 싶지 않으면 SQLFeatureNotSupportedException을 던지십시오.

다른 DataSource를 래핑하고 6과 7을 지원하려면 리플렉션을 사용하여 메소드가 있으면 메소드를 호출하십시오.

자바 1.7에 대해 내 애플 리케이션을 컴파일하려고 노력했다. 거기에 새로운 메소드가 javax.sql.CommonDataSource (그리고 jsDataSource에서)에 추가 된 것을 발견했다. getParentLogger() . CommonDataSource:1.7CommonDataSource:1.6 비교할 수 있습니다 CommonDataSource:1.6

나를 위해이 변경 확실히 이전 버전과의 호환성을 깰. 예를 들어, 내 응용 프로그램 (DataSource의 구현 포함)은 코드 변경없이 1.7에 대해 컴파일하지 않습니다.

내 의견으로는,이 일을하는 것은 매우 강력한 이유가되어야합니다. 그러나 나는 심지어 하나도 할 수 없습니다. 누군가가이 변화의 추론을 설명 할 수 있습니까? 그것이 올바르게 다루어 져야하는 방법 - 나에게있어서 자바에 대한 역 호환성을 처음으로 만났기 때문에 여기에 "모범 사례"가 없다.


Java 7 용 응용 프로그램 컴파일을 지원할 준비가되지 않은 경우 Java 7 컴파일러를 사용하여 Java 1.6 용으로 계속 컴파일 할 수 있습니다. Java 1.6 런타임 환경 (또는 SDK)이 설치되어 있어야합니다. Java 7 컴파일러를 사용하여 스텁 된 DataSource 를 구현하는 MyDataSource.java 클래스를 컴파일하려고하면 다음이 표시 될 수 있습니다.

$ java -version 
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
$ javac -version
javac 1.7.0
$ javac MyDataSource.java 
MyDataSource.java:7: error: MyDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
public class MyDataSource implements DataSource {
       ^
1 error

Java 1.6 용으로 작성된 소스 파일을 사용하고 Java 1.6 바이트 코드를 생성하며 Java 1.6 런타임 JAR을 찾을 위치를 컴파일러에게 알려야합니다.

$ javac -source 1.6 -target 1.6 -bootclasspath <path to Java 1.6 JRE>/lib/rt.jar MyDataSource.java 
$ file MyDataSource.class 
MyDataSource.class: compiled Java class data, version 50.0 (Java 1.6)
$ javap MyDataSource
Compiled from "MyDataSource.java"
public class MyDataSource implements javax.sql.DataSource {
  public MyDataSource();
  public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
  public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
  public void setLoginTimeout(int) throws java.sql.SQLException;
  public int getLoginTimeout() throws java.sql.SQLException;
  public <T extends java/lang/Object> T unwrap(java.lang.Class<T>) throws java.sql.SQLException;
  public boolean isWrapperFor(java.lang.Class<?>) throws java.sql.SQLException;
  public java.sql.Connection getConnection() throws java.sql.SQLException;
  public java.sql.Connection getConnection(java.lang.String, java.lang.String) throws java.sql.SQLException;
}

이것을 처리하는 또 다른 방법은 PATH 및 JAVA_HOME의 환경 변수를 변경하는 것입니다

Mac에서이 문제를 해결하는 방법은 다음과 같습니다.

export JAVA_HOME = / System / Library / Frameworks / JavaVM.framework / Versions / 1.6.0 / Home

export PATH = / 시스템 / 라이브러리 / 프레임 워크 / JavaVM.framework / Versions / 1.6.0 / Home / bin / : $ PATH


해결 방법은 수퍼 클래스 메서드 오류를 재정의해야합니다. Java 1.6에서 Java 소스 버전을 변경해야합니다. @Override 주석을 인터페이스 메서드와 함께 사용할 수 있습니다. 소스 버전을 1.6으로 변경하려면 다음 단계를 따르십시오.

  1. 프로젝트를 선택하고 마우스 오른쪽 단추로 클릭 한 다음 속성을 클릭하십시오.
  2. Java 컴파일러를 선택하고 "프로젝트 별 설정 사용"확인란을 선택하십시오.
  3. 이제 컴파일러 준수 수준을 1.6으로 만듭니다.
  4. 변경 승인




java datasource