2016-04-11 14 views
9

Đôi khi một sửa đổi nhỏ đối với tệp nguồn Java như một số phôi bổ sung để giúp trình biên dịch có thể cải thiện thời gian biên dịch từ 4 phút xuống 3 giây cho một tệp java đơn lẻ (Đặc biệt là trong Java số 8).Thời gian mỗi tệp cần biên dịch với ant

Vấn đề là: Trong một dự án java lớn, làm thế nào để bạn tìm thấy tệp .java cụ thể nào đang biên dịch chậm?

Có cách nào để nhận Ant về thời gian cần để biên dịch từng tệp .java riêng lẻ không?

+0

Về lý thuyết, bạn có thể làm điều này với mục tiêu Ant tùy chỉnh bằng cách sử dụng JSR 199 (API trình biên dịch Java) để gọi trình biên dịch nhưng có vẻ như rất nhiều công việc. Có thể bạn chỉ cần nhìn vào dấu thời gian của các tập tin .class? – Pace

+0

Có thể. Sau đó, chỉ cần kiểm tra các đồng bằng giữa các ngày sửa đổi ?. Tôi tự hỏi nếu lệnh javac có thể được gói trong một tập tin thực thi mà thời gian cần để thực thi. Sau đó, chỉ nhận được kiến ​​để sử dụng cái gì khác hơn là javac. – clinux

+4

Vấn đề là javac không được gọi là một tập tin tại một thời điểm.javac không phải là một trình biên dịch gia tăng và do đó phải có trong mỗi tập tin cùng một lúc. Vì vậy, thời gian bao lâu javac mất là thực sự không có nhiều khác biệt hơn so với thời gian bao lâu toàn bộ biên soạn mất. – Pace

Trả lời

3

Tôi nghĩ rằng điều này có thể là có thể. Dưới đây là những gì tôi đã tìm thấy:

Nếu bạn đang sử dụng Java 8, bạn có thể đăng ký Plugin với trình biên dịch để thêm một số chức năng bổ sung trong quá trình biên dịch. Tài liệu có điều này để nói về các plugin:

Dự kiến ​​trình cắm thêm thông thường sẽ đăng ký TaskListener để được thông báo về các sự kiện trong quá trình thực hiện biên soạn và phần còn lại của tác phẩm sẽ là được thực hiện bởi người nghe nhiệm vụ.

Vì vậy, bạn có thể thiết lập plugin để sử dụng TaskListener và có dấu thời gian nhật ký công cụ người nghe khi lớp học được tạo.

package xyz; 
import com.sun.source.util.JavacTask; 
import com.sun.source.util.Plugin; 

public class TimestampPlugin implements Plugin { 


    @Override 
    public String getName() { 
     return "Timestamp_Plugin"; 
    } 

    @Override 
    public void init(JavacTask task, String... strings) { 
     task.setTaskListener(new FileTimestampListener()); 
    } 
} 

Documentation for TaskListener. Trình nghe công việc được chuyển qua một số TaskEvent, có số Kind. Trong trường hợp của bạn, có vẻ như bạn quan tâm đến thế hệ.

package xyz; 
import com.sun.source.util.TaskEvent; 
import com.sun.source.util.TaskListener; 

import java.util.HashMap; 

public class FileTimestampListener implements TaskListener { 
    HashMap<String, Long> timeStampMap = new HashMap<>(); 

    @Override 
    public void started(TaskEvent taskEvent) { 
     if(TaskEvent.Kind.GENERATE.equals(taskEvent.getKind())) { 
      String name = taskEvent.getSourceFile().getName(); 
      timeStampMap.put(name, System.currentTimeMillis()); 
     } 
    } 

    @Override 
    public void finished(TaskEvent taskEvent) { 
     if(TaskEvent.Kind.GENERATE.equals(taskEvent.getKind())) { 
      String name = taskEvent.getSourceFile().getName(); 
      System.out.println("Generated " + name + " over " + (System.currentTimeMillis() - timeStampMap.get(name)) + " milliseconds"); 
     } 
    } 
} 

Đây là ví dụ đơn giản nhưng cần phải đơn giản từ đây để thiết lập thứ gì đó như tệp nhật ký để lưu trữ thông tin được thu thập. Như bạn có thể thấy trong hàm init của plugin, các đối số có thể được chuyển tới Plugin từ dòng lệnh.

Plugin được định cấu hình bằng cách chỉ định plugin với đối số biên dịch -Xplugin. Tôi không chắc tại sao nhưng dường như không có bất kỳ tài liệu nào trên this page về nó, nhưng nó có thể được sử dụng bằng cách thiết lập một tệp có tên com.sun.source.util.Plugin (tên lớp FQ của giao diện để thực hiện) trong thư mục META-INF/services của bạn. Vì vậy:

META-INF 
|-- services 
    |-- com.sun.source.util.Plugin 

Và trong tệp đó liệt kê tên lớp FQ của việc bạn triển khai lớp này. Vì vậy, các nội dung tập tin sẽ là:

xyz.TimestampPlugin 

Trong nhiệm vụ Ant của bạn, bạn sẽ chỉ cần phải xác định một trình biên dịch cờ -Xplugin: Timestamp_Plugin (lưu ý đây là tên được cung cấp bởi getName của Plugin() chức năng). Bạn cũng sẽ cần phải cung cấp các Plugin phụ thuộc và thời gian chạy đã được biên dịch trên đường dẫn lớp hoặc đường dẫn bộ xử lý chú thích, nếu một quy tắc được chỉ định.

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