Gradle, ограничение доступа к rt.jar

Я использую сборку Gradle, которая, среди прочего, содержит:

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

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

dependencies {
  compile name: 'rt' 
}

Он строится, это здорово, но плагин eclipse доставляет мне трудности с классами rt.jar:

Ограничение доступа: тип XMLSerializer недоступен из-за ограничения на требуемую библиотеку /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

Что я понимаю.

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

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

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


person benji    schedule 15.04.2016    source источник
comment
он может быть связан, но как настроить Gradle, чтобы это происходило автоматически?   -  person benji    schedule 15.04.2016


Ответы (1)


Объяснение. В gradle есть eclipse плагин, который позволяет изменять поведение для генерации конфигураций eclipse из модели gradle. Этот плагин имеет одну функцию поднабора под названием classpath, позволяющую изменять сгенерированный .classpath файл eclipse.

Код:

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' = недоступен
  • '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>

Проверено и работало с:

  • Версия Eclipse: кандидат на выпуск кислорода 3 (4.7.0 RC3)
  • Версия Gradle: Gradle 3.5.1
person Frederic Leitenberger    schedule 06.04.2017
comment
В Eclipse Luna и gradle 4.0.2 мне пришлось вместо этого написать: jre.accessRules.add (new AccessRule ('available', 'com / **')) - person Matthias; 10.08.2017