2010-02-20 34 views
6

Tôi đang sử dụng kiến ​​1.8.0 và java 1.6.0.17 và tôi đang gặp sự cố lạ.lỗi kiến ​​Không thể đổi tên tệp cũ thành tệp tạm thời

Trong build.xml tôi, tôi có một nhiệm vụ đơn giản mà biên dịch mã

<javac destdir="${dir.build.classes}" debug="on"> 
    <classpath refid="classpath"/> 
    <src path="${dir.src.java}"/> 
</javac> 

Trong "classpath" là một jar, gọi nó là library.jar

Trong một nhiệm vụ sau, tôi cần phải thêm một vài lớp học để library.jar, mà tôi làm như thế này

<jar destfile="library.jar" update="true" duplicate="fail"> 
    <fileset dir="${dir.build.classes}"> 
     <include name="some/class/files"/> 
    </fileset> 
</jar> 

này sẽ thất bại với lỗi Unable to rename old file (library.jar) to temporary file

Tôi bị kẹt trong một cuộc gọi đến handle.exe trước và sau cuộc gọi javac, và tôi có thể xác nhận rằng quá trình java chạy ant lấy một tập tin xử lý để library.jar trong cuộc gọi javac, và nó không cho nó lên. Điều này gây ra nỗ lực sau này của tôi để cập nhật các jar để thất bại.

Tại sao kiến ​​sẽ giữ tay cầm vào bình trong đường dẫn lớp mở ngay cả sau khi tác vụ javac hoàn tất?

Trả lời

3

Vì vậy, tôi đã tìm thấy câu trả lời, sau một số thử nghiệm. Bằng cách thêm fork="true" vào nhiệm vụ javac của tôi, xử lý tệp được đóng vào cuối tác vụ. Điều này cho phép sửa đổi jar của tôi để thành công sau này trong xây dựng.

Thật không may, vì tôi phải nhớ thêm điều này vào mọi tác vụ javac ngược dòng.

3

Đây là sự cố về khóa cửa sổ. Bất kỳ quá trình/thread đọc tập tin sẽ ngăn chặn nó được đổi tên, đó là những gì công việc zip đang làm, khi cập nhật một tập tin jar hiện có.

Tôi đoán rằng trình xử lý tệp đang được mở vì bạn sử dụng tham chiếu classpath. Có lẽ các tập tin xử lý có thể bị đóng nếu bạn đã thiết lập rõ ràng classpath của nhiệm vụ javac?

+0

Bạn có thể giải thích ý bạn bằng cách "đặt rõ ràng classpath của nhiệm vụ javac" không? Đó là một bộ khá lớn các lọ được sử dụng ở một số nơi khác, vì vậy mã hóa cứng chúng không thực sự là một lựa chọn, và tôi không chắc tại sao nó lại tạo nên sự khác biệt. – karoberts

0

Có vẻ như liên quan đến cấu hình classpath và thao tác đầu tiên trên tệp jar giữ cho nó được mở. Tôi đã giải quyết vấn đề này bằng cách xóa "." từ biến classpath env của tôi.

1

Có lỗi được gửi cho cùng một vấn đề chính xác here.

Họ đang nói rằng điều này được khắc phục trong phiên bản Ant 1.8

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