2017-06-19 14 views
7

Tôi có một mã C++ kế thừa được xây dựng bằng CMake. Nó tạo ra một tập tin .so. Tôi cần bọc mã này trong Java và xây dựng một jar chứa mã java cũng như C++ để triển khai.Xây dựng C++ và mã Java bằng CMake và Maven và gói trong một cái bình

Các bước để xây dựng C++ với CMake rất đơn giản:

cd /to/pkg/dir 
cmake . 
make 

File .so được tạo ra dưới một build/thư mục. Nếu tôi chuyển đổi toàn bộ dự án thành maven, tôi sẽ phải sửa đổi cấu trúc thư mục (đây là một blog giải thích cách làm việc đó có thể hoạt động http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/). Tuy nhiên, tôi không muốn làm điều đó. Có thể có một tùy chọn để gọi hai dòng đầu tiên được hiển thị ở trên từ maven để xây dựng .so tập tin và sau đó bao gồm nó với jar cuối cùng? Cảm ơn trước.

Trả lời

7

Trong Apache Hadoop, công trình xây dựng thực hiện điều gì đó tương tự như những gì bạn mô tả. Chúng tôi sử dụng Apache Maven AntRun Plugin trong giai đoạn biên dịch để thực hiện cuộc gọi bên ngoài tới cmake và sau đó gọi make trên đầu ra xây dựng được tạo bởi CMake để biên dịch và liên kết phần C của codebase của chúng tôi. Đầu ra này sau đó nạp vào các tạo phẩm xây dựng cuối cùng của chúng ta. Trong trường hợp của chúng ta, các tạo phẩm dựng sẵn đó là các tệp tarballs chứ không phải gói trực tiếp vào tệp jar, nhưng bạn có thể thực hiện nó bằng cách kiểm soát cấu hình của Apache Maven JAR Plugin. Cụ thể, bạn có thể cần phải ghi đè nội dung include/exclude settings.

Nếu bạn muốn sử dụng nó như là một điểm khởi đầu, phần liên quan của việc xây dựng Hadoop có thể nhìn thấy ở đây:

https://github.com/apache/hadoop/blob/release-2.7.3-RC2/hadoop-common-project/hadoop-common/pom.xml#L598-L615

<execution> 
    <id>make</id> 
    <phase>compile</phase> 
    <goals><goal>run</goal></goals> 
    <configuration> 
    <target> 
     <exec executable="cmake" dir="${project.build.directory}/native" failonerror="true"> 
     <arg line="${basedir}/src/ -DGENERATED_JAVAH=${project.build.directory}/native/javah -DJVM_ARCH_DATA_MODEL=${sun.arch.data.model} -DREQUIRE_BZIP2=${require.bzip2} -DREQUIRE_SNAPPY=${require.snappy} -DCUSTOM_SNAPPY_PREFIX=${snappy.prefix} -DCUSTOM_SNAPPY_LIB=${snappy.lib} -DCUSTOM_SNAPPY_INCLUDE=${snappy.include} -DREQUIRE_OPENSSL=${require.openssl} -DCUSTOM_OPENSSL_PREFIX=${openssl.prefix} -DCUSTOM_OPENSSL_LIB=${openssl.lib} -DCUSTOM_OPENSSL_INCLUDE=${openssl.include} -DEXTRA_LIBHADOOP_RPATH=${extra.libhadoop.rpath}"/> 
     </exec> 
     <exec executable="make" dir="${project.build.directory}/native" failonerror="true"> 
     <arg line="VERBOSE=1"/> 
     </exec> 
     <!-- The second make is a workaround for HADOOP-9215. It can 
      be removed when version 2.6 of cmake is no longer supported . --> 
     <exec executable="make" dir="${project.build.directory}/native" failonerror="true"></exec> 
    </target> 
    </configuration> 
</execution> 
+0

Cảm ơn các con trỏ. –

+0

Tôi có thể chạy cmake xây dựng từ maven theo ý tưởng được đăng bởi @Chris Nauroth. Vẫn không may mắn khi gộp các tệp lớp java với .so. –

+0

@Santanu bạn đã cố gắng gói mã C++ của bạn bằng cách sử dụng swig? sau đó quấn "swig/JNI/.so/..." trong một tạo tác maven? –

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