2011-01-24 14 views
5

tôi có một dự án cmake trông giống như:Làm thế nào để bạn cấu hình cmake để chỉ xây dựng lại các tệp .java đã thay đổi trong một dự án java?

project(myProject JAVA) 
add_library(myLibrary foo.java bar.java) 

nhưng khi tôi chạy thực hiện trong các thư mục, tất cả các file java được xây dựng lại, ngay cả khi họ không thay đổi. Có cách nào để tắt hành vi đó không?

Xin cảm ơn,

+0

Tôi tò mò, tại sao sẽ xây dựng tất cả các tệp java là một vấn đề? Vấn đề gốc ở đây là gì? – jzd

+0

Xin lỗi, tôi không có câu trả lời cho câu hỏi của bạn, nhưng ...: tại sao bạn sử dụng cmake cho dự án Java của mình? Có các công cụ như Apache Ant và Apache Maven là các công cụ xây dựng tiêu chuẩn thực tế cho các dự án Java. – Jesper

+0

jzd - Về cơ bản, tôi đang đi vào khoảng 40 file java trong dự án này, và xây dựng lại nó mỗi khi tôi thực hiện một thay đổi đang trở thành tốn thời gian – PerilousApricot

Trả lời

5

add_library Hỗ trợ Java trong CMake không quá nóng. Nó bỏ qua chỉ thị "gói" và giả sử rằng "foo.java" tạo "foo.class" trong thư mục cơ sở, không phải trong một thư mục con com/example/ cho package com.example;.

Nếu bạn nhìn vào makefiles tạo ra trong CMakeFiles/<jar_file>.dir/build.make, nó có mã như thế này (dọn dẹp một chút)

CMakeFiles/test.dir/foo.class: ../foo.java 
    javac $(Java_FLAGS) /full/path/to/foo.java -d CMakeFiles/test.dir 

Đây là một sự phụ thuộc bị phá vỡ khi foo.java chứa "gói com.example;" ở trên cùng. Hãy hy vọng foo.class được tạo ra, khi nó không chạy và bạn chạy lại, nó sẽ biên dịch foo.java để xem có thể lần này nó sẽ hoạt động hay không. Tệp thực tế được tạo ra là trong com/example (may mắn được thêm vào tệp jar cuối cùng).

Tin tốt là mọi thứ đã được cải thiện gần đây. Trong phiên bản 2.8.6 của CMake, một mô-đun mới được thêm vào có tên là UseJava thực hiện công việc biên dịch các tệp Java tốt hơn và xây dựng lại chính xác khi có thay đổi. Thay vì sử dụng add_library, bạn cần sử dụng add_jar. Đây là một tập tin CMakeLists.txt mẫu hoàn chỉnh:

cmake_minimum_required(VERSION 2.8.6) 
find_package(Java) 
include(UseJava) 
project(java_test Java) 
set(SRC 
    src/com/example/test/Hello.java 
    src/com/example/test/Message.java 
) 
add_jar(hello ${SRC}) 

Điều đó sẽ tạo ra hello.jar từ các tệp nguồn đầu vào.

0

Tôi nghĩ câu trả lời của bạn là chỉ xây dựng toàn bộ dự án Java. Nếu bạn thay đổi một lớp và chỉ biên dịch lại nó, làm thế nào sẽ hiểu biết để biên dịch một lớp khác phụ thuộc vào nó. Điều gì xảy ra nếu bạn loại bỏ một phương thức trong một lớp mà những người khác phụ thuộc vào, bỏ qua việc biên dịch lại các lớp khác sẽ cho bạn các lỗi thời gian chạy thay vì một lỗi trình biên dịch.

Tuy nhiên, 40 tệp java là một số lượng nhỏ và có vẻ như chúng sẽ biên dịch trong vài giây trở xuống.

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