Maven รวบรวมกับไดเรกทอรี src หลายรายการ


195

มีวิธีการรวบรวมหลายแหล่งไดเรกทอรี java ในโครงการ maven เดียวหรือไม่

คำตอบ:


279

คุณสามารถเพิ่มไดเรกทอรีแหล่งใหม่ด้วย build-helper:

<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
ปัญหาเดียวของวิธีนี้คือสิ่งประดิษฐ์ขั้นสุดท้ายรวมถึงไฟล์ต้นฉบับของจาวาเช่นกัน (ไฟล์. java) มีวิธีในการแยกไฟล์ต้นฉบับและไฟล์ที่รวมอยู่มีไฟล์. class หรือไม่?
saravana_pc

18
เพียงแค่ทราบสำหรับคนอื่น ๆ (เช่นฉัน) pluginองค์ประกอบอยู่ใน/project/build/pluginsและไม่ได้อยู่ใน/project/build/pluginManagement/plugins
Betlista

3
หากคุณกำลังใช้ eclipse คุณอาจต้องการติดตั้งm2e connector for build-helper-maven-pluginจาก eclipsearket เพื่อลบข้อผิดพลาดใน pom.xml
ธันวาคม

1
หากคุณได้รับคำเตือนเช่นเดียวกับที่'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingคุณต้องเพิ่มภายใน<plugin>แท็ก<version>1.12</version>
Alphaaa

4
ดังนั้นวิธีที่ดีที่สุดในการทำเช่นนี้ในปี 2560 คือการสร้างพาสต้า XML ไม่มีใครเห็นปัญหาเกี่ยวกับเรื่องนี้หรือไม่?
Tom

55

ฉันทำแบบนี้อย่างไร้เดียงสา:

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

2
ทำงานให้ฉันเพื่อ :) Eclipse ดูเหมือนจะไม่ชอบ ดูเหมือนว่าจะคิดว่า "src / main / java, src / interfaces" เป็น src เดียวและดังนั้นจึงตั้งค่าสถานะเป็น (หายไป)
โจเอล

1
สำหรับฉันนั่นทำให้ Maven 3.2.2 ไม่พบแหล่งใด ๆ
user149408

39

สิ่งนี้ใช้ได้สำหรับฉัน

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

19
ไม่ใช่ความคิดที่ดีนัก IMHO เนื่องจากปลั๊กอินหลายตัวถือว่าเป็นส่วนsourceDirectoryเพิ่มเติมsourcesของไฟล์ต้นฉบับ ในโซลูชันของคุณmaven-compiler-pluginเป็นปลั๊กอินเดียวที่ทราบถึงรากที่แท้จริงเหล่านี้
Laurent Pireyn

3
@ Laurent คุณพูดถูก นี่เป็นความคิดที่ดีเมื่อสองสามปีก่อน แต่ตอนนี้มีตัวเลือกที่ดีกว่ามาก build-helper ที่แสดงด้านบนเป็นตัวเลือกที่ฉันต้องการ
พะยอม

5
สิ่งนี้ไม่เพิ่มลงในรูปแบบโครงการดังนั้นจึงไม่สามารถทำงานได้อย่างถูกต้องใน IDE
David Phillips

+1 @sal มันทำงานได้อย่างมีเสน่ห์ด้วยการพึ่งพาโครงการ WAR
ATorras

1
สิ่งนี้ใช้ไม่ได้หากฉันต้องการรวมไดเรกทอรีแหล่งข้อมูลภายนอก (มีคลาส Java ที่ฉันใช้ในโครงการ maven ของฉัน) ถ้าแหล่งภายนอกของฉันอยู่นอกพื้นที่ทำงานของ Eclipse ฉันจะทำอย่างไร
Aerox

16

เพื่อให้ทำงานใน intelliJ คุณสามารถเพิ่มได้

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

เพื่อ maven-compiler-plugin


ต้องการเพิ่มว่าสิ่งนี้ทำงานได้ใน Eclipse และเพื่อเพิ่มแหล่งข้อมูลที่สร้างขึ้นเป็นแหล่งข้อมูลในการกำหนดค่าโครงการ
Adam Hawkes

2
พา ธ นี้ดูเหมือนว่าจะเป็นแหล่งที่สร้างโดยตัวประมวลผลคำอธิบายประกอบ แม้ว่ามันจะใช้ได้ แต่ก็เป็นไปได้ที่เส้นทางนี้จะถูกจัดการโดยปลั๊กอินบางตัว ตัวอย่างเช่นฉันคาดว่าจะสามารถลบไดเรกทอรีนี้เมื่อเรียกใช้ 'clean'
kapex

2
คุณวางไว้ที่ไหน
Pavel Niedoba

10

สิ่งนี้ยังทำงานกับ maven ด้วยการกำหนดแท็กทรัพยากร คุณสามารถตั้งชื่อโฟลเดอร์ 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

สิ่งนี้ใช้ได้กับ maven 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

ใช้ build-helper-maven-plugin จากโพสต์ - และอัพเดต src / main / created และคอมไพล์ mvn ที่สะอาดนั้นใช้กับ .. /common/src/main/java หรือ .. /common ถ้าใช่ยืนยันว่า IntelliJ IDEA (เวอร์ชั่น 10.5.2) ระดับการรวบรวมล้มเหลวตามที่ David Phillips พูดถึง ปัญหาคือ IDEA ไม่ได้เพิ่มรูทต้นฉบับอื่นให้กับโครงการ การเพิ่มมันแก้ไขปัญหาด้วยตนเอง มันไม่ดีเลยที่การแก้ไขอะไรในโครงการควรมาจาก maven และไม่ใช่จากการแก้ไขตัวเลือกโครงการของ IDEA โดยตรง แต่ฉันจะสามารถใช้ชีวิตกับมันจนกว่าพวกเขาจะสนับสนุน build-helper-maven-plugin โดยตรงเพื่อที่มันจะเพิ่มแหล่งข้อมูลอัตโนมัติ

จากนั้นต้องการวิธีแก้ปัญหาอื่นเพื่อให้สามารถใช้งานได้ เนื่องจากทุกครั้งที่ IDEA นำเข้าการตั้งค่า maven ใหม่หลังจาก pom เปลี่ยนฉันแหล่งที่เพิ่มใหม่ถูกเก็บไว้ในโมดูล แต่มันหายไปมันเป็นการเลือกโฟลเดอร์ต้นทางและไม่มีประโยชน์ ดังนั้นสำหรับ IDEA - จำเป็นต้องตั้งค่าเหล่านี้ครั้งเดียว:

  • เลือก - การตั้งค่าโครงการ / Maven / นำเข้า / เก็บซอร์สและทดสอบโฟลเดอร์ในการนำเข้าใหม่
  • เพิ่ม - โครงสร้างโครงการ / การตั้งค่าโครงการ / โมดูล / {โมดูล} / แหล่งที่มา / เพิ่มรูทเนื้อหา

ตอนนี้การเก็บโฟลเดอร์เหล่านั้นไว้ในการนำเข้าไม่ใช่วิธีปฏิบัติที่ดีที่สุดในโลกเช่นกัน ... แต่ลองดู


ตัวเลือกไม่ทำงานกับ IntelliJ Idea 9.0.4 ซึ่งเป็นสิ่งที่ฉันใช้ ยังไม่ได้ลองตัวเลือก build-helper กับ Eclipse เมื่อเร็ว ๆ นี้ แต่มันไม่ทำงานกับ 3.4 และปลั๊กอิน m2 เมื่อฉันลองใช้ Maven ไม่ชอบต้นไม้ที่มาหลายต้นหรือสิ่งประดิษฐ์หลายชิ้นที่สร้างจากโครงการเดียวกันความพยายามใด ๆ ที่จะหลีกเลี่ยงข้อ จำกัด นี้มักจะเป็นการแฮ็คที่น่ากลัว
พะยอม

ได้เข้าร่วม IntelliJ มาหลายปีแล้ว และไม่เคยเปลี่ยนเป็นคราสดังนั้นจึงไม่สามารถพูดคุยกับมันได้ดังนั้นเมื่อได้ยินว่ามันดีมากเช่นกัน สำหรับการอัพเกรด IntelliJ ใบอนุญาตส่วนบุคคลทุก ๆ ปีจะอยู่ที่ $ 100 ต่อปี รุ่นใหญ่ใหม่มักจะออกทุกปีในเดือนมกราคม จากนั้นในช่วง 2-3 เดือนสุดท้ายของปีที่แล้วพวกเขาอนุญาตให้คุณซื้อรุ่นก่อนหน้าและรับการอัปเกรดเป็นรุ่นที่กำลังจะมาฟรี นี่คือตอนนี้จึงเป็นเวลา "ปลอดภัย" ในการซื้อ 10 และรับ 11 นอกจากนี้ถ้าคุณไม่ต้องการ JSP และคุณลักษณะองค์กรอื่น ๆ ให้ใช้รุ่นชุมชนฟรี
arntg

2

ในขณะที่คำตอบจาก evokk ถูกต้องโดยทั่วไปก็จะหายไปเรียนการทดสอบ คุณต้องเพิ่มคลาสการทดสอบที่มีเป้าหมายadd-test-source :

                        <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 ที่เริ่มต้นjetty:runแล้วการคอมไพล์คลาสใด ๆ ในโมดูลใด ๆ (ด้วย Maven, IDEA หรือ Eclipse) จะนำไปสู่การรีสตาร์ท Jetty พฤติกรรมแบบเดียวกันนี้คุณจะได้รับจากทรัพยากรที่มีการปรับเปลี่ยน


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 ทั่วไป ชอบ

mvn clean install -X
mvn compiler:compile -X

และค้นหาด้วย id หรือเป้าหมายหรือชื่อปลั๊กอินสิ่งนี้อาจช่วยปลั๊กอินอื่นได้เช่นกัน Eclipse, intelliJ อาจไม่แสดงการกำหนดค่าทั้งหมดเป็นคำแนะนำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.