Maven biên dịch với nhiều thư mục src


194

Có cách nào để biên dịch nhiều thư mục nguồn java trong một dự án maven không?

Câu trả lời:


278

Bạn có thể thêm một thư mục nguồn mới với trình trợ giúp xây dựng:

<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
Vấn đề duy nhất với cách tiếp cận này là tạo phẩm cuối cùng cũng bao gồm các tệp nguồn java (tệp .java). Có cách nào để loại trừ các tệp nguồn và chỉ bao gồm các tệp. Class không?
saravana_pc

17
chỉ là một ghi chú cho những người khác (như tôi), pluginyếu tố nằm trong /project/build/pluginsvà KHÔNG ở/project/build/pluginManagement/plugins
Betlista

3
Nếu bạn đang sử dụng nhật thực, bạn có thể muốn cài đặt m2e connector for build-helper-maven-plugintừ thị trường nhật thực để xóa lỗi trong pom.xml
dieend

1
Nếu bạn nhận được một cảnh báo như 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingbạn cần thêm vào trong <plugin>thẻ<version>1.12</version>
Alphaaa

4
Vì vậy, cách tốt nhất để làm điều này, vào năm 2017, là tạo ra một loại mì ống XML. Có ai thấy vấn đề với điều đó không?
Tom

55

Tôi ngây thơ làm theo cách này:

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

2
Làm việc cho tôi để :) Mặc dù Eclipse dường như không thích nó. Dường như nghĩ rằng "src / main / java, src / giao diện" là một src duy nhất và do đó gắn cờ nó là (thiếu).
Joel

1
Đối với tôi, điều đó khiến Maven 3.2.2 không tìm thấy bất kỳ nguồn nào.
user149408

40

Điều này làm việc cho tôi

<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 không phải là một ý tưởng hay, vì một số plugin giả định sourceDirectory- và có thể bổ sung sources- là gốc của các tệp nguồn. Trong giải pháp của bạn, maven-compiler-pluginplugin là nhận thức duy nhất về những gốc thực tế này.
Laurent Pireyn

3
@Laurent Bạn nói đúng về điều đó. Đây là một ý tưởng tốt một vài năm trước đây nhưng có nhiều lựa chọn tốt hơn bây giờ. xây dựng trợ giúp được liệt kê ở trên là tùy chọn ưa thích của tôi.
sal

5
Điều này không thêm nó vào mô hình dự án, vì vậy nó sẽ không hoạt động chính xác trong các IDE.
David Phillips

+1 @sal nó hoạt động như một cơ duyên với sự phụ thuộc của dự án WAR.
ATorras

1
Điều này không thể hoạt động nếu tôi muốn bao gồm một thư mục nguồn bên ngoài (chứa lớp Java mà tôi đang sử dụng trong dự án maven của mình). Điều gì xảy ra nếu nguồn bên ngoài của tôi nằm ngoài không gian làm việc của Eclipse? Tôi có thể làm gì?
Aerox

16

để làm cho nó hoạt động trong intelliJ, bạn cũng có thể thêm

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

để maven-biên dịch-plugin


Cũng muốn thêm rằng điều này cũng hoạt động trong Eclipse cũng như thêm các nguồn được tạo làm vị trí nguồn trong cấu hình dự án.
Adam Hawkes

2
Đường dẫn này dường như dành cho các nguồn được tạo bởi các bộ xử lý chú thích. Ngay cả khi nó hoạt động, có thể đường dẫn này được xử lý khác nhau bởi một số plugin. Ví dụ, tôi hy vọng thư mục này có thể bị xóa khi 'sạch' được chạy.
kapex

2
bạn đã để nó ở đâu ?
Pavel Niedoba

10

Điều này cũng hoạt động với maven bằng cách xác định thẻ tài nguyên. Bạn có thể đặt tên tên thư mục src của bạn bất cứ điều gì bạn thích.

    <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#Resource ->Resources are not (usually) code. They are not compiled
SJuan76

4

Điều này đã làm việc với maven 3.5.4 và bây giờ Intellij Idea xem mã này là nguồn:

       <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

Đã sử dụng plugin-helper-maven-plugin từ bài đăng - và cập nhật src / main / created. Và mvn biên dịch sạch hoạt động trên ../common/src/main/java hoặc trên ../common, vì vậy hãy giữ lại sau. Sau đó, có, xác nhận rằng mức độ biên dịch IntelliJ IDEA (phiên bản 10.5.2) đã thất bại như David Phillips đã đề cập. Vấn đề là IDEA đã không thêm một nguồn gốc khác vào dự án. Thêm nó bằng tay giải quyết vấn đề. Thật không hay khi chỉnh sửa bất cứ điều gì trong dự án nên đến từ maven chứ không phải từ chỉnh sửa trực tiếp các tùy chọn dự án của IDEA. Tuy nhiên, tôi sẽ có thể sống với nó cho đến khi họ hỗ trợ plugin-helper-maven-plugin trực tiếp để nó tự động thêm các nguồn.

Sau đó, cần một cách giải quyết khác để làm cho công việc này mặc dù. Vì mỗi lần IDEA nhập lại các cài đặt maven sau khi thay đổi pom, nguồn mới được thêm của tôi được giữ lại trên mô-đun, nhưng nó bị mất các lựa chọn Thư mục nguồn và vô dụng. Vì vậy, đối với IDEA - cần thiết lập những thứ này một lần:

  • Chọn - Cài đặt dự án / Maven / Nhập / giữ các thư mục nguồn và kiểm tra khi nhập lại.
  • Thêm - Cấu trúc dự án / Cài đặt dự án / Mô-đun / {Mô-đun} / Nguồn / Thêm gốc nội dung.

Bây giờ, việc giữ các thư mục đó khi nhập cũng không phải là cách tốt nhất trên thế giới, ..., nhưng hãy thử xem.


Không có tùy chọn nào hoạt động với IntelliJ Idea 9.0.4, đó là những gì tôi sử dụng. Haven đã không thử các tùy chọn trình trợ giúp xây dựng với Eclipse gần đây, nhưng nó không hoạt động với 3,4 và plugin m2 khi tôi thử nó. Maven không thích nhiều cây nguồn hoặc nhiều tạo phẩm được xây dựng từ cùng một dự án, bất kỳ nỗ lực nào để vượt qua giới hạn này thường là một vụ hack khủng khiếp.
sal 11/11/11

Đã ở trên IntelliJ nhiều năm nay. Và không bao giờ chuyển sang nhật thực, vì vậy không thể nói chuyện với nó, sau đó nghe nói nó cũng rất tốt. Đối với IntelliJ Nâng cấp giấy phép cá nhân mỗi năm ở mức 100 đô la / năm. Các phiên bản chính mới thường được phát hành hàng năm vào tháng Giêng. Sau đó, vào 2-3 tháng cuối năm trước, họ cho phép bạn mua phiên bản trước và nhận bản nâng cấp miễn phí. Đây là thời điểm hiện tại vì vậy đây là thời điểm "an toàn" để mua 10 và nhận 11. Ngoài ra, nếu bạn không cần JSP và các tính năng doanh nghiệp khác, hãy sử dụng phiên bản cộng đồng miễn phí.
arntg

2

Mặc dù câu trả lời từ evokk về cơ bản là chính xác, nhưng nó lại thiếu các lớp kiểm tra . Bạn phải thêm các lớp kiểm tra với mục tiêu thêm nguồn kiểm tra :

                        <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

Điều này có thể được thực hiện trong hai bước:

  • Đối với mỗi thư mục nguồn, bạn nên tạo mô-đun riêng.
  • Trong tất cả các mô-đun, bạn nên chỉ định cùng một thư mục xây dựng: ${build.directory}

Nếu bạn làm việc với Jetty ( jetty:run) đã bắt đầu , thì việc biên dịch lại bất kỳ lớp nào trong bất kỳ mô-đun nào (với Maven, IDEA hoặc Eclipse) sẽ dẫn đến khởi động lại của Jetty. Hành vi tương tự bạn sẽ nhận được đối với tài nguyên đã sửa đổi.


1

Trong cấu hình, bạn có thể sử dụng <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>

đây là tất cả các cấu hình có sẵn cho phiên bản 3.8.1 của trình biên dịch plugin. Các phiên bản khác nhau có các cấu hình khác nhau mà bạn có thể tìm thấy bằng cách chạy mã của mình -Xsau lệnh mvn chung. Giống

mvn clean install -X
mvn compiler:compile -X

và tìm kiếm với id hoặc mục tiêu hoặc tên plugin Điều này cũng có thể giúp với các plugin khác. Eclipse, intelliJ có thể không hiển thị tất cả các cấu hình dưới dạng các đề xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.