Maven의 pom.xml에서 쉘 명령을 실행하고 싶습니다.


105

Maven으로 Linux 셸 명령을 실행하고 싶습니다. 내가 시도한 것은 다음과 같습니다.

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

12
무례하다는 뜻은 아니지만 질문하는 법을 배워야합니다. 우리는 심령 적이 지 않습니다. 뭐 했어? 당신은 무엇을 얻었습니까? 예상되는 결과는 무엇입니까?
Pascal Thivent

답변:


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.apache.org/guides/introduction/...
에드 랜달을

2
사용 <workingDirectory>${basedir}/scripts/</workingDirectory>하는 대신에 전체 경로를주는, 구성 블록에하는 <executable>것도 좋은 생각입니다
AKN

35

여기서 문제는 예상되는 것이 무엇인지 모른다는 것입니다 . 현재 설정에서 명령 줄에서 플러그인을 호출하면 다음과 같이 작동합니다.

$ mvn exec : exec
[정보] 프로젝트 검색 중 ...
[정보] ----------------------------------------------- -------------------------
[정보] 건물 Q3491937
[정보] 작업 세그먼트 : [exec : exec]
[정보] ----------------------------------------------- -------------------------
[정보] [exec : exec {execution : default-cli}]
[정보] 노트북
[정보] ----------------------------------------------- -------------------------
[정보] 빌드 성공
[정보] ----------------------------------------------- -------------------------
...

전역 configuration이 사용되고 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 컴파일
[정보] 프로젝트 검색 중 ...
[정보] ----------------------------------------------- -------------------------
[정보] 건물 Q3491937
[정보] 작업 세그먼트 : [컴파일]
[정보] ----------------------------------------------- -------------------------
[정보] [자원 : 자원 {실행 : 기본 자원}]
[정보] 'UTF-8'인코딩을 사용하여 필터링 된 리소스를 복사합니다.
[정보] 존재하지 않는 resourceDirectory / home / pascal / Projects / Q3491937 / src / main / resources 건너 뛰기
[정보] [컴파일러 : 컴파일 {실행 : 기본 컴파일}]
[정보] 컴파일 할 항목이 없습니다. 모든 클래스가 최신 상태입니다.
[정보] [exec : exec {execution : some-execution}]
[정보] 노트북
[정보] ----------------------------------------------- -------------------------
[정보] 빌드 성공
[정보] ----------------------------------------------- -------------------------
...

configuration내부를 지정할 수 있습니다 execution.


[오류] 빌드 오류 [정보] ------------------------------------------ ------------------------------ [정보] 'exec : exec'에 대해 하나 이상의 필수 플러그인 매개 변수가 유효하지 않거나 누락되었습니다. 0] 플러그인 'exec-maven-plugin'정의 내에서 다음을 지정하십시오. <configuration> ... <executable> VALUE </ executable> </ configuration>-또는-명령 줄에서 '-Dexec. executable = VALUE '지금이 오류가 발생합니다.
NareshKumar 2010 년

2
@ gnash-85 : 아직도 당신이 뭘하는지 모르겠어요. 제공된 정확한 스 니펫 사용했으며 위에 표시된대로 문제가 없었습니다. maven을 호출하는 방법 (및 변경 한 경우 현재 구성이 무엇인지)을 보여주기 위해 질문을 업데이트하십시오.
Pascal Thivent

동일한 코드를 자식 모듈에 넣었습니다. 그리고 부모 pom.xml에서 mvn exec : exec를 실행하려고합니다. 그리고이 오류가 발생합니다. 그러나 내가 개별적으로 실행하면 작동합니다.
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 2016

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이 무언가를 실행하고 싶을뿐입니다. compile / package / ... npm startmaven 으로 실행하고 싶다고 말하면 아래에서 얻을 수 있습니다.

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

감사! 토머 벤 데이비드. 그것은 나를 도왔다. npm install을 언급했듯이 데모 폴더에 pip 설치를 수행하고 있습니다.

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