2011-12-14 12 views
23

जावा ऐप के खिलाफ अपना ऐप संकलित करने का प्रयास कर रहा है। मैंने पाया कि javax.sql.CommonDataSource (और इसलिए js.s.DataSource में) में एक नई विधि क्या जोड़ा गया था -। getParentLogger()। आप CommonDataSource:1.7 की तुलना CommonDataSource:1.6नई विधि javax.sql.CommonDataSource में 1.7

मेरे लिए यह परिवर्तन निश्चित रूप से पिछड़े संगतता को तोड़ देता है। उदाहरण के लिए, मेरा ऐप (जिसमें डेटासोर्स के कार्यान्वयन शामिल हैं) भी कोड में बदलाव किए बिना 1.7 के खिलाफ संकलित नहीं करता है।

मेरी राय से, यह करने के लिए यह बहुत मजबूत कारण होना चाहिए - लेकिन मैं भी एक Google को नहीं कर सकता। क्या कोई इस बदलाव के पीछे तर्क की व्याख्या कर सकता है? इसे सही तरीके से कैसे निपटाना है - मेरे लिए यह पहली बार है कि मैंने जावा के साथ पिछड़ी असंगतता से मुलाकात की है, इसलिए मेरे पास कोई "सर्वोत्तम प्रथाएं" नहीं है ...

+1

यह पहली बार नहीं है। यह तब होता है जब वे जेडीबीसी अपडेट करते हैं। मैं मानता हूं कि यह एक अच्छा बात नहीं है (टीएम)। उदाहरण के लिए कई ड्राइवरों को इसके कारण अलग-अलग संस्करणों को बनाए रखने की आवश्यकता है। यह एक दर्द है, लेकिन इसका परिणाम केवल त्रुटियों को संकलित करना चाहिए, न कि रनटाइम त्रुटियों में (यानी आप जेडीके 6 के लिए बना सकते हैं और अभी भी इसे जेडीके 7 के खिलाफ चला सकते हैं)। – Thilo

+2

जेडीबीसी इंटरफेस अतीत में पिछड़े-असंगत कई बार (विधियों को जोड़कर) बन गए हैं। आप अपनी कक्षाओं में अतिरिक्त विधियों को जोड़ने में सक्षम होना चाहिए, और उन्हें पूर्व-1.7 वातावरण में बिना किसी समस्या के काम करना चाहिए। –

+0

एचएम ... क्या यह बाइनरी संगतता को तोड़ता नहीं है? मेरा मतलब है - डीएस के मेरे कार्यान्वयन को पुराने डीएस के खिलाफ संकलित किया गया था, बिना किसी नई विधि के जोड़ा गया - यह बाइनरी असंगत परिवर्तन प्रतीत होता है, है ना? – BegemoT

उत्तर

6

यदि आप तैयार नहीं हैं जावा 7 के लिए अपने आवेदन को संकलित करने के लिए, आप अभी भी जावा 7 कंपाइलर का उपयोग कर जावा 1.6 के लिए संकलित कर सकते हैं। आपको जावा 1.6 रनटाइम पर्यावरण (या एसडीके) स्थापित करने की आवश्यकता होगी। यदि आप एक MyDataSource.java वर्ग है कि एक टोंटदार DataSource लागू करता है एक जावा 7 संकलक का उपयोग कर संकलन की कोशिश, तो आप निम्न देख सकते हैं:

$ 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 के लिए लिखा स्रोत फ़ाइलों का उपयोग करना चाहते बताने के लिए की जरूरत है, का उत्पादन जावा 1.6 बाईटकोड और जहां जावा 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; 
} 
+2

यदि आपका कोड जावा 7 पर चलता है तो यह उड़ा नहीं होगा? –

5

पहले @Override एनोटेशन बिना अनुरोध नई विधि (रों) जोड़ें।

यदि आपको नए तरीकों का समर्थन करने में कोई फर्क नहीं पड़ता है तो बस SQLFeatureNotSupportedException को फेंक दें।

यदि आप एक और डेटासोर्स लपेट रहे हैं और 6 और 7 का समर्थन करना चाहते हैं, तो वे मौजूद होने पर विधियों को कॉल करने के लिए प्रतिबिंब का उपयोग करें। JAVA_HOME =/सिस्टम/लाइब्रेरी/फ़्रेमवर्क

निर्यात/JavaVM.framework:

0

एक और तरीका है इस संभाल करने के लिए पथ और JAVA_HOME

यहाँ मैक पर इससे निपटने के लिए तरीका है की वातावरण चर बदलने के लिए है /Versions/1.6.0/Home

निर्यात पथ =/सिस्टम/लाइब्रेरी/Frameworks/JavaVM.framework/संस्करण/1.6.0/होम/bin /: $ पथ

संबंधित मुद्दे