2016-04-15 14 views
9

Tôi đang sử dụng một Gradle xây dựng có chứa số những thứ khác:Gradle, rt.jar truy cập hạn chế

apply plugin: 'java' 
apply plugin: 'maven' 
apply plugin: 'eclipse' 

repositories { 
    flatDir { dirs "${System.env.JAVA_HOME}/jre/lib" } 
} 

dependencies { 
    compile name: 'rt' 
} 

Nó xây dựng, đó là tuyệt vời, nhưng các plugin Eclipse là đem lại cho tôi một thời gian khó khăn trên rt.jar lớp:

truy cập hạn chế: Các loại XMLSerializer không thể truy cập do hạn chế về thư viện cần /usr/local/apps/jdk1.8.0_11/jre/lib/rt.jar

Tôi hiểu điều đó.

Bây giờ tôi biết bạn sẽ bảo tôi không sử dụng các lớp đó. Nhưng bạn biết nó như thế nào, tôi đang làm việc trên một dự án cổ xưa và tôi chỉ cần làm cho nó hoạt động ngay bây giờ.

Câu hỏi đầu tiên của tôi là: thông tin hạn chế đó nằm ở đâu?

Và rõ ràng: Làm thế nào để tôi có thể vượt qua điều đó? Tôi đang nghĩ đến việc tải nó lên như một tạo phẩm trên repo Nexus của tôi, bất cứ điều gì dễ dàng hơn thế?

+2

có thể trùng lặp của [truy cập hạn chế trên lớp do hạn chế về thư viện bắt buộc rt.jar?] (http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-required-library-rt-jar) – Samuel

+2

nó có thể được liên kết, nhưng làm thế nào để cấu hình gradle để tự động làm điều đó? – bananasplit

Trả lời

4

Giải thích: Có một plugin eclipse cho phép sửa đổi hành vi tạo cấu hình nhật thực từ mô hình gradle. Plugin này có một tập hợp con được gọi là classpath cho phép sửa đổi tệp .classpath được tạo ra của nhật thực.

Code:

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/**')) 
      } 
     } 
    } 
} 

Từ:https://discuss.gradle.org/t/buildship-1-0-18-is-now-available/19012 (phần "Truy cập Rules")

thông số giải thích:

  • '0' = truy cập
  • '1' = nonaccessible
  • '2' = nản

sử dụng cá nhân của tôi trông như thế này:

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/**')) 
      } 
     } 
    } 
} 

Và kết quả là thế này:

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

Tested & làm việc với:

  • Eclipse Version: Oxy Release Candidate 3 (4.7.0 RC3)
  • Gradle Version: Gradle 3.5.1
+2

Với Eclipse Luna và gradle 4.0.2, tôi phải viết thay vào đó: jre.accessRules.add (new AccessRule ('accessible', 'com/**')) – Matthias

Các vấn đề liên quan