2015-05-18 37 views
15

Tôi gặp sự cố với thư viện Reflections. Tôi đang cố tải động tất cả các lớp thực hiện giao diện cụ thể. Mọi thứ hoạt động tốt (tất cả các lớp được nạp) miễn là tôi không sử dụng biểu thức lambda trong các lớp này (java 8). Tôi đã thử nâng cấp phiên bản lib nhưng hiệu ứng lại giống nhau (java.io.IOException: loại hằng số không hợp lệ: 18).Phản ánh - Java 8 - loại hằng số không hợp lệ

phụ thuộc và xây dựng trong pom.xml

 <dependency> 
     <groupId>org.reflections</groupId> 
     <artifactId>reflections</artifactId> 
     <version>0.9.10</version> 
     <exclusions> 
      <exclusion> 
       <groupId>javassist</groupId> 
       <artifactId>javassist</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.19.0-GA</version> 
    </dependency> 
    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 

mà không loại trừ là tác dụng tương tự.

Code:

URL jarUrl = jarFile.toURI().toURL(); 
    URLClassLoader child = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader()); 
    ConfigurationBuilder builder = new ConfigurationBuilder() 
      .addClassLoader(child) 
      .addUrls(jarUrl) 
      .setScanners(new SubTypesScanner()); 
    Reflections r = new Reflections(builder); 
    return r.getSubTypesOf(cls); 

Làm thế nào tôi có thể tải các lớp học với biểu thức lambda?

Tái bút: Xin lỗi vì tiếng Anh :)

+0

Bản sao có thể có của [Lỗi tạo entityManagerFactory do lỗi buộc phải quét ] (http://stackoverflow.com/questions/24281235/error-creating-entitymanagerfactory-due-to-error-tying-to-scan-jar -file) –

Trả lời

29

Nếu bạn nhìn vào this table, bạn sẽ thấy rằng “hằng số loại: 18” dùng để chỉ CONSTANT_InvokeDynamic thuộc tính mà giá trị của thẻ là 18.

Vì vậy, bạn đang sử dụng thư viện có trình phân tích cú pháp lớp không tương thích với Java 8. Trên thực tế, trình phân tích cú pháp lớp này thậm chí không tương thích với Java 7 vì giá trị hằng số này được xác định từ Java 7. Nó chỉ có điều đó khi mã Java bình thường không sử dụng tính năng này trong Java 7. Nhưng khi tương tác với mã được tạo ra bởi ngôn ngữ lập trình cho JVM, nó thậm chí có thể thất bại với Java 7.

an item in the bug tracker of Reflections mô tả vấn đề của bạn. Ở dưới cùng, bạn sẽ thấy thông báo:

Với sửa lỗi này: https://issues.jboss.org/browse/JASSIST-174 javassist có hỗ trợ cho hằng số này. Vì vậy, với 3.18.2-GA lỗi này không xảy ra.

+2

Tôi đã thấy giải pháp này nhưng tôi đã sử dụng phiên bản mới nhất của các thư viện này.Cuối cùng, tôi đã loại bỏ lib phản chiếu và đã viết phản chiếu riêng cho các loại lớp con với lib lib. Cảm ơn bạn đã trả lời. – Lukasz

+1

Cùng một vấn đề ở đây: Tôi có các phiên bản khác nhau của javassist trong 3 khung (HikariCP, Orika và Swagger-jaxrs) và Maven chọn phiên bản cũ nhất là độ phân giải tự động (3.16-1.-GA thay vì phiên bản mới nhất 3.19.0-GA) – Tristan

+1

javassist cũng có trong powermock – jediz

3

Tôi vừa khắc phục sự cố tương tự ở đây. Trong trường hợp của tôi, có ware hai lọ javassist trên classpath của tôi. Tôi sử dụng maven và nó được cho là để tránh điều đó, nhưng một trong những phụ thuộc đã sử dụng một nhóm khác nhauId (javassist cho cái cũ và org.javassist cho cái mới, được nhập bởi org.reflections), vì vậy maven xử lý chúng như các tạo phẩm khác nhau.

Tôi vừa thay đổi thư viện tùy thuộc vào thư viện cũ phụ thuộc vào thư viện mới và mọi thứ đều được sửa!

-2

Tôi gặp vấn đề này vì vậy tôi đã hạ cấp tạm thời từ jdk, XUẤT KHẨU JAVA_HOME = "/ home/user/jdk1.7.0_55" và mọi thứ hoạt động tốt.

+1

Bạn nên xem xét tất cả các hạn chế trong câu hỏi ban đầu, việc hạ cấp không thực sự là vấn đề đối với bất kỳ vấn đề nào. – BrunoJCM

0

Nếu bạn sử dụng weblogic, nó có thể xung đột với các thư viện đã được tải bởi trình nạp lớp của nó. Bạn có thể ghi đè chúng bằng cách đặt

... 
<weblogic-web-app> 
    <container-descriptor> 
     <prefer-application-packages> 
      <package-name>javassist.*</package-name> 
... 

trong tệp cấu hình weblogic.xml của dự án web của bạn. Lưu ý gói java thực chỉ là javassist, không phải org.javassist (maven groupId).

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