Gradle,rt.jar 访问限制

11

我正在使用一个包含其他内容的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类方面给了我很大的麻烦:

访问受限制:由于所需库/usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar的限制,类型XMLSerializer不可访问。

我理解这一点。

现在我知道你会告诉我只需不使用那些类即可。但你知道情况如何,我正在处理一个古老的项目,我只需要让它暂时工作。

我的第一个问题是:该限制信息位于何处?

当然还有:我该如何绕过它?我考虑将其上传为我的Nexus存储库上的工件,是否有更简单的方法?


2
它可能会被链接,但如何配置Gradle以自动执行此操作? - benji
1个回答

11

解释: Gradle中有一个Eclipse插件,允许从Gradle模型中修改生成Eclipse配置的行为。该插件有一个子功能称为“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(“Access Rules”部分)

参数解释:

  • '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版本:Oxygen Release Candidate 3 (4.7.0 RC3)
  • Gradle版本:Gradle 3.5.1

7
在使用Eclipse Luna和gradle 4.0.2时,我需要改写为:jre.accessRules.add(new AccessRule('accessible', 'com/**'))。 - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接