2017-06-19 18 views
7

Mam starszego kodu C++, który jest zbudowany przy użyciu CMake. Generuje plik .so. Muszę zawinąć ten kod w Javie i zbudować jar, który zawiera kod java, a także C++ do wdrożenia.Budowanie C++ i kodu Java przy użyciu CMake i Maven i pakowanie w słoju

Kroki na budowę kodu C++ z CMake jest prosta:

cd /to/pkg/dir 
cmake . 
make 

plik .so jest generowany na podstawie kompilacji/katalogu. Jeśli skonwertuję cały projekt na maven, będę musiał zmodyfikować strukturę katalogów (tutaj jest blog wyjaśniający, jak to może działać http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/). Jednak nie chcę tego robić. Czy może istnieć opcja wywołania pierwszych dwóch linii pokazanych powyżej z pliku maven, aby skompilować plik .so, a następnie dołączyć go do finalnego słoika? Z góry dzięki.

Odpowiedz

7

W Apache Hadoop kompilacja robi coś podobnego do opisanego. Korzystamy z Apache Maven AntRun Plugin podczas fazy kompilacji, aby wykonać połączenie zewnętrzne z cmake, a następnie wywołać make na wyjściu kompilacji wygenerowanym przez CMake, aby skompilować i połączyć część C naszej bazy kodowej. Dane wyjściowe są następnie przesyłane do naszych ostatecznych artefaktów kompilacji. W naszym przypadku te artefakty kompilacji są raczej paczkami, a nie pakowane bezpośrednio do pliku JAR, ale można to osiągnąć, kontrolując konfigurację Apache Maven JAR Plugin. W szczególności może być konieczne zastąpienie treści include/exclude settings.

Jeśli chcesz użyć go jako punktu wyjścia, odpowiednia część kompilacji Hadoop jest widoczny tutaj:

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

Dzięki za kursorem. –

+0

Jestem w stanie uruchomić cmake build from maven zgodnie z pomysłem wysłanym przez @Chris Nauroth. Nadal nie ma problemu z łączeniem plików klas java z .so. –

+0

@Santanu czy próbowałeś spakować swój kod C++ za pomocą swig? następnie owinąć "swig/JNI/.so/..." w artefakt maven? –