developer tip

상위 모듈이 아닌 하위 모듈에서 Maven 플러그인 목표를 실행합니다.

optionbox 2020. 12. 2. 08:29
반응형

상위 모듈이 아닌 하위 모듈에서 Maven 플러그인 목표를 실행합니다.


다중 모듈 프로젝트에서 부모 프로젝트가 아닌 모든 하위 모듈에서 플러그인 목표를 실행하도록 지정하려면 어떻게해야합니까? <pluginManagement>있지만 실행을위한 구성 만 정의합니다. 하위 모듈은 여전히 ​​목표를 실행하기 위해 플러그인을 참조해야합니다.

[...] 그러나 이것은 자식의 plugins 요소 내에서 실제로 참조되는 플러그인 만 구성합니다. ( POM 참조 )

이것을 달성하는 다른 방법이 있습니까?

업데이트 : Pascal의 조언에 따라 이것을 시도했습니다.

<!-- ... -->
<packaging>pom</packaging>
<modules>
  <module>child</module>
</modules>

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<!-- ... -->

jar목표가 integration-test단계에 묶여 있어도 상위 프로젝트에 대한 .jar을 생성합니다 .


기본 수명주기 바인딩 에 따르면 패키징에 대한 바인딩 pom은 다음과 같습니다.

기본 라이프 사이클 바인딩-pom 패키징

패키지 사이트 : 첨부 설명자  
설치 설치 : 설치  
배포 배포 : 배포

따라서 부모 POM에 <packaging>pom<packaging>(주석에서 지적한 것과 같은 경우) 플러그인을 위의 단계가 아닌 다른 단계에 바인딩하는 경우 (전체 목록 수명주기 참조 참조 ) 동안 실행되지 않습니다. 부모 POM의 빌드.

(편집 : 내 초기 대답은 틀 렸습니다. 플러그인 목표를 특정 단계에 바인딩 하면 프로젝트 패키징에 관계없이 해당 단계 중에 트리거됩니다. 기본 수명주기 바인딩 은 그와 관련이 없습니다. , 그것들은 단지 기본 라이프 사이클 바인딩입니다. 중요한 것은 플러그인이 바인딩되는 단계가 빌드 라이프 사이클의 일부인 경우입니다 .)

지적했듯이 pluginManagement플러그인 구성을 위해 부모 pom에서을 사용할 수 있지만 부모가 아닌 자식 모듈에서 플러그인 목표를 실제로 실행하려는 경우 (이를 수행해야 할 이유가 있지만 대부분의 경우 , 플러그인은 pom내용이없는 패키징이 있는 모듈에 많은 영향 을주지 않습니다 plugins.) 하위 요소의 플러그인을 참조해야합니다 .

예제에 적용하면 상위 pom.xml은 다음 사양을 정의 할 수 있습니다.

<project>
  <packaging>pom</packaging>
  ...
  <modules>
    <module>child</module>
  </modules>
  ...
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.2</version>
          <executions>
            <execution>
              <id>my-execution-id</id>
              <phase>integration-test</phase>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        ...
      </plugins>
    </pluginManagement>
  </build>
  ...
</project>

그리고 모든 어린이에게는 pom.xml다음 사항 만 필요합니다.

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
    </plugins>
    ...
  </build>
</project>

플러그인 관리와 함께 설명 된 솔루션은 확실히 정확하지만 어떤 경우에는 적합하지 않습니다. 실행마다 자체 설정 (구성)으로 구성된 하위 모듈에서 여러 jar : jar 목표를 실행한다고 가정합니다. 또는 일반적으로 자식 poms가 플러그인을 명시 적으로 트리거하도록 강제하지 않으려는 경우.

이 경우 나를 위해 일한 솔루션은 특정 프로필 아래의 부모 pom에서 실행을 정의하고 예를 들어 일부 파일 또는 속성의 존재를 확인하여 자식 poms에서만 활성화되도록하는 것이 었습니다.

<profile>
    <id>generate-dc</id>
    <activation>
        <file>
            <exists>src/main/assembly/some.xml</exists>
        </file>
    </activation>

그런 다음 플러그인은 부모에서 실행되지 않지만 파일이 포함되어 있거나 일부 속성을 설정하면 모든 자식에서 실행됩니다.


부모 POM이 아닌 자식에서 일부 플러그인을 실행하는 비슷한 요구 사항이 있습니다. 나는 <skip>true</skip>부모 POM 에 진술함으로써 이것을 달성했습니다 .

상위 pom 항목은 다음과 같습니다.

<plugin>
    <groupId>eviware</groupId>
    <artifactId>maven-soapui-plugin</artifactId>
    <version>4.0.0</version>
    <inherited>false</inherited>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
        </dependency>
    </dependencies> 
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin> 

하위 프로젝트 pom 항목은 다음과 같습니다.

<plugins>
    <plugin>
        <groupId>eviware</groupId>
        <artifactId>maven-soapui-plugin</artifactId>
        <version>4.0.0</version>
        <configuration>
            <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile>
            <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile>
            <outputFolder>site-service-web/target/surefire-reports</outputFolder>
            <junitReport>true</junitReport>
            <exportwAll>true</exportwAll>
            <printReport>true</printReport>
        </configuration>
    </plugin>
</plugins>

이 구성은 나를 위해 일했습니다. 부모 및 자식 pom 모두에 플러그인을 추가하십시오.

부모의 :

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <inherited>true</inherited>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
      <configuration>
         <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

아이

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <inherited>false</inherited>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
      <configuration>
         <skip>false</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

사용 <inherited>false</inherited>부모 프로젝트의 플러그인 섹션에서.

자세한 내용 이 페이지 를 참조하십시오.


Pascal의 답변을 시도했지만 작동하지 않았습니다. 자식 pom에서 참조 된 플러그인이 실행되지 않았습니다. 빌드 단계 바인딩이 없었기 때문이라고 가정합니다.

이 게시물은 플러그인을 실행 ID 및 빌드 단계에 바인딩하여 작동하는 솔루션을 설명합니다. 기본 바인딩을 Maven 플러그인의 단계로 재정의하는 방법

이 작업을 수행하려는 다른 사람에게 권장합니다.

참고URL : https://stackoverflow.com/questions/1625492/execute-maven-plugin-goal-on-child-modules-but-not-on-parent

반응형