尝试针对java 1.7编译我的应用程序我发现在javax.sql.CommonDataSource中添加了一个新方法(在j.s.DataSource中也是如此) - 。getParentLogger()
。您可以将CommonDataSource:1.7与CommonDataSource:1.6
对我而言,这一改变肯定会破坏向后兼容性。例如,我的应用程序(包含DataSource的实现)甚至不会在没有代码更改的情况下针对1.7进行编译。
根据我的观点,这应该是非常有力的理由 - 但我不能谷歌甚至一个。有人可以解释这种变化背后的原因吗?应该如何处理它 - 对我来说这是我第一次遇到与java的向后不兼容,所以我没有任何“最佳实践”......
答案 0 :(得分:7)
如果您还没准备好支持编译Java 7的应用程序,您仍然可以使用Java 7编译器编译Java 1.6。您将需要安装Java 1.6运行时环境(或SDK)。如果您尝试使用Java 7编译器编译实现存根MyDataSource.java
的{{1}}类,您可能会看到以下内容:
DataSource
您需要告诉编译器您要使用为Java 1.6编写的源文件,生成Java 1.6字节码以及在何处查找Java 1.6运行时JAR:
$ 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
答案 1 :(得分:6)
首先在没有@Override注释的情况下添加请求的新方法。
如果您不介意支持新方法,只需抛出SQLFeatureNotSupportedException。
如果要包装另一个DataSource并希望支持6和7,请使用反射调用方法(如果存在)。
答案 2 :(得分:0)
另一种处理此问题的方法是更改PATH和JAVA_HOME的环境变量
以下是在Mac上处理它的方法:
export JAVA_HOME = / System / Library / Frameworks / JavaVM.framework / Versions / 1.6.0 / Home
export PATH = / System / Library / Frameworks / JavaVM.framework / Versions / 1.6.0 / Home / bin /:$ PATH