Gradle,rt.jar访问限制

时间:2016-04-15 00:30:40

标签: java gradle gradle-eclipse

我正在使用包含其他内容的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仓库上的工件上传,比这更容易吗?

1 个答案:

答案 0 :(得分:5)

<强>说明: 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(&#34;访问规则&#34;

参数说明:

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

经测试&amp;使用过:

  • Eclipse版本:氧气释放候选者3(4.7.0 RC3)
  • Gradle版本:Gradle 3.5.1