कई src निर्देशिकाओं के साथ मावेन संकलन


194

वहाँ एक एकल मावेन परियोजना में कई जावा स्रोत निर्देशिकाओं को संकलित करने का एक तरीका है?

जवाबों:


278

आप बिल्ड-हेल्पर के साथ एक नया स्रोत निर्देशिका जोड़ सकते हैं:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>src/main/generated</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2
इस दृष्टिकोण के साथ एकमात्र मुद्दा यह है कि अंतिम विरूपण साक्ष्य में जावा स्रोत फाइलें (जेजा फाइलें) भी शामिल हैं। क्या स्रोत फ़ाइलों को बाहर करने और केवल .class फ़ाइलों को शामिल करने का एक तरीका है?
सरवण_ पी सी

17
सिर्फ दूसरों (मेरे जैसे), के लिए एक नोट pluginतत्व में है /project/build/pluginsऔर नहीं में/project/build/pluginManagement/plugins
Betlista

3
यदि आप ग्रहण का उपयोग कर रहे हैं, तो आप m2e connector for build-helper-maven-pluginpom.xml में त्रुटि को दूर करने के लिए ग्रहण बाज़ार से स्थापित करना चाह सकते हैं
मरना

1
यदि आपको चेतावनी मिलती है जैसे 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingआपको <plugin>टैग के भीतर जोड़ने की आवश्यकता है<version>1.12</version>
अल्फा

4
ऐसा करने का सबसे अच्छा तरीका 2017 में, XML पास्ता बनाना था। क्या किसी को इसके साथ कोई समस्या नहीं दिखती है?
टॉम

55

मैं भोलेपन से इसे इस प्रकार करता हूं:

<build>
  <finalName>osmwse</finalName>
  <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
</build>

2
मेरे लिए काम किया :) ग्रहण हालांकि यह पसंद नहीं है। ऐसा लगता है कि "src / main / java, src / interfaces" एक एकल src है, और इसलिए इसे (लापता) के रूप में चिह्नित करता है।
जोएल

1
मेरे लिए, इससे मावेन 3.2.2 को कोई स्रोत नहीं मिला।
user149408

40

इसने मेरे लिए काम किया

<build>
    <sourceDirectory>.</sourceDirectory>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
        <includes>
            <include>src/main/java/**/*.java</include>
            <include>src/main2/java/**/*.java</include>
        </includes>
        </configuration>
        </plugin>
    </plugins>
</build>

18
ऐसा अच्छा विचार नहीं है IMHO, क्योंकि कई प्लगइन्स मान लेते हैं sourceDirectory- और संभवतः अतिरिक्त sources- स्रोत फ़ाइलों की जड़ों के रूप में। आपके समाधान में, maven-compiler-pluginइन वास्तविक जड़ों से अवगत एकमात्र प्लगइन है।
लॉरेंट पीरिन

3
@ Laurent तुम उसके बारे में सही हो। यह कुछ साल पहले एक अच्छा विचार था लेकिन अब बहुत बेहतर विकल्प हैं। ऊपर सूचीबद्ध बिल्ड-हेल्पर मेरे पसंदीदा विकल्प हैं।
साल

5
यह इसे प्रोजेक्ट मॉडल में नहीं जोड़ता है, इसलिए यह आईडीई में सही ढंग से काम नहीं करेगा।
डेविड फिलिप्स

+1 @sal ने WAR प्रोजेक्ट डिपेंडेंसी के साथ एक आकर्षण की तरह काम किया।
एटीओरास

1
यह काम नहीं कर सकता है अगर मैं एक बाहरी स्रोत निर्देशिका (जावा वर्ग जिसमें मैं अपने मावेन प्रोजेक्ट का उपयोग कर रहा हूं) को शामिल करना चाहता हूं। क्या होगा यदि मेरा बाहरी स्रोत मेरे ग्रहण के कार्यक्षेत्र के बाहर स्थित है? मैं क्या कर सकता हूँ?
एरॉक्स

16

इसे इंटेलीजे में काम करने के लिए, आप भी जोड़ सकते हैं

<generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>

maven- संकलक-प्लगइन के लिए


जोड़ना चाहेंगे कि यह ग्रहण में काम किया और साथ ही परियोजना विन्यास में स्रोत स्थान के रूप में उत्पन्न स्रोतों को जोड़ने के लिए।
एडम हॉक्स

2
यह पथ एनोटेशन प्रोसेसर द्वारा उत्पन्न स्रोतों के लिए प्रतीत होता है, हालांकि। यहां तक ​​कि अगर यह काम करता है, तो यह संभव है कि इस पथ को कुछ प्लगइन्स द्वारा अलग तरीके से संभाला जाए। उदाहरण के लिए, मुझे उम्मीद है कि 'क्लीन' चलाने पर यह डायरेक्टरी डिलीट हो सकती है।
केपेक्स

2
आपने इसे कहाँ डाल दिया था ?
पावेल निडोबा

10

यह संसाधन टैग को परिभाषित करके मावेन के साथ भी काम करता है। आप अपने src फोल्डर के नाम जो भी चाहें पसंद कर सकते हैं।

    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/generated</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

8
maven.apache.org/pom.html#Resources ->Resources are not (usually) code. They are not compiled
SJuan76

4

इसने मावेन 3.5.4 के साथ काम किया और अब Intellij Idea इस कोड को स्रोत के रूप में देखते हैं:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>                    
            </configuration>
        </plugin>

2

पोस्ट से बिल्ड-हेल्पर-मावेन-प्लगइन का उपयोग किया - और src / main / generate किया। और mvan क्लीन कंपाइल मेरे ../common/src/main/java, या on ../common पर काम करता है, इसलिए बाद में रखा गया। फिर, यह पुष्टि करते हुए कि संकलन के IntelliJ IDEA (10.5.2.2) स्तर डेविड फिलिप्स के रूप में उल्लेख किया गया था। मुद्दा यह था कि IDEA ने परियोजना में कोई अन्य स्रोत रूट नहीं जोड़ा था। इसे मैन्युअल रूप से जोड़ने से समस्या हल हो गई। यह अच्छा नहीं है क्योंकि प्रोजेक्ट में कुछ भी एडिटिंग मावेन से होनी चाहिए न कि आइडिया के प्रोजेक्ट ऑप्शंस के डायरेक्ट एडिटिंग से। फिर भी मैं इसके साथ तभी तक रह पाऊंगा जब तक वे बिल्ड-हेल्पर-मावेन-प्लगइन का सीधे समर्थन नहीं करते हैं, जैसे कि यह स्रोतों को ऑटो करेगा।

हालांकि इस काम को करने के लिए एक और समाधान की आवश्यकता है। चूंकि हर बार एक बदलाव के बाद IDEA ने मावेन सेटिंग्स को फिर से इम्पोर्ट किया था, इसलिए मुझे नए जोड़े गए स्रोत को मॉड्यूल पर रखा गया था, फिर भी यह खो गया यह सोर्स फोल्डर्स सेलेक्शन था और बेकार था। तो IDEA के लिए - इन्हें एक बार सेट करने की आवश्यकता है:

  • चयन करें - परियोजना सेटिंग्स / मावेन / आयात / स्रोत और reimport पर परीक्षण फ़ोल्डर रखें।
  • जोड़ें - प्रोजेक्ट संरचना / परियोजना सेटिंग्स / मॉड्यूल / {मॉड्यूल} / स्रोत / सामग्री रूट जोड़ें।

अब आयात पर उन फ़ोल्डरों को रखना दुनिया में सबसे अच्छा अभ्यास नहीं है, ..., लेकिन यह एक कोशिश दे रहा है।


न तो विकल्प इंटेलीज आइडिया 9.0.4 के साथ काम करता है जो कि मैं उपयोग करता हूं। हाल के ग्रहण के साथ बिल्ड-हेल्पर विकल्पों की कोशिश नहीं की है, लेकिन जब मैंने इसे आज़माया तो 3.4 और एम 2 प्लगइन के साथ काम नहीं किया। मावेन को कई स्रोत पेड़ या एक ही परियोजना से निर्मित कई कलाकृतियां पसंद नहीं हैं, जो इस सीमा के आसपास प्राप्त करने का कोई भी प्रयास आमतौर पर एक भयानक हैक है।
साल

अब कई वर्षों से IntelliJ पर हैं। और कभी भी ग्रहण करने के लिए स्विच नहीं किया गया, इसलिए इसके लिए बात नहीं कर सकते हैं, तो यह सुनना आम तौर पर बहुत अच्छा है। IntelliJ के लिए हर दूसरे साल एक व्यक्तिगत लाइसेंस अपग्रेड करना $ 100 / वर्ष है। नए प्रमुख संस्करण आम तौर पर हर साल जनवरी में निकलते हैं। फिर पिछले वर्ष के आखिरी 2-3 महीनों में वे आपको पिछले संस्करण को खरीदने और आगामी एक मुफ्त में अपग्रेड प्राप्त करने की अनुमति दे रहे हैं। यह अभी है इसलिए यह 10 खरीदने और 11. पाने का "सुरक्षित" समय है। इसके अलावा, यदि आपको जेएसपी और अन्य उद्यम सुविधाओं की आवश्यकता नहीं है, तो मुफ्त सामुदायिक संस्करण का उपयोग करें।
arntg

2

जबकि evokk से उत्तर मूल रूप से सही है, यह परीक्षण कक्षाएं गायब हैं । आपको लक्ष्य ऐड-टेस्ट-स्रोत के साथ परीक्षण कक्षाएं जोड़ना होगा :

                        <execution>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-test-source</goal>
                            </goals>
                            <configuration>
                                <sources>
                                    <source>target/generated/some-test-classes</source>
                                </sources>
                            </configuration>
                        </execution>

1

यह दो चरणों में किया जा सकता है:

  • प्रत्येक स्रोत निर्देशिका के लिए आपको स्वयं मॉड्यूल बनाना चाहिए।
  • सभी मॉड्यूल में आपको समान बिल्ड निर्देशिका निर्दिष्ट करनी चाहिए: ${build.directory}

यदि आप जेट्टी ( jetty:run) शुरू करने के साथ काम करते हैं , तो किसी भी मॉड्यूल में किसी भी वर्ग के पुनर्मूल्यांकन (मावेन, आईडीईए या ग्रहण के साथ) जेटी के पुनरारंभ को बढ़ावा देगा। एक ही व्यवहार आपको संशोधित संसाधनों के लिए मिलेगा।


1

कॉन्फ़िगरेशन में, आप उपयोग कर सकते हैं <compileSourceRoots>

oal:          org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-cli)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <basedir default-value="${basedir}"/>
  <buildDirectory default-value="${project.build.directory}"/>
  <compilePath default-value="${project.compileClasspathElements}"/>
  <compileSourceRoots default-value="${project.compileSourceRoots}"/>
  <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
  <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
  <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
  <debug default-value="true">${maven.compiler.debug}</debug>
  <debuglevel>${maven.compiler.debuglevel}</debuglevel>
  <encoding default-value="${project.build.sourceEncoding}">${encoding}</encoding>
  <executable>${maven.compiler.executable}</executable>
  <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
  <failOnWarning default-value="false">${maven.compiler.failOnWarning}</failOnWarning>
  <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
  <fork default-value="false">${maven.compiler.fork}</fork>
  <generatedSourcesDirectory default-value="${project.build.directory}/generated-sources/annotations"/>
  <maxmem>${maven.compiler.maxmem}</maxmem>
  <meminitial>${maven.compiler.meminitial}</meminitial>
  <mojoExecution default-value="${mojoExecution}"/>
  <optimize default-value="false">${maven.compiler.optimize}</optimize>
  <outputDirectory default-value="${project.build.outputDirectory}"/>
  <parameters default-value="false">${maven.compiler.parameters}</parameters>
  <project default-value="${project}"/>
  <projectArtifact default-value="${project.artifact}"/>
  <release>${maven.compiler.release}</release>
  <session default-value="${session}"/>
  <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
  <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
  <skipMain>${maven.main.skip}</skipMain>
  <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
  <source default-value="1.6">${maven.compiler.source}</source>
  <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
  <target default-value="1.6">${maven.compiler.target}</target>
  <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
  <verbose default-value="false">${maven.compiler.verbose}</verbose>
</configuration>

ये सभी संकलक प्लगइन के 3.8.1 संस्करण के लिए उपलब्ध विन्यास हैं। अलग-अलग संस्करणों में अलग-अलग कॉन्फ़िगरेशन होते हैं जिन्हें आप -Xसामान्य मावन कमांड के बाद अपना कोड चलाकर पा सकते हैं । पसंद

mvn clean install -X
mvn compiler:compile -X

और आईडी या लक्ष्य या प्लगइन नाम के साथ खोज करें। यह अन्य प्लगइन्स के साथ भी मदद कर सकता है। ग्रहण, intelliJ सुझाव के रूप में सभी विन्यास नहीं दिखा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.