Lỗi JML: Tệp. Class dường như không đúng định dạng


0

Câu hỏi này ban đầu được đăng trên Stack Overflow và thay vào đó tôi được yêu cầu đăng nó ở đây.

Tôi là một Trợ lý Giảng dạy chuẩn bị một bài tập cho các học sinh của mình, để các em học JML và thiết kế theo hợp đồng. Tôi cung cấp cho họ 3 tệp: RArray.refines-java (một đặc tả với các xác nhận JML trống), RArray.java (lớp thực hiện thông số kỹ thuật trước đó) và TestRArray.java (một lớp kiểm tra).

Để thực hiện công việc, họ sẽ phải tính toán 3 lệnh:

  1. jmlc RArray.refines-java (tổng hợp các đặc điểm kỹ thuật và việc thực hiện)
  2. javac TestRArray.java (biên soạn lớp kiểm tra)
  3. jmlrac TestRArray (xác minh với trình kiểm tra xác nhận thời gian chạy jml)

Tuy nhiên, để làm được điều đó, họ phải cài đặt JML trên các máy tính ở trường, nơi rõ ràng không ai có quyền truy cập root. Tôi đã thử cài đặt nó trước, và có vẻ như nó không yêu cầu quyền truy cập root - Tôi đã làm theo hướng dẫn tiếng Pháp này , với tệp zip này .

Tôi đã thử trên máy tính xách tay Ubuntu 14.04 của mình, nó hoạt động rất tốt và tôi đã có thể quản lý một số kết quả cho bài tập. Ngay cả ở trường, trên Fedora, tôi có thể cài đặt các công cụ mà không có bất kỳ phàn nàn nào, và thêm chúng vào PATH. Nhưng, ở trường, tôi gặp lỗi khi chạy jmlc RArray.refines-java.

Đây là lỗi của tôi:

$ jmlc RArray.refines-java
parsing RArray.refines-java
parsing RArray1/RArray.java
typechecking RArray1/RArray.java
The .class file 'java/lang/CharSequence.class' appears to be malformed: Bad constant tag: 18
Fatal error - Unable to find a class for java/lang/CharSequence: error: Cannot find type "java.lang.CharSequence"

Tôi đã cố gắng tìm kiếm trước đây và có vẻ như đó là vấn đề trùng lặp CLASSPATH hoặc một cái gì đó trong các dòng đó, nhưng tôi không thể truy cập nó.

Tôi cũng đã cố tải xuống tệp ZIP một lần nữa, để xác minh xem lớp không đúng định dạng này có được sửa hay không, nhưng không gặp may.

Tôi đã cố gắng để chạy javac RArray.refines-java, và nó biên dịch như nó được yêu cầu, do đó nó phải là một vấn đề jml.

Đây là kết quả của java -version:

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

Đây là kết quả của jml -version:

Version: Common JML tools release 5.6_rc4 (Mar. 16, 2009)

Bạn có bất cứ ý tưởng về cách khắc phục điều này? Tôi hy vọng tôi sẽ không phải loại bỏ tất cả mọi thứ.

Câu trả lời:


0

Theo tôi biết, JML chỉ hoạt động trên java 1.7

Hãy thử thay đổi dự án của bạn thành java 1.7 và xem nó có hoạt động không. Cũng kiểm tra xem trình biên dịch của bạn không phải là phiên bản trên được hỗ trợ từ JML.

Đây là một số thông tin: [1]: http://jmlspecs.sourceforge.net/

@Biên tập

Tôi sử dụng JML với Eclipse và tôi cần chọn Java 7 vì nó sẽ tự động chuyển sang 8. Ngoài ra, nếu bạn đang biên dịch một lớp đơn giản với thiết bị đầu cuối, hãy thử lệnh sau khi biên dịch nó: $ javac -source 1.7 -target 1.7


Tôi sợ điều này. Tôi cho rằng điều này không thể được thực hiện mà không có quyền truy cập root? Đây phải là giải pháp, máy tính xách tay của tôi có java 1.7
Percelot

Dự án của bạn có được tạo bằng Java 7 không?
Felipe

đọc bản chỉnh sửa của tôi ở trên
Felipe

Khi chạy $javac -source 1.7 -target 1.7 RArray.java, tôi có một cảnh báo : bootstrap class path not set in conjunction with -source 1.7 1 warning. Làm thế nào để bạn sử dụng nó với Eclipse? Với OpenJML? Tôi không thể có nó hoạt động ngay cả với máy tính xách tay của tôi.
Percelot

Trong liên kết ở trên, nó cung cấp cho bạn lời giải thích về cách chạy nó với nhật thực. Vâng, nó sử dụng OpenJML. Bạn cần phải có một liên kết mà sau đó bạn sẽ thêm vào các bổ trợ nhật thực như tôi nhớ. Sau đó, bạn tạo một dự án với java 1.7 và kích hoạt JML trên dự án đó
Felipe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.