当前位置: 首页 > 知识库问答 >
问题:

Gradle,rt.jar访问限制

端木震博
2023-03-14

我正在使用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回购上,还有比这更简单的吗?

共有1个答案

阎咏思
2023-03-14

说明:gradle中有一个eclipse插件,允许修改从gradle模型生成eclipse配置的行为。该插件有一个名为classpath的子集功能,允许修改生成的. classpatheclipse文件。

代码:

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'=可访问

我个人的用法是这样的:

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版本:氧气释放候选3(4.7.0 RC3)
 类似资料:
  • 问题内容: 我在尝试在Eclipse中进行编译的某些Java代码遇到了一些麻烦。我不断收到以下警告… 从这行代码… 我已经找到解决方法,但是我担心限制警告。这段代码是针对我的开源项目(CfTracker)的,如果我要破坏某种许可协议,我不想解决此限制。谁能帮我理解这一点? 问题答案: 这不是许可协议的问题。只是Eclipse试图保护您避免使用不是正式JDK API一部分(而是Oracle / Su

  • 问题内容: 这是代码: 这是错误: eclipse says this: 访问限制:类型“应用程序”不是API(对所需库“ /Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”的限制) 问题答案: 这也发生在我身上,这里给出的答案已经不令人满意,所以我做了自己的研究。 背景:Eclipse 访

  • 问题内容: 我试图在不重新创建存根的情况下编译由IBM的WSDL2Java在Java5上创建的Java 1.4代码,并在Eclipse中看到此错误。我的假设是,只要运行时jar可用(它们存在),生成的存根就应该编译。 完整的班级名称是 这到底是怎么回事?这是我要用香肠重构猪的情况吗?我最好重新创建存根吗? 问题答案: 还有另一个解决方案,也可以。 转到项目属性中的“ 构建路径”设置。 删除JRE系

  • 代码如下: eclipse是这样说的: 访问限制:类型“Application”不是API(对所需库“/library/java/javavirtualmachines/jdk1.8.0_11.jdk/contents/home/jre/lib/rt.jar”的限制)

  • 问题内容: 我试图在不重新创建存根的情况下编译由IBM的WSDL2Java在Java5上创建的Java 1.4代码,并在Eclipse中看到此错误。 我假设生成的存根应该只要运行时可用就可以编译。 jars 完整的班级名称是 javax.xml.namespace.QName 这到底是怎么回事?这是我要用香肠重构猪的情况吗?我最好重新创建存根吗? 问题答案: 还有另一个解决方案,也可以。 1, 转

  • 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: >>> bart = Student('Bart Simpson', 98) >>> bart.score 98 >>> bart.score = 59 >>> bart.sc