2017-06-19 7 views
7

में बंडल मेरे पास एक विरासत सी ++ कोड है जो सीएमके का उपयोग करके बनाया गया है। यह एक .so फ़ाइल उत्पन्न करता है। मुझे जावा में इस कोड को लपेटने और एक जार बनाने की आवश्यकता है जिसमें जावा कोड के साथ-साथ तैनाती के लिए सी ++ शामिल है। CMake के साथ सी ++ कोड के निर्माण के लिएसीएमके और मेवेन का उपयोग करके सी ++ और जावा कोड बिल्डिंग एक जार

कदम सरल है:

cd /to/pkg/dir 
cmake . 
make 

.so फ़ाइल निर्माण/डायरेक्टरी में उत्पन्न होता है। अगर मैं पूरी परियोजना को मैवेन में परिवर्तित करता हूं, तो मुझे निर्देशिका संरचना को संशोधित करना होगा (यहां एक ब्लॉग है जो बताता है कि यह http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/ कैसे काम कर सकता है)। हालांकि, मैं ऐसा नहीं करना चाहता। क्या मैवेन से ऊपर दिखाए गए पहले दो लाइनों को कॉल करने का विकल्प हो सकता है। इसलिए फ़ाइल और फिर इसे अंतिम जार के साथ शामिल करें? अग्रिम धन्यवाद।

उत्तर

7

अपाचे हैडोप में, निर्माण आपके द्वारा वर्णित कुछ जैसा ही करता है। हम संकलन चरण के दौरान Apache Maven AntRun Plugin का उपयोग cmake पर बाहरी कॉल करने के लिए करते हैं और फिर हमारे कोडबेस के सी भाग को संकलित और लिंक करने के लिए सीएमके द्वारा उत्पन्न बिल्ड आउटपुट पर make पर कॉल करें। यह आउटपुट तब हमारे अंतिम निर्माण कलाकृतियों में फ़ीड करता है। हमारे मामले में, वे निर्माण कलाकृतियों को सीधे एक जार फ़ाइल में बंडल करने के बजाय टैरबॉल होते हैं, लेकिन आप Apache Maven JAR Plugin की कॉन्फ़िगरेशन को नियंत्रित करके इसे पूरा कर सकते हैं। विशेष रूप से, आपको सामग्री include/exclude settings को ओवरराइड करने की आवश्यकता हो सकती है।

आप एक प्रारंभिक बिंदु के रूप में उपयोग करना चाहते हैं तो, Hadoop निर्माण की प्रासंगिकता का यहाँ दिख रहा है:

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

सूचक के लिए धन्यवाद। –

+0

मैं @ क्रिस नौरोथ द्वारा पोस्ट किए गए विचार के बाद मेवेन से सेमेक बिल्ड चलाने में सक्षम हूं। अभी भी कोई भी भाग्य जावा क्लास फाइलों के साथ बंडल नहीं कर रहा है। –

+0

@ सैंटनु ने स्विंग का उपयोग करके अपने सी ++ कोड को बंडल करने का प्रयास किया था? फिर एक मेवेन आर्टिफैक्ट में "स्विग/जेएनआई/.so/..." लपेटें? –

संबंधित मुद्दे