2016-04-15 9 views
9

मैं एक Gradle निर्माण कि अन्य बातों के अलावा शामिल उपयोग कर रहा हूँ:Gradle, rt.jar पहुँच प्रतिबंध

apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 

repositories { 
    flatDir { dirs "${System.env.JAVA_HOME}/jre/lib" } 
} 

dependencies { 
    compile name: 'rt' 
} 

यह बनाता है, तो बढ़िया है, फिर भी ग्रहण प्लगइन मुझे rt.jar पर एक कठिन समय दे रहा है कक्षाएं:

पहुँच प्रतिबंध: प्रकार XmlSerializer आवश्यक पुस्तकालय पर प्रतिबंध के कारण सुलभ नहीं है /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

जो मैं समझता हूं।

अब मुझे पता है कि आप मुझे उन वर्गों का उपयोग न करने के लिए कहेंगे। लेकिन आप जानते हैं कि यह कैसे है, मैं एक प्राचीन परियोजना पर काम कर रहा हूं और मुझे अभी इसे अभी काम करने की जरूरत है।

मेरा पहला सवाल यह है कि उस प्रतिबंध जानकारी कहां स्थित है?

और जाहिर है: मैं इसके आसपास कैसे हो सकता हूं? मैं इसे अपने नेक्सस रेपो पर एक आर्टिफैक्ट के रूप में अपलोड करने के बारे में सोच रहा हूं, उससे कुछ भी आसान है?

+2

वर्ग पर [पहुँच प्रतिबंध के संभावित डुप्लिकेट कारण पर प्रतिबंध के साथ काम किया आवश्यक पुस्तकालय rt.jar?] (http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

यह लिंक हो सकता है, लेकिन कैसे धीरे-धीरे कॉन्फ़िगर करें स्वचालित रूप से ऐसा करते हैं? – bananasplit

उत्तर

4

स्पष्टीकरण: Gradle में एक eclipse प्लगइन है कि Gradle मॉडल से ग्रहण कॉन्फ़िगरेशन पैदा करने के लिए व्यवहार को संशोधित करने के लिए अनुमति देता है। इस प्लगइन में classpath नामक एक उप-सेट-सुविधा है जिसे ग्रहण की .classpath फ़ाइल को संशोधित करने की अनुमति है।

कोड:

import org.gradle.plugins.ide.eclipse.model.AccessRule 

apply plugin: 'java' 
apply plugin: 'eclipse' 

eclipse { 
    classpath { 
     file { 
      whenMerged { 
       def jre = entries.find { it.path.contains 'org.eclipse.jdt.launching.JRE_CONTAINER' } 
       jre.accessRules.add(new AccessRule('0', 'com/**')) 
       jre.accessRules.add(new AccessRule('0', 'sun/**')) 
      } 
     } 
    } 
} 

से:https://discuss.gradle.org/t/buildship-1-0-18-is-now-available/19012 (अनुभाग "प्रवेश नियम")

पैरामीटर विस्तार से बताया:

  • '0' = सुलभ
  • '1' = nonaccessible
  • '2' = हतोत्साहित

मेरे व्यक्तिगत उपयोग इस तरह दिखता है:

eclipse.classpath { 
    file.whenMerged { 
     entries.each { source -> 
      if (source.kind == 'con' && source.path.startsWith('org.eclipse.jdt.launching.JRE_CONTAINER')) { 
       source.accessRules.add(new AccessRule('0', 'sun/applet/AppletAudioClip')) 
       source.accessRules.add(new AccessRule('0', 'javax/swing/**')) 
       source.accessRules.add(new AccessRule('0', 'com/sun/java/swing/**')) 
       source.accessRules.add(new AccessRule('0', 'javafx/**')) 
       source.accessRules.add(new AccessRule('0', 'sun/net/www/protocol/**')) 
      } 
     } 
    } 
} 

और उत्पादन यह है:

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"> 
    <accessrules> 
     <accessrule kind="accessible" pattern="sun/applet/AppletAudioClip"/> 
     <accessrule kind="accessible" pattern="javax/swing/**"/> 
     <accessrule kind="accessible" pattern="com/sun/java/swing/**"/> 
     <accessrule kind="accessible" pattern="javafx/**"/> 
     <accessrule kind="accessible" pattern="sun/net/www/protocol/**"/> 
    </accessrules> 
</classpathentry> 

परीक्षण &

  • ग्रहण संस्करण:: ऑक्सीजन रिलीज़ उम्मीदवार 3 (4.7.0 RC3)
  • Gradle संस्करण: Gradle 3.5.1
+2

एक्लिप्स लुना और ग्रेडल 4.0.2 के साथ, मुझे इसके बजाय लिखना पड़ा: jre.accessRules.add (नया एक्सेसरूल ('सुलभ', 'com/**')) – Matthias