2017-06-26 23 views
9

मैं जावा 9 के खिलाफ an open-source project बनाने की कोशिश कर रहा हूं। कुछ फाइलें हैं जिन्हें मुझे प्रतिबिंब का उपयोग करके एक्सेस करने की आवश्यकता है लेकिन मैं नहीं कर सकता क्योंकि पैकेज उनके मॉड्यूल द्वारा निर्यात नहीं किए जाते हैं। मैं --add-exports तर्कों का उपयोग करके अज्ञात मॉड्यूल में संकुल निर्यात करता हूं।जावा 9: अज्ञात मॉड्यूल में पैकेज निर्यात करना

मैं वातावरण चर _JAVA_OPTIONS के लिए निम्न तर्क जोड़ लिया है:

-Dsun.reflect.debugModuleAccessChecks=true 
--add-exports=javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED 
--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED 

मैं नवीनतम JDK 9 निर्माण का उपयोग कर रहा (आज तक): जब मैं कोशिश

C:\controlsfx>java -version 
java version "9" 
Java(TM) SE Runtime Environment (build 9+175) 
Java HotSpot(TM) 64-Bit Server VM (build 9+175, mixed mode) 

यहाँ उत्पादन होता है प्रोजेक्ट बनाने के लिए:

C:\controlsfx>.\gradlew :controlsfx:build 
Picked up _JAVA_OPTIONS: -Dsun.reflect.debugModuleAccessChecks=true --add-exports=javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED --add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED 
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations 
WARNING: All illegal access operations will be denied in a future release 
:controlsfx:compileJava 
C:\controlsfx\controlsfx\src\main\java\impl\org\controlsfx\behavior\SnapshotViewBehavior.java:60: error: package com.sun.javafx.scene.control.behavior is not visible 
import com.sun.javafx.scene.control.behavior.BehaviorBase; 
           ^
    (package com.sun.javafx.scene.control.behavior is declared in module javafx.controls, which does not export it to the unnamed module) 

C:\controlsfx\src\main\java\impl\org\controlsfx\ReflectionUtils.java:3: error: package com.sun.javafx.scene.traversal is not visible 
import com.sun.javafx.scene.traversal.ParentTraversalEngine; 
         ^
    (package com.sun.javafx.scene.traversal is declared in module javafx.graphics, which does not export it to the unnamed module) 

संकलन अभी भी विफल रहता है, जो मुझे जीतता है मैं क्या गलत कर रहा हूँ।

उत्तर

7

ऐसा लगता है कि आपके द्वारा जोड़े गए झंडे (जो सही हैं प्रतीत होते हैं) को कंपाइलर में जोड़ा नहीं जाता है लेकिन प्रक्रिया जो ग्रैडल चलाती है। इसका एक संकेत यह संदेश है जो आपको --illegal-access के बारे में सूचित करता है, जो केवल java पर उपलब्ध है, javac पर नहीं।

जावा 9 के साथ काम करते समय कभी-कभी सही जगहों पर तर्क प्राप्त करना मुश्किल हो सकता है। ग्रैडल this might help के लिए।

+1

इसके बारे में दिए गए लिंक यहाँ reproduced प्रासंगिक हिस्सा है करने के लिए अच्छा होगा - बाहरी साइटों ऑफ़लाइन जाने या अधिक उनकी संरचना को बदल सकते हैं समय –

+1

मुझे नहीं लगता कि ग्रैडल में इस जवाब का मुख्य भाग सही तरीके से कैसे सोचें - इसे फॉलो-अप के रूप में जोड़ा गया था। प्रासंगिक जानकारी यह है कि 'JAVA_OPTIONS' चाल नहीं करता है और तर्क सही जगहों पर लागू होने की आवश्यकता है। लेकिन शायद मैं गलत हूँ। अगर आपकी टिप्पणी कुछ अपवर्तित हो जाती है, तो मैं विवरण शामिल कर सकता हूं। – Nicolai

0

(नोट: मैं इस परियोजना को संकलित करने के लिए नहीं मिल सकता है, लेकिन सवाल में त्रुटियों (जैसे BehaviorBase) में से कुछ निम्नलिखित के साथ साफ कर रहे थे।)

JDK का उपयोग करते हुए 9 b175 और Gradle 4.1-milestone-1:

compileJava { 
    options.encoding = "UTF-8" 
    options.incremental = true 

    options.compilerArgs.addAll([ 
     "--add-exports", 
     "javafx.base/com.sun.javafx.event=ALL-UNNAMED" 
    ]) 
    options.compilerArgs.addAll([ 
     "--add-exports", 
     "javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED" 
    ]) 
    options.compilerArgs.addAll([ 
     "--add-exports", 
     "javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED" 
    ]) 
} 

और

sourceCompatibility = '9' 
targetCompatibility = '9' 
+0

आप सही हैं और @ निकोलाई के जवाब ने मुझे सही दिशा में पहले ही इंगित किया है। ** नोट: ** परियोजना को संकलित करने के लिए आपको उन झंडे से बहुत अधिक चाहिए;) – ItachiUchiha

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