Chcę wykonać polecenia powłoki z pom.xml Mavena

105

Chcę wykonywać polecenia powłoki Linuksa za pomocą Mavena. Oto, czego próbowałem:

<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
źródło
wyczyść swoje pytanie i sformatuj plik pom.xml w pytaniu. Jego nieczytelne.
zengr
12
Nie chcę być niegrzeczny, ale naprawdę musisz nauczyć się zadawać pytania, nie jesteśmy medium. Co zrobiłeś? Co dostałeś? Jaki jest oczekiwany wynik?
Pascal Thivent

Odpowiedzi:

148

Oto, co działa dla mnie:

<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
źródło
11
Dodam, że to nie działa z (przynajmniej) wersją 1.5.0 wtyczki, ponieważ <configuration />powinno następować po niej <executions />i nie powinno być w niej umieszczane. Zajęło mi trochę czasu znalezienie tego prostego błędu składniowego. Wyjście błędów Mavena naprawdę nie jest tak pomocne.
joergl
1
Jaką fazę lub cel musimy podać, jeśli chcemy uruchomić skrypt po fazie wdrożenia?
Lucy
3
Fazy ​​Mavena są wymienione tutaj: maven.apache.org/guides/introduction/…
Ed Randall
2
Używanie <workingDirectory>${basedir}/scripts/</workingDirectory>w bloku konfiguracyjnym, zamiast podawać pełną ścieżkę, <executable>również może być dobrym pomysłem
akn
35

Problem polega na tym, że nie wiem, czego się oczekuje . Przy obecnej konfiguracji wywołanie wtyczki w wierszu poleceń po prostu działałoby:

$ mvn exec: exec
[INFO] Skanuję w poszukiwaniu projektów ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Budynek Q3491937
[INFO] segment zadań: [exec: exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {wykonanie: default-cli}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] BUDOWANIE POWIODŁO SIĘ
[INFO] ----------------------------------------------- -------------------------
...

configurationUżywany jest globalny , hostnamepolecenie jest wykonywane ( laptopto moja nazwa hosta). Innymi słowy, wtyczka działa zgodnie z oczekiwaniami.

Teraz, jeśli chcesz, aby wtyczka była wykonywana jako część kompilacji , musisz powiązać cel z określoną fazą. Na przykład, aby go powiązać 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>

I wtedy:

$ mvn kompilacja
[INFO] Skanuję w poszukiwaniu projektów ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Budynek Q3491937
[INFO] segment zadań: [kompilacja]
[INFO] ----------------------------------------------- -------------------------
[INFO] [zasoby: zasoby {wykonanie: domyślne-zasoby}]
[INFO] Używanie kodowania „UTF-8” do kopiowania filtrowanych zasobów.
[INFO] pomiń nieistniejący katalog zasobów / home / pascal / Projects / Q3491937 / src / main / resources
[INFO] [kompilator: kompilacja {wykonanie: domyślna-kompilacja}]
[INFO] Nie ma nic do kompilacji - wszystkie klasy są aktualne
[INFO] [exec: exec {wykonanie: niektóre-wykonanie}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] BUDOWANIE POWIODŁO SIĘ
[INFO] ----------------------------------------------- -------------------------
...

Zauważ, że możesz określić configurationwewnątrz execution.

Pascal Thivent
źródło
[BŁĄD] BŁĄD KONSTRUKCJI [INFO] ------------------------------------------ ------------------------------ [INFO] Jeden lub więcej wymaganych parametrów wtyczki jest nieprawidłowych / brakujących dla „exec: exec” [ 0] W definicji wtyczki „exec-maven-plugin” podaj następujące informacje: <configuration> ... <executable> VALUE </executable> </configuration> -LUB- w wierszu poleceń podaj: „-Dexec. executable = VALUE 'Otrzymuję ten błąd teraz.
NareshKumar
2
@ gnash-85: Nadal nie mam pojęcia, co robisz. Użyłem dokładnego fragmentu, który podałeś i nie miałem problemu, jak pokazano powyżej. Zaktualizuj swoje pytanie, aby pokazać, jak wywołujesz maven (i jaka jest twoja obecna konfiguracja, jeśli coś zmieniłeś).
Pascal Thivent
Umieściłem ten sam kod w module potomnym. I próbuję wykonać mvn exec: exec z nadrzędnego pom.xml. I otrzymuję ten błąd. Ale kiedy wykonuję go indywidualnie, działa.
NareshKumar
5
@ gnash-85: To normalne. Kiedy wywołasz mvn exec:execna rodzica, mvn uruchomi go na wszystkich projektach kompilacji wielomodułowej, łącznie z rodzicem. Ale macierzysty pom nie ma żadnej konfiguracji dla wtyczki, która oczekuje executablezdefiniowania elementu, stąd komunikat o błędzie.
Pascal Thivent
2
Dodając do tej dyskusji. Jeśli określisz swoje configurationwnętrze executionbloku, zadziała, jeśli zostanie uruchomiony jako część grupy ( mvn install), ale zgłosi specify the following: <configuration>błąd, jeśli zostanie uruchomiony bezpośrednio z mvn exec:exec.
roo2
19

Rozwiązany. Problem w tym, że plik wykonywalny działa inaczej w Linuksie. Jeśli chcesz uruchomić plik .sh, powinieneś napisać jak poniżej. Napisz to w 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
źródło
2
Dzięki! Dla mnie, jako użytkownika Windows, który preferuje skrypty powłoki, to był klucz!
Ruik
6

2 opcje:

  1. Chcesz wykonać polecenie z mavena bez wiązania się z żadną fazą, po prostu wpisujesz polecenie i maven je uruchamia , po prostu chcesz uruchomić coś, nie obchodzi cię, czy jesteśmy w kompilacji / pakiecie / ... powiedz, że chcę biegać npm startz mavenem, możesz to osiągnąć za pomocą poniższych:

mvn exec:exec -Pstart-node

W tym celu potrzebujesz poniższej sekcji 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. Chcesz uruchomić dowolną komendę od mavena, gdy jesteś w określonej fazie , na przykład gdy jestem w fazie instalacji, którą chcę uruchomić, npm installmożesz to zrobić za pomocą:

mvn install

Aby to zadziałało, potrzebujesz poniższej sekcji:

  <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
źródło
1

Dzięki! Tomer Ben David. pomogło mi. jak robię instalację pip w folderze demonstracyjnym, jak wspomniałeś, instalacja 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>
eric
źródło