2016-04-15 39 views
9

Gradleでは、rt.jarのアクセス制限

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必要なライブラリ 上 制限にアクセスできません210

私はそれを理解しています。

今、あなたは私がそれらのクラスを使わないように教えてくれることを知っています。しかし、あなたはそれがどのようなものかを知っています。私は古代のプロジェクトに取り組んでいます。

私の最初の質問は次のとおりです。その制限情報はどこにありますか?

明らかに、どうすれば回避できますか?私はNexusのレポにアーティファクトとしてアップロードすることを考えています。それより簡単なものは何ですか?

+2

可能な重複で働いていました必要なライブラリrt.jar?](http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

リンクされている可能性がありますが、どのようにgradleを設定するのですかそれは自動的に行うのですか? – bananasplit

答えて

4

説明: Gradleのモデルから日食のconfigsを生成するための動作を変更することができますのGradleでeclipseプラグインがあります。 このプラグインにはclasspathという1つのサブセット機能があり、生成された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' =アクセス
  • 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> 
    

    & 10 = nonaccessible

  • '2' =は私の個人的な使用法は次のようになります

を落胆しました

  • Eclipseのバージョン:酸素リリース候補3(4.7.0 RC3)
  • Gradleのバージョン:上の制約のために、クラスの[アクセス制限のGradleの3.5.1
+2

Eclipse Lunaとgradle 4.0.2では、代わりにjre.accessRules.add(新しいAccessRule( 'accessible'、 'com/**'))を記述する必要がありました。 – Matthias

関連する問題