2016-04-15 2 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

Который я понимаю.

Теперь я знаю, что вы скажете мне, что просто не используйте эти классы. Но вы знаете, как это, я работаю над древним проектом, и мне просто нужно заставить его работать.

Мой первый вопрос: где эта информация о ограничении расположена на?

И, очевидно: как я могу обойти это? Я собираюсь загрузить его как артефакт на моем Nexus repo, что-нибудь более простое?

+2

Возможный дубликат [Ограничение доступа по классу из-за ограничений на нужна библиотека rt.jar?] (http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

он может быть связан, но как настроить gradle to сделать это автоматически? – bananasplit

ответ

4

Пояснение: Существует eclipse плагин в Gradle, что позволяет модифицировать поведение для генерации затмения конфиги из Gradle модели. Этот плагин имеет одну функцию поднабора, называемую classpath, позволяющую модифицировать созданный файл eclipse .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> 

Испытано & работал с:

  • Затмение Версия: Oxygen Release Candidate 3 (4.7.0 RC3)
  • Gradle Версия: Gradle 3.5.1
+2

С Eclipse Luna и gradle 4.0.2 мне пришлось написать вместо этого: jre.accessRules.add (новый AccessRule ('Доступно', 'com/**')) – Matthias

 Смежные вопросы

  • Нет связанных вопросов^_^