Tôi muốn thực hiện các lệnh shell từ Maven's pom.xml


105

Tôi muốn thực thi các lệnh shell Linux với Maven. Đây là những gì tôi đã thử:

<plugin>  
  <groupId>org.codehaus.mojo</groupId> 
  <artifactId>exec-maven-plugin</artifactId> 
  <version>1.1.1</version> 
  <executions>
    <execution>
      <goals>
        <goal>exec</goal> 
      </goals>
    </execution>
  </executions>
  <configuration>
    <executable>hostname</executable> 
  </configuration>
</plugin>

vui lòng xóa câu hỏi của bạn và định dạng pom.xml trong câu hỏi của bạn. Nó không thể đọc được.
zengr

12
Tôi không có ý thô lỗ nhưng bạn thực sự cần học cách đặt câu hỏi, chúng tôi không phải là nhà ngoại cảm. Bạn đã làm gì? Bạn đã nhận được gì? kết quả được mong đợi là gì?
Pascal Thivent

Câu trả lời:


148

Đây là những gì đang làm việc cho tôi:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution><!-- Run our version calculation script -->
      <id>Version Calculation</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/scripts/calculate-version.sh</executable>
      </configuration>
    </execution>
  </executions>
</plugin>


11
Tôi muốn nói thêm rằng điều này không hoạt động với (ít nhất) phiên bản 1.5.0 của plugin, vì nó <configuration />sẽ theo sau <executions />và không được đặt trong đó. Tôi đã mất khá nhiều thời gian để tìm ra lỗi cú pháp đơn giản này. Đầu ra lỗi của Maven thực sự không hữu ích.
joergl

1
Chúng ta cần cung cấp giai đoạn hoặc mục tiêu nào nếu muốn chạy tập lệnh sau giai đoạn triển khai ??
Lucy

3
Các giai đoạn của Maven được liệt kê tại đây: maven.apache.org/guides/introduction/…
Ed Randall

2
Sử dụng <workingDirectory>${basedir}/scripts/</workingDirectory>trong khối cấu hình, thay vì cung cấp đường dẫn đầy đủ <executable>cũng có thể là một ý kiến ​​hay
akn 18/09/17

35

Vấn đề ở đây là tôi không biết những gì được mong đợi . Với thiết lập hiện tại của bạn, việc gọi plugin trên dòng lệnh sẽ hoạt động:

$ mvn executive: thi hành
[INFO] Đang quét các dự án ...
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Tòa nhà Q3491937
[INFO] phân đoạn tác vụ: [thi hành: thực thi]
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] [thi hành: thực thi {thực thi: default-cli}]
[THÔNG TIN] máy tính xách tay
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] XÂY DỰNG THÀNH CÔNG
[THÔNG TIN] ----------------------------------------------- -------------------------
...

Toàn cục configurationđược sử dụng, hostnamelệnh được thực thi ( laptoplà tên máy của tôi). Nói cách khác, plugin hoạt động như mong đợi.

Bây giờ, nếu bạn muốn một plugin được thực thi như một phần của bản dựng , bạn phải ràng buộc một mục tiêu trên một giai đoạn cụ thể. Ví dụ, để ràng buộc nó trên compile:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1.1</version>
    <executions>
      <execution>
        <id>some-execution</id>
        <phase>compile</phase>
        <goals>
          <goal>exec</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <executable>hostname</executable>
    </configuration>
  </plugin>

Và sau đó:

biên dịch $ mvn
[INFO] Đang quét các dự án ...
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] Tòa nhà Q3491937
[INFO] task-segment: [biên dịch]
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] [resources: resources {execute: default-resources}]
[INFO] Sử dụng mã hóa 'UTF-8' để sao chép các tài nguyên đã lọc.
[INFO] bỏ qua tài nguyên không hiện cóDirectory / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [trình biên dịch: biên dịch {thực thi: mặc định-biên dịch}]
[INFO] Không có gì để biên dịch - tất cả các lớp đều được cập nhật
[INFO] [executive: thi hành {thực thi: một số-thực thi}]
[THÔNG TIN] máy tính xách tay
[THÔNG TIN] ----------------------------------------------- -------------------------
[INFO] XÂY DỰNG THÀNH CÔNG
[THÔNG TIN] ----------------------------------------------- -------------------------
...

Lưu ý rằng bạn có thể chỉ định configurationbên trong một execution.


[ERROR] XÂY DỰNG LỖI [THÔNG TIN] ------------------------------------------ ------------------------------ [INFO] Một hoặc nhiều tham số plugin bắt buộc không hợp lệ / bị thiếu đối với 'thi hành: thực thi' [ 0] Bên trong định nghĩa cho plugin 'execute-maven-plugin', chỉ định như sau: <configuration> ... <executable> VALUE </executable> </configuration> -OR- trên dòng lệnh, chỉ định: '-Dexec. thực thi = VALUE 'Tôi gặp lỗi này ngay bây giờ.
NareshKumar

2
@ gnash-85: Tôi vẫn không biết bạn đang làm gì. Tôi đã sử dụng đoạn mã chính xác mà bạn cung cấp và không có vấn đề gì như được hiển thị ở trên. Vui lòng cập nhật câu hỏi của bạn để hiển thị cách bạn gọi maven (và cấu hình hiện tại của bạn là gì nếu bạn thay đổi thứ gì đó).
Pascal Thivent

Tôi đã đặt cùng một mã trong một mô-đun con. Và tôi đang cố gắng thực thi tệp thi hành mvn: executive từ pom.xml mẹ. Và tôi gặp lỗi này. Nhưng khi tôi thực hiện riêng lẻ thì nó đang hoạt động.
NareshKumar

5
@ gnash-85: Đó là điều bình thường. Khi bạn gọi mvn exec:exectrên cha mẹ, mvn sẽ chạy nó trên tất cả các dự án của bản dựng đa mô-đun, bao gồm cả cha mẹ. Nhưng pom mẹ không có bất kỳ cấu hình nào cho plugin mong đợi executableđược xác định, do đó có thông báo lỗi.
Pascal Thivent

2
Thêm vào đĩa này. Nếu bạn chỉ định configurationbên trong executionkhối của mình, nó sẽ hoạt động nếu chạy như một phần của nhóm ( mvn install) nhưng sẽ specify the following: <configuration>gặp lỗi nếu chạy trực tiếp với mvn exec:exec.
roo2

19

Đã giải quyết. Vấn đề là, tệp thực thi đang hoạt động theo một cách khác trong Linux. Nếu muốn chạy tệp .sh, bạn nên ghi theo cách dưới đây. Viết nó trong pom.xml

    <plugin>
        <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
        <groupId>org.codehaus.mojo</groupId>
        <executions>
            <execution><!-- Run our version calculation script -->
                <id>Renaming build artifacts</id>
                <phase>package</phase>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>bash</executable>
            <commandlineArgs>handleResultJars.sh</commandlineArgs>
                </configuration>
            </execution>
        </executions>
    </plugin>

2
Cảm ơn! Đối với tôi, với tư cách là một người dùng Windows thích các tập lệnh shell, đó là chìa khóa!
Ruik

6

2 Tùy chọn:

  1. Bạn muốn thực hiện một lệnh từ maven mà không ràng buộc với bất kỳ pha nào, bạn chỉ cần gõ lệnh và maven chạy nó , bạn chỉ muốn maven chạy một cái gì đó, bạn không quan tâm nếu chúng ta đang biên dịch / gói / ... Hãy nói rằng tôi muốn chạy npm startvới maven, bạn có thể đạt được điều đó với những điều dưới đây:

mvn exec:exec -Pstart-node

Đối với điều đó, bạn cần phần maven bên dưới

  <profiles>
    <profile>
      <id>start-node</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>npm</executable>
              <arguments><argument>start</argument></arguments>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>

  </profiles>
  1. Bạn muốn chạy một lệnh tùy ý từ maven trong khi bạn đang ở một giai đoạn cụ thể , ví dụ: khi tôi đang ở giai đoạn cài đặt, tôi muốn chạy npm installbạn có thể làm điều đó với:

mvn install

Và để điều đó hoạt động, bạn sẽ cần phần bên dưới:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>

      <execution>
        <id>npm install (initialize)</id>
        <goals>
          <goal>exec</goal>
        </goals>
        <phase>initialize</phase>
        <configuration>
          <executable>npm</executable>
          <arguments>
            <argument>install</argument>
          </arguments>
        </configuration>
      </execution>

1

Cảm ơn! Tomer Ben David. Nó đã giúp đỡ tôi. vì tôi đang thực hiện cài đặt pip trong thư mục demo như bạn đã đề cập đến cài đặt npm

<groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.3.2</version>
            <executions>
              <execution>
                <goals>
                  <goal>exec</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <executable>pip</executable>
              <arguments><argument>install</argument></arguments>                            
             <workingDirectory>${project.build.directory}/Demo</workingDirectory>
            </configuration>
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.