2016-04-15 11 views
9

ich, dass enthält unter anderem ein Gradle bauen bin mit:Gradle, rt.jar Zugriffsbeschränkung

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

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

dependencies { 
    compile name: 'rt' 
} 

Es baut, das ist toll, aber das Eclipse-Plugin mir eine harte Zeit auf der rt.jar schenkt Klassen:

Zugriffsbeschränkung: Der Typ XMLSerializer ist aufgrund Beschränkung auf benötigte Bibliothek /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

nicht zugänglich

Was ich verstehe.

Jetzt weiß ich, dass Sie mir sagen werden, diese Klassen nicht zu verwenden. Aber du weißt, wie es ist, ich arbeite an einem alten Projekt und ich muss es nur für den Moment arbeiten lassen.

Meine erste Frage ist: Wo befindet sich diese Einschränkung Info bei?

Und natürlich: Wie kann ich das umgehen? Ich denke darüber nach, es als Artefakt auf mein Nexus Repo hochzuladen, alles leichter als das?

+2

Mögliche Duplikat [Zugriffsbeschränkung Klasse aufgrund der Beschränkung auf Benötigte Bibliothek rt.jar?] (http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

es könnte verknüpft sein, aber wie zu konfigurieren Gradle zu mach das automatisch? – bananasplit

Antwort

4

Erläuterung: Es ist eine eclipse Plugin in gradle, die zur Erzeugung von Eclipse configs vom gradle Modell zur Veränderung des Verhaltens ermöglicht. Dieses Plugin hat ein Unter-Set-Feature namens classpath ermöglicht die Änderung der generierten .classpath Datei von Eclipse.

Code:

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/**')) 
      } 
     } 
    } 
} 

Von:https://discuss.gradle.org/t/buildship-1-0-18-is-now-available/19012 (siehe Abschnitt "Zugriffsregeln")

Parameter erklärt:

  • '0' = zugänglich
  • '1' = nonaccessible
  • '2' = entmutigt

Meine persönlichen Gebrauch wie folgt aussieht:

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/**')) 
      } 
     } 
    } 
} 

Und der Ausgang ist dies:

<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> 

Geprüft & mit bearbeitetem

  • Eclipse-Version: Oxygen Release Candidate 3 (4.7.0 RC3)
  • Gradle Version: Gradle 3.5.1
+2

Mit Eclipse Luna und Gradle 4.0.2 musste ich stattdessen schreiben: jre.accessRules.add (neue AccessRule ('accessible', 'com/**')) – Matthias