java - Gradle、rt.jar访问限制

标签 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 类上遇到了困难:

Access restriction: The type XMLSerializer is not accessible due to restriction on required library /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

我明白了。

现在我知道你会告诉我不要使用这些类。但你知道这是怎么回事,我正在开发一个古老的项目,我现在只需要让它发挥作用。

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

显然:我该如何解决这个问题?我正在考虑将其作为工件上传到我的 Nexus 存储库上,还有比这更简单的吗?

最佳答案

说明: 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/">
    <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

关于java - Gradle、rt.jar访问限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36636345/

相关文章:

gradle - 如何从具有依赖关系的任务执行另一个任务

batch-file - gradle:执行任务 "type:Exec",其中包含许多带空格的参数

gradle - 将Gradle缓存复制到脱机系统中的问题

eclipse - 如何开始使用 STS 和 Gradle

java - 如何检查移动数据连接并为其设置事件?

java - Maven 网络资源问题

java - 为什么两个线程计算速度比一个慢?

java - CompletableFuture 跨微服务(JVM)

java - Gradle 构建成功但失败

gradle - 无效的类路径发布/导出依赖项/ouat-contract。不支持项目条目