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 的限制)