Maven: Làm thế nào để thay đổi đường dẫn đến thư mục đích từ dòng lệnh?


82

Maven: Làm thế nào để thay đổi đường dẫn đến thư mục đích từ dòng lệnh?

(Tôi muốn sử dụng một thư mục đích khác trong một số trường hợp)



2
Câu trả lời đơn giản: Tôi có một IDE chẳng hạn như xây dựng Eclipse target/và tôi muốn cũng có thể xây dựng từ dòng lệnh mà không cần hai quy trình dẫm chân nhau.
john sullivan 17/12/13

Một trường hợp sử dụng khác mà tôi đã tìm thấy cho điều này - xây dựng các bài kiểm tra tích hợp như src/it/my-integration-test-project/pom.xmltừ dòng lệnh mà không tạo targetthư mục trong cây nguồn, thư mục này sẽ được sao chép khi các bài kiểm tra tích hợp được chạy như một phần của giai đoạn xác minh của dự án chứa.
Mike Samuel

1
Điều này có trả lời câu hỏi của bạn không? Xây dựng ngoài cây với maven. Có khả thi không?
030

Câu trả lời:


93

Bạn nên sử dụng hồ sơ.

<profiles>
    <profile>
        <id>otherOutputDir</id>
        <build>
            <directory>yourDirectory</directory>
        </build>
    </profile>
</profiles>

Và bắt đầu maven với hồ sơ của bạn

mvn compile -PotherOutputDir

Nếu bạn thực sự muốn xác định thư mục của mình từ dòng lệnh, bạn có thể làm như sau ( KHÔNG được khuyến nghị chút nào ):

<properties>
    <buildDirectory>${project.basedir}/target</buildDirectory>
</properties>

<build>
    <directory>${buildDirectory}</directory>
</build>

Và biên dịch như thế này:

mvn compile -DbuildDirectory=test

Đó là bởi vì bạn không thể thay đổi thư mục đích bằng cách sử dụng -Dproject.build.directory


1
Cảm ơn rât nhiều. Tại sao giải pháp thứ hai không được khuyến khích?
Igor Mukhin

1
@iimuhin, giải pháp đầu tiên là sử dụng chính xác các khả năng được cung cấp bởi cấu hình maven, giải pháp thứ hai là một mẹo nhỏ để làm cho nó hoạt động. Nếu các tùy chọn -Dproject.build.directoryđược sử dụng, nó sẽ có thể sử dụng được; và đây là một giải pháp cho -Dproject.build.directoryvấn đề. Ngoài ra, với giải pháp đầu tiên, bạn chỉ định đường dẫn một lần và mãi mãi, bạn không thể mắc lỗi đánh máy trong tên thư mục khi khởi chạy dòng lệnh, bạn có thể dễ dàng sử dụng giải pháp này ngay cả khi bạn làm việc từ IDE, v.v.
Colin Hebert

8
Vấn đề với giải pháp cấu hình là nhiều trường hợp sử dụng để thay đổi thư mục đích là dành riêng cho người dùng (như muốn xây dựng vào đĩa ram) và không thuộc về pom. Cấu hình trong cài đặt dành riêng cho người dùng .xml không thể chứa phần tử xây dựng, vì vậy đó không phải là một tùy chọn.
EricS

Tôi thích câu trả lời này, nhưng có thể bao gồm việc bạn có thể kích hoạt một hồ sơ thông qua settings.xmlthay vì dòng lệnh, để có tính di động nhiều hơn?
Rogue

1
Tôi thích "giải pháp không được đề xuất" của bạn vì nó cho phép tôi xây dựng trên dòng lệnh trong các thư mục thay thế, do đó mà không làm phiền Eclipse trỏ đến $ {project.basedir} / target mặc định. Do đó tôi có thể mã trong Eclipse trong khi xây dựng trên dòng lệnh cùng một lúc mà không cần chờ cho Eclipse để làm mới / xây dựng lại
Francois Marot

28

Colin đúng là một hồ sơ nên được sử dụng. Tuy nhiên, câu trả lời của anh ấy đã mã hóa thư mục đích trong hồ sơ. Một giải pháp thay thế sẽ là thêm một hồ sơ như thế này:

    <profile>
        <id>alternateBuildDir</id>
        <activation>
            <property>
                <name>alt.build.dir</name>
            </property>
        </activation>
        <build>
            <directory>${alt.build.dir}</directory>
        </build>
    </profile>

Làm như vậy sẽ có tác dụng thay đổi thư mục xây dựng thành bất kỳ thứ gì được cung cấp bởi thuộc tính alt.build.dir, có thể được cung cấp trong POM, trong cài đặt của người dùng hoặc trên dòng lệnh. Nếu thuộc tính không có, quá trình biên dịch sẽ diễn ra trong thư mục đích bình thường.


Xin lỗi vì câu hỏi n00b, nhưng cách thích hợp để đặt thuộc tính trong tệp cài đặt của người dùng để điều này có lợi là gì? Tôi hiểu từ Tham chiếu cài đặt nói rằng các thuộc tính được đặt trong tệp cài đặt sẽ không được nội suy trong tệp cài đặt.
Michael Scheper

Ngoài ra, lợi ích này sẽ cung cấp? Tôi có lẽ đang thiếu một cái gì đó, nhưng giả sử 'trường hợp' của OP được chỉ định trong dòng lệnh, điều này sẽ không chỉ làm cho tham số -Dalt.build.dir=~/mytargettương đương với việc sử dụng -Dcho một số thuộc tính khác?
Michael Scheper,

À, tôi vừa nhận ra rằng mọi người ở đây đang nói về việc thêm hồ sơ vào POM chứ không phải settings.xml. Điều đó sẽ làm cho câu hỏi của tôi ít nhất là m00t như n00b. Xin lỗi vì điều đó.
Michael Scheper
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.