Saya ingin menjalankan perintah shell dari pom.xml Maven

105

Saya ingin menjalankan perintah shell Linux dengan Maven. Inilah yang saya coba:

<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>
NareshKumar
sumber
harap bersihkan pertanyaan Anda dan format pom.xml dalam pertanyaan Anda. Ini tidak bisa dibaca.
zengr
12
Saya tidak bermaksud kasar tetapi Anda benar-benar perlu belajar bagaimana mengajukan pertanyaan, kami bukan cenayang. Apa yang kamu lakukan? Apa yang kamu dapatkan? Apa hasil yang diharapkan?
Pascal Thivent

Jawaban:

148

Inilah yang berhasil untuk saya:

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

Curtis
sumber
11
Saya ingin menambahkan bahwa ini tidak bekerja dengan (setidaknya) versi 1.5.0 dari plugin, karena <configuration />harus mengikuti <executions />dan tidak ditempatkan di dalamnya. Butuh waktu cukup lama bagi saya untuk menemukan kesalahan sintaksis sederhana ini. Output kesalahan Maven benar-benar tidak membantu.
joergl
1
Fase atau tujuan apa yang perlu kita sediakan jika kita ingin menjalankan skrip setelah fase penerapan ??
Lucy
3
Tahapan Maven tercantum di sini: maven.apache.org/guides/introduction/…
Ed Randall
2
Menggunakan <workingDirectory>${basedir}/scripts/</workingDirectory>dalam blok konfigurasi, alih-alih memberikan jalur lengkap <executable>juga mungkin merupakan ide yang bagus
akn
35

Masalahnya di sini adalah saya tidak tahu apa yang diharapkan . Dengan penyiapan Anda saat ini, mengaktifkan plugin di baris perintah hanya akan berfungsi:

$ mvn exec: exec
[INFO] Memindai proyek ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Gedung Q3491937
[INFO] segmen tugas: [exec: exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {execution: default-cli}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] BANGUN SUKSES
[INFO] ----------------------------------------------- -------------------------
...

Global configurationdigunakan, hostnameperintah dijalankan ( laptopadalah nama host saya). Dengan kata lain, plugin berfungsi seperti yang diharapkan.

Sekarang, jika Anda ingin plugin dijalankan sebagai bagian dari build , Anda harus mengikat tujuan pada fase tertentu. Misalnya, untuk mengikatnya pada 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>

Lalu:

$ mvn kompilasi
[INFO] Memindai proyek ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Gedung Q3491937
[INFO] segmen tugas: [kompilasi]
[INFO] ----------------------------------------------- -------------------------
[INFO] [resource: resource {execution: default-resources}]
[INFO] Menggunakan pengkodean 'UTF-8' untuk menyalin sumber daya yang difilter.
[INFO] lewati resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resource yang tidak ada
[INFO] [compiler: compile {execution: default-compile}]
[INFO] Tidak ada yang perlu dikompilasi - semua kelas sudah yang terbaru
[INFO] [exec: exec {execution: some-execution}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] BANGUN SUKSES
[INFO] ----------------------------------------------- -------------------------
...

Perhatikan bahwa Anda dapat menentukan configurationdi dalam file execution.

Pascal Thivent
sumber
[ERROR] BUAT ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] Satu atau lebih parameter plugin yang diperlukan tidak valid / hilang untuk 'exec: exec' [ 0] Di dalam definisi untuk plugin 'exec-maven-plugin' tentukan yang berikut: <configuration> ... <executable> VALUE </executable> </configuration> -ATAU- pada baris perintah, tentukan: '-Dexec. executable = VALUE 'Saya mendapatkan kesalahan ini sekarang.
NareshKumar
2
@ gnash-85: Saya masih tidak tahu apa yang Anda lakukan. Saya menggunakan cuplikan persis yang Anda berikan dan tidak mengalami masalah seperti yang ditunjukkan di atas. Harap perbarui pertanyaan Anda untuk menunjukkan bagaimana Anda memanggil maven (dan apa konfigurasi Anda saat ini jika Anda mengubah sesuatu).
Pascal Thivent
Saya telah meletakkan kode yang sama di modul anak. Dan saya mencoba untuk menjalankan mvn exec: exec dari pom.xml induk. Dan saya mendapatkan kesalahan ini. Tetapi ketika saya menjalankannya secara individual, itu berfungsi.
NareshKumar
5
@ gnash-85: Itu normal. Saat Anda memanggil mvn exec:execinduknya, mvn akan menjalankannya di semua project build multi-modul, termasuk induknya. Tetapi pom induk tidak memiliki konfigurasi apa pun untuk plugin yang mengharapkan executableuntuk didefinisikan, oleh karena itu pesan kesalahannya.
Pascal Thivent
2
Menambah diskusi ini. Jika Anda menentukan configurationbagian dalam executionblok, itu akan berfungsi jika dijalankan sebagai bagian dari grup ( mvn install) tetapi memunculkan specify the following: <configuration>kesalahan jika dijalankan secara langsung dengan mvn exec:exec.
roo2
19

Terpecahkan. Masalahnya adalah, executable bekerja dengan cara berbeda di Linux. Jika Anda ingin menjalankan file .sh, Anda harus menuliskannya dengan cara di bawah ini. Tuliskan di 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>
james25
sumber
2
Terima kasih! Bagi saya sebagai pengguna Windows yang lebih menyukai skrip shell, itulah kuncinya!
Ruik
6

2 Pilihan:

  1. Anda ingin menjalankan perintah dari maven tanpa mengikat ke fase apa pun, Anda cukup mengetik perintah dan maven menjalankannya , Anda hanya ingin maven menjalankan sesuatu, Anda tidak peduli jika kita berada di kompilasi / paket / ... Ayo katakanlah saya ingin berlari npm startdengan maven, Anda dapat mencapainya dengan yang di bawah ini:

mvn exec:exec -Pstart-node

Untuk itu anda membutuhkan bagian maven dibawah ini

  <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. Anda ingin menjalankan perintah sewenang-wenang dari maven saat Anda berada pada fase tertentu , misalnya ketika saya pada fase instalasi saya ingin menjalankan npm installAnda dapat melakukannya dengan:

mvn install

Dan agar itu berhasil, Anda memerlukan bagian di bawah ini:

  <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>
Tomer Ben David
sumber
1

Terima kasih! Tomer Ben David. itu membantu saya. seperti yang saya lakukan pip install di folder demo seperti yang Anda sebutkan npm install

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