2016-04-15 21 views
9

Sto usando un Gradle costruire che contiene tra le altre cose:Gradle, rt.jar restrizione di accesso

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

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

dependencies { 
    compile name: 'rt' 
} 

Esso si basa, che è grande, ma il plugin di Eclipse mi sta dando un momento difficile sul rt.jar classi:

restrizione di accesso: il tipo XMLSerializer non è accessibile a causa di restrizione libreria richiesta /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

Che capisco.

Ora so che mi dirai di non usare quelle lezioni. Ma sai com'è, sto lavorando a un progetto antico e ho solo bisogno di farlo funzionare per ora.

La mia prima domanda è: dove si trovano le informazioni di restrizione?

E ovviamente: come posso aggirarlo? Sto pensando di caricarlo come un artefatto sul mio repository Nexus, qualcosa di più semplice di così?

+2

Eventuali duplicati di [restrizione di accesso alla classe a causa di restrizione libreria richiesta rt.jar?] (http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

potrebbe essere collegato, ma come configurare gradle su farlo automaticamente? – bananasplit

risposta

4

Spiegazione: C'è un eclipse plugin nella Gradle che permette di modificare il comportamento per la generazione di configurazioni eclissi dal modello Gradle. Questo plug-in ha una funzione di sottoserie chiamata classpath che consente di modificare il file .classpath generato da eclissi.

Codice:

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

Da: ("Regole di accesso" nella sezione) https://discuss.gradle.org/t/buildship-1-0-18-is-now-available/19012

Parametri spiegato:

  • '0' = accessibile
  • '1' = nonaccessible
  • '2' = scoraggiati

mio uso personale si presenta così:

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

e l'uscita è questa:

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

Testato & lavorato con:

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

Con Eclipse Luna e gradle 4.0.2, ho dovuto scrivere invece: jre.accessRules.add (nuovo AccessRule ('accessibile', 'com/**')) – Matthias