Gradle、rt.jar 访问限制

Posted

技术标签:

【中文标题】Gradle、rt.jar 访问限制【英文标题】:Gradle, rt.jar access restriction 【发布时间】:2016-08-06 18:56:07 【问题描述】:

我正在使用 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 存储库中,还有什么比这更容易的吗?

【问题讨论】:

Access restriction on class due to restriction on required library rt.jar?的可能重复 它可能是链接的,但是如何配置 gradle 来自动做到这一点? 【参考方案1】:

解释: 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(“访问规则”部分)

参数说明:

'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/">
    <acces-s-rules>
        <acces-s-rule kind="accessible" pattern="sun/applet/AppletAudioClip"/>
        <acces-s-rule kind="accessible" pattern="javax/swing/**"/>
        <acces-s-rule kind="accessible" pattern="com/sun/java/swing/**"/>
        <acces-s-rule kind="accessible" pattern="javafx/**"/>
        <acces-s-rule kind="accessible" pattern="sun/net/www/protocol/**"/>
    </acces-s-rules>
</classpathentry>

经过测试和使用:

Eclipse 版本:Oxygen Release Candidate 3 (4.7.0 RC3) Gradle 版本:Gradle 3.5.1

【讨论】:

使用 Eclipse Luna 和 gradle 4.0.2,我不得不改写:jre.accessRules.add(new AccessRule('accessible', 'com/**'))

以上是关于Gradle、rt.jar 访问限制的主要内容,如果未能解决你的问题,请参考以下文章

错误:访问限制:“数据源”类型不是 API(对所需库的限制 ..\rt.jar)[重复]

访问限制:“应用程序”类型不是 API(对所需库 rt.jar 的限制)

java创建框架时的错误,访问限制

java中import sun.misc.BASE64Decoder;提示如下错误请求解决方法

Java swing在Debian 9.2中不起作用

如何使用 IPTables 限制Ip访问