ฉันต้องการรันคำสั่งเชลล์จาก pom.xml ของ Maven


105

ฉันต้องการรันคำสั่งเชลล์ลินุกซ์ด้วย Maven นี่คือสิ่งที่ฉันลอง:

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

โปรดทำความสะอาดคำถามของคุณและจัดรูปแบบ pom.xml ในคำถามของคุณ มันอ่านไม่ออก
zengr

12
ฉันไม่ได้หมายความว่าจะหยาบคาย แต่คุณต้องเรียนรู้วิธีถามคำถามจริงๆเราไม่ใช่พลังจิต คุณทำอะไรลงไป? คุณได้อะไร? ผลที่คาดว่าจะได้รับคืออะไร?
Pascal Thivent

ไม่มีความผิด @PascalThivent แต่ผู้ที่รู้จัก Maven และ pom.xml รู้ว่า OP จะหมายถึงอะไร :) ดังนั้นหากใครไม่รู้จัก Maven หรือ pom.xml ก็ควรข้ามคำถามไป มันค่อนข้างชัดเจนสำหรับฉันและอาจเป็นหลายคนที่ชอบคำถามนี้
Raid

คำตอบ:


148

นี่คือสิ่งที่ได้ผลสำหรับฉัน:

<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
ฉันต้องการเพิ่มว่าสิ่งนี้ใช้ไม่ได้กับ (อย่างน้อย) เวอร์ชัน 1.5.0 ของปลั๊กอินเนื่องจาก<configuration />ควรทำตามหลัง<executions />และไม่ควรวางไว้ในนั้น ฉันใช้เวลาพอสมควรในการค้นหาข้อผิดพลาดทางไวยากรณ์ง่ายๆนี้ ผลลัพธ์ข้อผิดพลาดของ Maven นั้นไม่เป็นประโยชน์จริงๆ
joergl

1
เราต้องระบุขั้นตอนหรือเป้าหมายใดหากต้องการรันสคริปต์หลังจากขั้นตอนการปรับใช้ ??
Lucy

3
ขั้นตอน Maven แสดงไว้ที่นี่: maven.apache.org/guides/introduction/…
Ed Randall

2
การใช้<workingDirectory>${basedir}/scripts/</workingDirectory>ในบล็อกการกำหนดค่าแทนที่จะให้เส้นทางแบบเต็ม<executable>อาจเป็นความคิดที่ดี
akn

35

นี่คือปัญหาที่ผมไม่ทราบว่าสิ่งที่คาดว่า ด้วยการตั้งค่าปัจจุบันของคุณการเรียกใช้ปลั๊กอินในบรรทัดคำสั่งจะใช้งานได้:

$ mvn exec: exec
[INFO] กำลังสแกนหาโปรเจ็กต์ ...
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] อาคาร Q3491937
[INFO] ส่วนงาน: [exec: exec]
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] [exec: exec {การดำเนินการ: default-cli}]
[INFO] แล็ปท็อป
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] BUILD SUCCESSFUL
[ข้อมูล] ----------------------------------------------- -------------------------
...

configurationมีการใช้global hostnameคำสั่งจะดำเนินการ ( laptopคือชื่อโฮสต์ของฉัน) กล่าวอีกนัยหนึ่งปลั๊กอินทำงานตามที่คาดไว้

ตอนนี้ถ้าคุณต้องการให้ปลั๊กอินทำงานเป็นส่วนหนึ่งของบิลด์คุณต้องผูกเป้าหมายในเฟสเฉพาะ ตัวอย่างเช่นในการผูกไว้กับ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>

แล้ว:

$ mvn คอมไพล์
[INFO] กำลังสแกนหาโปรเจ็กต์ ...
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] อาคาร Q3491937
[INFO] ส่วนงาน: [คอมไพล์]
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] [ทรัพยากร: ทรัพยากร {การดำเนินการ: default-resources}]
[INFO] การใช้การเข้ารหัส 'UTF-8' เพื่อคัดลอกทรัพยากรที่กรอง
[INFO] ข้าม resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [คอมไพเลอร์: คอมไพล์ {การดำเนินการ: default-compile}]
[INFO] ไม่มีอะไรต้องรวบรวม - ทุกคลาสเป็นข้อมูลล่าสุด
[INFO] [exec: exec {ecution: some -ecution}]
[INFO] แล็ปท็อป
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] BUILD SUCCESSFUL
[ข้อมูล] ----------------------------------------------- -------------------------
...

โปรดทราบว่าคุณสามารถระบุconfigurationภายในexecutionไฟล์.


[ERROR] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] พารามิเตอร์ปลั๊กอินที่จำเป็นอย่างน้อยหนึ่งพารามิเตอร์ไม่ถูกต้อง / ขาดหายไปสำหรับ "exec: exec" [ 0] ภายในคำจำกัดความสำหรับปลั๊กอิน 'exec-maven-plugin' ระบุสิ่งต่อไปนี้: <configuration> ... <executable> VALUE </executable> </configuration> -OR- ในบรรทัดคำสั่งให้ระบุ: '-Dexec ปฏิบัติการ = VALUE 'ฉันได้รับข้อผิดพลาดนี้ทันที
NareshKumar

2
@ gnash-85: ฉันยังไม่รู้ว่าคุณกำลังทำอะไรอยู่ ฉันใช้ตัวอย่างข้อมูลที่คุณให้มาและไม่มีปัญหาดังที่แสดงด้านบน โปรดอัปเดตคำถามของคุณเพื่อแสดงวิธีที่คุณเรียกใช้ maven (และการกำหนดค่าปัจจุบันของคุณคืออะไรหากคุณเปลี่ยนแปลงบางอย่าง)
Pascal Thivent

ฉันใส่รหัสเดียวกันในโมดูลย่อย และฉันกำลังพยายามเรียกใช้ mvn exec: exec จากพาเรนต์ pom.xml และฉันได้รับข้อผิดพลาดนี้ แต่เมื่อฉันดำเนินการทีละรายการมันใช้งานได้
NareshKumar

5
@ gnash-85: นั่นเป็นเรื่องปกติ เมื่อคุณเรียกใช้พาเรนmvn exec:execต์ mvn จะรันในโปรเจ็กต์ทั้งหมดของการสร้างแบบหลายโมดูลรวมถึงพาเรนต์ แต่ pom หลักไม่มีการกำหนดค่าใด ๆ สำหรับปลั๊กอินที่คาดว่าexecutableจะกำหนดดังนั้นจึงเป็นข้อความแสดงข้อผิดพลาด
Pascal Thivent

2
การเพิ่มความเข้าใจนี้ ถ้าคุณระบุของคุณconfigurationภายในexecutionบล็อกมันจะทำงานถ้าทำงานเป็นส่วนหนึ่งของกลุ่ม ( mvn install) แต่โยนข้อผิดพลาดถ้าทำงานโดยตรงกับspecify the following: <configuration> mvn exec:exec
roo2

19

แก้ไขแล้ว. ปัญหาคือไฟล์ปฏิบัติการทำงานในลักษณะอื่นใน Linux หากคุณต้องการเรียกใช้ไฟล์. sh คุณควรเขียนด้วยวิธีด้านล่าง เขียนใน 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
ขอบคุณ! สำหรับฉันในฐานะผู้ใช้ Windows ที่ชอบเชลล์สคริปต์นั่นคือกุญแจสำคัญ!
Ruik

6

2 ตัวเลือก:

  1. คุณต้องการเรียกใช้คำสั่งจาก maven โดยไม่ผูกมัดกับเฟสใด ๆ คุณเพียงแค่พิมพ์คำสั่งและ maven เรียกใช้คุณเพียงแค่ต้องการ maven เพื่อเรียกใช้บางสิ่งคุณไม่สนใจว่าเราจะคอมไพล์ / package / ... บอกว่าฉันต้องการทำงานnpm startกับ maven คุณสามารถทำได้โดยทำดังนี้:

mvn exec:exec -Pstart-node

สำหรับสิ่งนั้นคุณต้องมีส่วน maven ด้านล่าง

  <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. คุณต้องการเรียกใช้คำสั่งโดยพลการจาก maven ในขณะที่คุณอยู่ในเฟสเฉพาะตัวอย่างเช่นเมื่อฉันอยู่ในขั้นตอนการติดตั้งฉันต้องการเรียกใช้npm installคุณสามารถทำได้ด้วย:

mvn install

และเพื่อให้ได้ผลคุณจะต้องมีส่วนด้านล่าง:

  <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

ขอบคุณ! โทเมอร์เบนเดวิด มันช่วยฉัน ขณะที่ฉันกำลังทำการติดตั้ง pip ในโฟลเดอร์สาธิตตามที่คุณกล่าวถึงการติดตั้ง 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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.