Eu quero executar comandos shell do pom.xml do Maven

105

Quero executar comandos do shell do Linux com Maven. Aqui está o que eu tentei:

<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
fonte
Limpe sua pergunta e formate o pom.xml em sua pergunta. Não é legível.
Zengr de
12
Não quero ser rude, mas você realmente precisa aprender a fazer perguntas, não somos médiuns. O que você fez? O que você conseguiu? Qual é o resultado esperado?
Pascal Thivent

Respostas:

148

Aqui está o que está funcionando para mim:

<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
fonte
11
Gostaria de acrescentar que isso não funciona com (pelo menos) a versão 1.5.0 do plugin, já que <configuration />deve <executions />vir depois e não deve ser colocado nela. Levei um bom tempo para encontrar este erro sintático simples. A saída de erro do Maven não é muito útil.
joergl
1
Que fase ou objetivo precisamos fornecer se quisermos executar o script após a fase de implantação?
Lucy
3
As fases do Maven estão listadas aqui: maven.apache.org/guides/introduction/…
Ed Randall
2
Usar o <workingDirectory>${basedir}/scripts/</workingDirectory>bloco de configuração, em vez de fornecer o caminho completo, <executable>também pode ser uma boa ideia
akn
35

O problema aqui é que não sei o que é esperado . Com sua configuração atual, invocar o plug-in na linha de comando funcionaria:

$ mvn exec: exec
[INFO] Procurando projetos ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Edifício Q3491937
[INFO] segmento de tarefa: [exec: exec]
[INFO] ----------------------------------------------- -------------------------
[INFO] [exec: exec {execução: padrão-cli}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUIR COM SUCESSO
[INFO] ----------------------------------------------- -------------------------
...

O global configurationé usado, o hostnamecomando é executado ( laptopé meu nome de host). Em outras palavras, o plugin funciona conforme o esperado.

Agora, se você deseja que um plugin seja executado como parte da construção , é necessário vincular um objetivo a uma fase específica. Por exemplo, para vinculá-lo a 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>

E depois:

$ mvn compilar
[INFO] Procurando projetos ...
[INFO] ----------------------------------------------- -------------------------
[INFO] Edifício Q3491937
[INFO] segmento de tarefa: [compilar]
[INFO] ----------------------------------------------- -------------------------
[INFO] [recursos: recursos {execução: recursos-padrão}]
[INFO] Usando a codificação 'UTF-8' para copiar recursos filtrados.
[INFO] ignorar resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resources não existente
[INFO] [compilador: compilar {execução: compilar padrão}]
[INFO] Nada para compilar - todas as classes estão atualizadas
[INFO] [exec: exec {execução: execução parcial}]
[INFO] laptop
[INFO] ----------------------------------------------- -------------------------
[INFO] CONSTRUIR COM SUCESSO
[INFO] ----------------------------------------------- -------------------------
...

Observe que você pode especificar um configurationdentro de um execution.

Pascal Thivent
fonte
[ERROR] BUILD ERROR [INFO] ------------------------------------------ ------------------------------ [INFO] Um ou mais parâmetros de plug-in necessários são inválidos / ausentes para 'exec: exec' [ 0] Dentro da definição do plugin 'exec-maven-plugin', especifique o seguinte: <configuration> ... <executable> VALUE </executable> </configuration> -OU- na linha de comando, especifique: '-Dexec. executável = VALUE 'Recebo este erro agora.
NareshKumar de
2
@ gnash-85: Ainda não tenho ideia do que você está fazendo. Usei o snippet exato que você forneceu e não tive nenhum problema como mostrado acima. Por favor, atualize sua pergunta para mostrar como você invoca o maven (e qual é sua configuração atual se você mudou algo).
Pascal Thivent de
Coloquei o mesmo código em um módulo filho. E estou tentando executar o mvn exec: exec do pom.xml pai. E eu recebo este erro. Mas quando eu executo individualmente, ele está funcionando.
NareshKumar
5
@ gnash-85: Isso é normal. Quando você invoca mvn exec:execno pai, o mvn irá executá-lo em todos os projetos da compilação de vários módulos, incluindo o pai. Mas o pom pai não tem nenhuma configuração para o plugin que espera executableque seja definido, daí a mensagem de erro.
Pascal Thivent
2
Adicionando a esta discussão. Se você especificar seu configurationdentro do executionbloco, funcionará se for executado como parte de um grupo ( mvn install), mas gerará o specify the following: <configuration>erro se for executado diretamente com mvn exec:exec.
roo2
19

Resolvido. O problema é que o executável funciona de maneira diferente no Linux. Se você deseja executar o arquivo .sh, deve escrever da maneira abaixo. Escreva em 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
fonte
2
Obrigado! Para mim, como um usuário do Windows que prefere scripts de shell, essa foi a chave!
Ruik de
6

2 opções:

  1. Você deseja executar um comando do maven sem vincular a nenhuma fase, basta digitar o comando e o maven o executa , você só deseja executar o maven para executar algo, não importa se estamos em compilar / pacote / ... digamos que eu queira correr npm startcom o maven, você pode conseguir isso com o seguinte:

mvn exec:exec -Pstart-node

Para isso você precisa da seção maven abaixo

  <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. Você deseja executar um comando arbitrário do maven enquanto está em uma fase específica , por exemplo, quando estou na fase de instalação, desejo executar, npm installvocê pode fazer isso com:

mvn install

E para que isso funcione, você precisa da seção abaixo:

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

Obrigado! Tomer Ben David. isso me ajudou. como estou fazendo pip install na pasta demo, como você mencionou 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
fonte