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.
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
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
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